- 假设有两个按元素值递增次序排列的线性表,均以单链表形式存储,编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,要求利用原来两个单链表的结点存放归并后的单链表
void MergeList(Listlist &La, Listlist &Lb){
// pa指向链表A的第一个结点,pb指向A的第一个结点,链表A指控,作为结果链表
// 同步遍历链表A和B,比较大小,将较小的的结点头插法插入到链表A中,较小的链表后移指针
// 在同步遍历结束后,较长的链表未遍历的部分,头插法插入到链表A中
LNode *r, *pa = La->next, *pb = Lb->next;
La->next = NULL;
while(pa != NULL && pb != NULL){
if(pa->data <= pb->data){
r = pa->next;
pa->next = La->next;
La->next = pa;
pa = r;
}else{
r = pb->next;
pb->next = La->next;
La->next = pb;
pb = r;
}
}
if(pa != NULL){
pb = pa;
}
while(pb != NULL){
r = pb->next;
pb->next = La->next;
La->next = pb;
pb = r;
}
free(Lb);
}
- 设A和B是两个链表(带头结点),其中元素递增有序。设计一个算法从A和B中公共元素产生单链表C,要求不破坏A、B的结点
void create_C(Linklist A, Listlink B){
LNode *pa = A->next, *pb = B->next, *r, *s;
Linklist C = (Linklist)malloc(sizeof(LNode));// 建立表C
r = C;
while(pa != NULL && pb != NULL){
if(pa->data == pb->data){
s = (LNode*)malloc(sizeof(LNode));
s->data = pa->data;
r->next = s;
r = s;
pa = pa->next;
pb = pb->next;
}else if(pa->data > pb->data){
pb = pb->next;
}else{
pa = pa->next;
}
}
r->next = NULL;// 尾指针为空
}