假设有两个按元素值递增有序排列的线性表a和b,均以单链表作存储结构,请编写算法将a表和b表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表c,并要求利用原表(即a表和b
时间: 2023-04-25 10:04:40 浏览: 104
已知有两个按元素值递增有序的顺序表A和B,设计一个算法将表A和表B的全部元素归并为一个按元素值递增有序的顺序表C。
5星 · 资源好评率100%
表)的结点空间存放归并后的线性表c。
算法思路:
1. 定义三个指针p、q、r,分别指向a表、b表、c表的当前结点。
2. 比较p和q指向的结点的元素值,将较小的结点插入到c表的头部,并将指针后移一位。
3. 重复步骤2,直到p或q指针为空。
4. 将p或q指针剩余的结点插入到c表的头部。
5. 返回c表的头结点。
算法实现:
```
LinkList MergeList(LinkList a, LinkList b) {
LinkList c = (LinkList)malloc(sizeof(Node)); // 创建c表头结点
c->next = NULL;
Node *p = a->next, *q = b->next, *r; // 定义指针p、q、r
while (p && q) { // 当p和q指针都不为空时
if (p->data <= q->data) { // 如果p指向的元素值小于等于q指向的元素值
r = p->next; // 保存p的下一个结点
p->next = c->next; // 将p插入到c表头部
c->next = p;
p = r; // p指针后移
} else { // 如果p指向的元素值大于q指向的元素值
r = q->next; // 保存q的下一个结点
q->next = c->next; // 将q插入到c表头部
c->next = q;
q = r; // q指针后移
}
}
while (p) { // 如果p指针不为空
r = p->next; // 保存p的下一个结点
p->next = c->next; // 将p插入到c表头部
c->next = p;
p = r; // p指针后移
}
while (q) { // 如果q指针不为空
r = q->next; // 保存q的下一个结点
q->next = c->next; // 将q插入到c表头部
c->next = q;
q = r; // q指针后移
}
free(a); // 释放a表头结点
free(b); // 释放b表头结点
return c; // 返回c表头结点
}
```
阅读全文