****
我的代码:
可以帮忙看一下,有错误看不出来,希望可以解说的简单具体一点
第一个问题是,输入的时候只调用了一次malloc函数,导致第2个数据以及后面的都没有分配内存,出现段错误。
第二个问题是,没有保存链表的头节点,导致f1=f1->next;后就找不到f1原来指向的内存了,造成内存泄漏。
第三个问题……这个合并……我直接把我写好的有序链表合并的代码发了吧:
void lmerge(List *h, List h1, List h2) {//将以h1和h2为头节点的链表合并,注意h、h1和h2不是空头
struct Node h3, *p, *q, *t;//这个h3是空头
t = &h3;
for (p = h1, q = h2; p != NULL && q != NULL;) {
if (p->Data<= q->Data) {
t->Next = p, t = p, p = p->Next;
} else {
t->Next = q, t = q, q = q->Next;
}
}
while (p != NULL) t->Next = p, t = p, p = p->Next;
while (q != NULL) t->Next = q, t = q, q = q->Next;
t->Next = NULL;
*h = h3.Next;
}
第四个问题是,你的链表输出是个死循环,因为没有将f3指向下一个节点,输出的始终是同一个节点的数据。
修改后的全部代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int Data;
struct Node *Next;
}node,*List;
void lmerge(List *h, List h1, List h2) {//将以h1和h2为头节点的链表合并,注意h、h1和h2不是空头
node h3, *p, *q, *t;//这个h3是空头
t = &h3;
for (p = h1, q = h2; p != NULL && q != NULL;) {
if (p->Data<= q->Data) {
t->Next = p, t = p, p = p->Next;
} else {
t->Next = q, t = q, q = q->Next;
}
}
while (p != NULL) t->Next = p, t = p, p = p->Next;
while (q != NULL) t->Next = q, t = q, q = q->Next;
t->Next = NULL;
*h = h3.Next;
}
int main() {
int n;
List h1,h2,t1,t2;
t1=h1=(List)malloc(sizeof(node));
t2=h2=(List)malloc(sizeof(node));
for(scanf("%d",&n);n!=-1;scanf("%d",&n)){
t1->Next=(List)malloc(sizeof(node));
t1->Next->Data=n;
t1=t1->Next;
}
t1->Next=NULL;
t1=h1->Next;
free(h1);
h1=t1;
for(scanf("%d",&n);n!=-1;scanf("%d",&n)){
t2->Next=(List)malloc(sizeof(node));
t2->Next->Data=n;
t2=t2->Next;
}
t2->Next=NULL;
t2=h2->Next;
free(h2);
h2=t2;
lmerge(&h1,h1,h2);
if(h1==NULL)printf("NULL");
for(t1=h1;t1!=NULL;t1=t1->Next){
printf("%d ",t1->Data);
}
return 0;
}