69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *pNext;
} Node, *list;
void Creat_list(list*l, int n);
void shuchu(list l);
void merge(list la, list lb, list *lc);
int main(void)
{
list la;
list lb;
list lc;
Creat_list(&la, 3);
shuchu(la);
Creat_list(&lb, 3);
shuchu(lb);
merge(la, lb, &lc);
shuchu(lc);
return 0;
}
void Creat_list(list *l, int n)
{
int a;
int i;
list q;
*l = (list)malloc(sizeof(Node));
(*l)->pNext = NULL;
for (i = n; i > 0; i--)
{
q = (list)malloc(sizeof(Node));
scanf("%d", &a);
q->pNext = (*l)->pNext;
(*l)->pNext = q;
q->data = a;
}
}
void shuchu(list l)
{
list p = l->pNext;
while (p) {
printf("%d\t", p->data);
p = p->pNext;
}
putchar(10);
}
void merge(list la, list lb, list *lc)
{
list pa;
list pb;
list pc;
pa = la->pNext;
pb = lb->pNext;
*lc = pc = la;
while (pa && pb) {
if (pa->data <= pb->data) {
pc->pNext = pa;
pc = pa;
pa = pa->pNext;
} else {
pc->pNext = pb;
pc = pb;
pb = pb->pNext;
}
}
while (pa) {
pc->pNext = pa;
pc = pa;
pa = pa->pNext;
}
while (pb) {
pc->pNext = pb;
pc = pb;
pb = pb->pNext;
}
free(lb);
}
合并算法有点问题,现已改好了,你可以跑一下试试;
1. 合并排序的参数,lb不需要传递二重指针,因为不要将lb设置为传入传出参数,只需要作为传入参数即可,并在merge函数里将其释放。或者在main函数里释放,都是可以的。
2. 合并排序时,有可能两个链表的长度不一样,那么就需要将链表较长的最后加到链表lc中。