user-0 提问: 合成两个有序链表不知道错在哪里，求高手帮忙！

回复:
user: user-0
content: 引用 1 楼 user-3 的回复: linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  您好，刚才我在想这个together函数里其实不用给L3重新开辟一个空间，直接让L3指向L1的头结点，这样似乎也是可以的？

user: user-0
content: 引用 3 楼 adusuccessfully 的回复: 	//谁的值更小就将它赋给L3 	//两个链表总会有一个先空，下面判断是哪个链表先空的 	if(p1==NULL) 	{ 		p3->next=p2; 		free(L1);L1=NULL; 	} 	if(p2==NULL) 	{ 		p3->next=p1; 		free(L2);L2=NULL; 	}//将L3连接到没空的那个链表头上，再释放掉另一个链表 	return L3; }   您好，我刚刚一直在想，together这个函数里面要是把L1，L2都给free了，等会儿回到主函数的时候还怎么输出啊、

user: user-0
content: 引用 7 楼 user-3 的回复:[quote=引用 3 楼 adusuccessfully 的回复:] LZ写程序的时候可能复制粘贴，粘贴后忘修改了~~ 我在楼上修改的基础上，增加了考虑重复的情况，修改比较简单！！ 楼上的修改为什么要给main函数中加一个  while(1);的死循环呢？？  #include <stdio.h> #include <stdlib.h> typedef struct node { 	int data; 	struct node* next; }lnode,*linklist;  linklist list_create(int n); void list_print(linklist L); linklist list_together(linklist L1,linklist L2);  int main() { 	linklist L1=list_create(3); 	linklist L2=list_create(3);//创建两个新的链表  	list_print(list_together(L1,L2));//输出合成后的链表 	return 0; }  linklist list_create(int n)//建立新的链表 { 	int i; 	linklist L,q,p; 	L=(linklist)malloc(sizeof(lnode)); 	if(!L)return 0; 	L->next=NULL; 	p=L; 	for(i=1;i<=n;i++) 	{ 		q=(linklist)malloc(sizeof(lnode)); 		if(!q)return 0; 		printf("Please input the NO.%d number:",i); 		scanf("%d",&q->data); 		p->next=q; 		q->next=NULL; 		p=q; 	} 	return L; }  linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  	while(p1&&p2)//将L1,L2两个链表里的值从第一个开始比较 	{ 		if(p1->data<p2->data) 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 		} 		else if(p1->data>p2->data) 		{ 			p3->next=p2;///错在这里！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！ 			p3=p3->next; 			p2=p2->next; 		} 		else 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 			p2=p2->next; 		} 	}//谁的值更小就将它赋给L3 	//两个链表总会有一个先空，下面判断是哪个链表先空的 	if(p1==NULL) 	{ 		p3->next=p2; 		free(L1);L1=NULL; 	} 	if(p2==NULL) 	{ 		p3->next=p1; 		free(L2);L2=NULL; 	}//将L3连接到没空的那个链表头上，再释放掉另一个链表 	return L3; }  void list_print(linklist L)//将合成后的链表输出 { 	linklist p=L->next;//头结点L没有数据 	while(p) 	{ 		printf("%d ",p->data); 		p=p->next; 	} }    加了它是为了防止控制台退出，一闪而过。。你要么是用vc6.0..要么是用GCC吧。。。。[/quote] 我用的codeblocks  很谢谢你的回答！

user: user-1
content: 在参考代码段中找找： http://pan.baidu.com/s/17yIcQ

user: user-2
content: LZ写程序的时候可能复制粘贴，粘贴后忘修改了~~ 我在楼上修改的基础上，增加了考虑重复的情况，修改比较简单！！ 楼上的修改为什么要给main函数中加一个  while(1);的死循环呢？？  #include <stdio.h> #include <stdlib.h> typedef struct node { 	int data; 	struct node* next; }lnode,*linklist;  linklist list_create(int n); void list_print(linklist L); linklist list_together(linklist L1,linklist L2);  int main() { 	linklist L1=list_create(3); 	linklist L2=list_create(3);//创建两个新的链表  	list_print(list_together(L1,L2));//输出合成后的链表 	return 0; }  linklist list_create(int n)//建立新的链表 { 	int i; 	linklist L,q,p; 	L=(linklist)malloc(sizeof(lnode)); 	if(!L)return 0; 	L->next=NULL; 	p=L; 	for(i=1;i<=n;i++) 	{ 		q=(linklist)malloc(sizeof(lnode)); 		if(!q)return 0; 		printf("Please input the NO.%d number:",i); 		scanf("%d",&q->data); 		p->next=q; 		q->next=NULL; 		p=q; 	} 	return L; }  linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  	while(p1&&p2)//将L1,L2两个链表里的值从第一个开始比较 	{ 		if(p1->data<p2->data) 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 		} 		else if(p1->data>p2->data) 		{ 			p3->next=p2;///错在这里！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！ 			p3=p3->next; 			p2=p2->next; 		} 		else 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 			p2=p2->next; 		} 	}//谁的值更小就将它赋给L3 	//两个链表总会有一个先空，下面判断是哪个链表先空的 	if(p1==NULL) 	{ 		p3->next=p2; 		free(L1);L1=NULL; 	} 	if(p2==NULL) 	{ 		p3->next=p1; 		free(L2);L2=NULL; 	}//将L3连接到没空的那个链表头上，再释放掉另一个链表 	return L3; }  void list_print(linklist L)//将合成后的链表输出 { 	linklist p=L->next;//头结点L没有数据 	while(p) 	{ 		printf("%d ",p->data); 		p=p->next; 	} }

