假设两个按元素值递增有序排列的线性表a和b,均以单链表作为存储结构,请编写算法,将a表和b表归并成一个按元素值递减有序排列的线性表c,并要求利用原表(即a表和b表的)结点空间存放表c。
时间: 2023-04-26 21:02:39 浏览: 107
算法步骤如下:
1. 定义三个指针p、q、r,分别指向a表、b表、c表的当前结点。
2. 比较p和q指向的元素值大小,将较小的元素值存入c表的当前结点,并将指向该元素的指针向后移动一位。
3. 重复步骤2,直到p或q指向的链表为空。
4. 将p或q指向的链表中剩余的元素依次存入c表的当前结点,并将指向该元素的指针向后移动一位。
5. 将c表中的元素逆序排列,即可得到按元素值递减有序排列的线性表c。
具体实现见下方代码:
void mergeList(LinkList &a, LinkList &b, LinkList &c) {
LNode *p = a->next, *q = b->next, *r;
c = a; // 将a表作为c表的头结点
c->next = NULL;
free(b); // 释放b表的头结点
while (p && q) {
if (p->data <= q->data) {
r = p->next;
p->next = c->next;
c->next = p;
p = r;
} else {
r = q->next;
q->next = c->next;
c->next = q;
q = r;
}
}
while (p) {
r = p->next;
p->next = c->next;
c->next = p;
p = r;
}
while (q) {
r = q->next;
q->next = c->next;
c->next = q;
q = r;
}
r = c->next;
c->next = NULL;
while (r) {
p = r->next;
r->next = c->next;
c->next = r;
r = p;
}
}
阅读全文