user: user-3
content: 引用 6 楼 qq_23908539 的回复:[quote=引用 1 楼 user-3 的回复:]  linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  您好，刚才我在想这个together函数里其实不用给L3重新开辟一个空间，直接让L3指向L1的头结点，这样似乎也是可以的？[/quote]  都 行，只要能实现你要的功能就行了

user: user-3
content: 引用 3 楼 adusuccessfully 的回复:LZ写程序的时候可能复制粘贴，粘贴后忘修改了~~ 我在楼上修改的基础上，增加了考虑重复的情况，修改比较简单！！ 楼上的修改为什么要给main函数中加一个  while(1);的死循环呢？？  #include <stdio.h> #include <stdlib.h> typedef struct node { 	int data; 	struct node* next; }lnode,*linklist;  linklist list_create(int n); void list_print(linklist L); linklist list_together(linklist L1,linklist L2);  int main() { 	linklist L1=list_create(3); 	linklist L2=list_create(3);//创建两个新的链表  	list_print(list_together(L1,L2));//输出合成后的链表 	return 0; }  linklist list_create(int n)//建立新的链表 { 	int i; 	linklist L,q,p; 	L=(linklist)malloc(sizeof(lnode)); 	if(!L)return 0; 	L->next=NULL; 	p=L; 	for(i=1;i<=n;i++) 	{ 		q=(linklist)malloc(sizeof(lnode)); 		if(!q)return 0; 		printf("Please input the NO.%d number:",i); 		scanf("%d",&q->data); 		p->next=q; 		q->next=NULL; 		p=q; 	} 	return L; }  linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  	while(p1&&p2)//将L1,L2两个链表里的值从第一个开始比较 	{ 		if(p1->data<p2->data) 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 		} 		else if(p1->data>p2->data) 		{ 			p3->next=p2;///错在这里！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！ 			p3=p3->next; 			p2=p2->next; 		} 		else 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 			p2=p2->next; 		} 	}//谁的值更小就将它赋给L3 	//两个链表总会有一个先空，下面判断是哪个链表先空的 	if(p1==NULL) 	{ 		p3->next=p2; 		free(L1);L1=NULL; 	} 	if(p2==NULL) 	{ 		p3->next=p1; 		free(L2);L2=NULL; 	}//将L3连接到没空的那个链表头上，再释放掉另一个链表 	return L3; }  void list_print(linklist L)//将合成后的链表输出 { 	linklist p=L->next;//头结点L没有数据 	while(p) 	{ 		printf("%d ",p->data); 		p=p->next; 	} }    加了它是为了防止控制台退出，一闪而过。。你要么是用vc6.0..要么是用GCC吧。。。。

user: user-3
content: 这是不考虑重复的情况，如果考虑重复的情况还得再加个else if..然后，P1,P2同时变

user: user-3
content: #include <stdio.h> #include <stdlib.h> typedef struct node { 	int data; 	struct node* next; }lnode,*linklist;  linklist list_create(int n); void list_print(linklist L); linklist list_together(linklist L1,linklist L2);  int main() { 	linklist L1=list_create(3); 	linklist L2=list_create(3);//创建两个新的链表  	list_print(list_together(L1,L2));//输出合成后的链表 	while(1); 	return 0; }  linklist list_create(int n)//建立新的链表 { 	int i; 	linklist L,q,p; 	L=(linklist)malloc(sizeof(lnode)); 	if(!L)return 0; 	L->next=NULL; 	p=L; 	for(i=1;i<=n;i++) 	{ 		q=(linklist)malloc(sizeof(lnode)); 		if(!q)return 0; 		printf("Please input the NO.%d number:",i); 		scanf("%d",&q->data); 		p->next=q; 		q->next=NULL; 		p=q; 	} 	return L; }  linklist list_together(linklist L1,linklist L2)//合成1，2两个有序链表 { 	linklist p1,p2,p3,L3; 	p1=L1->next; 	p2=L2->next; 	L3=p3=(linklist)malloc(sizeof(lnode)); 	if(!p3)exit(1); 	L3->next=p3->next=NULL;  	while(p1&&p2)//将L1,L2两个链表里的值从第一个开始比较 	{ 		if(p1->data<=p2->data) 		{ 			p3->next=p1; 			p3=p3->next; 			p1=p1->next; 		} 		else //你这里直接用一个else。感情 		{ 			p3->next=p2;///错在这里！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！ 			p3=p3->next; 			p2=p2->next; 		} 	}//谁的值更小就将它赋给L3 	//两个链表总会有一个先空，下面判断是哪个链表先空的 	if(p1==NULL) 	{ 		p3->next=p2; 		free(L1);L1=NULL; 	} 	if(p2==NULL) 	{ 		p3->next=p1; 		free(L2);L2=NULL; 	}//将L3连接到没空的那个链表头上，再释放掉另一个链表 	return L3; }  void list_print(linklist L)//将合成后的链表输出 { 	linklist p=L->next; 	while(p) 	{ 		printf("%d ",p->data); 		p=p->next; 	} }  改好了，错在判断语句if后面的p2.....啊。。。