怎么会是死循环呢

sinat_18564735 2014-08-03 10:01:49
//创建一个虚拟的新链表,原链表升序有序

#include <stdio.h>
#include <stdlib.h>
#define M 5
#define N 7


//定义一个含有两个域的结点
typedef struct node{
int data;
struct node *next;
}ElemSN;

ElemSN * CombineLink(ElemSN *h1,ElemSN *h2)
{
ElemSN *h=NULL,*s,*t;
while(h1&&h2)
{
if(h1->data <h2->data ) {s=t=h1;h1=h1->next ;}
else {s=t=h2;h2=h2->next ;}//确定头
s->next =NULL;
t=t->next =s;//t为新链表的尾结点
}
if(h1) t->next =h1;
else t->next =h2;//判断那个比较长,把剩余部分接到尾结点
return h;
}

//创建正向链表(尾插)
ElemSN * CreatLink1(int a[],int n)
{
ElemSN *h,*p,*t;
for(int i=0;i<N;i++)
{
p=(ElemSN *)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!i) h=t=p;//是第一个结点
else t=t->next=p;
}
return h;
}

//输出单向链表
void PrintLink(ElemSN *h)
{
ElemSN *p;
printf("\n输出的链表为:\n");
for(p=h;p;p=p->next)
printf("%5d",p->data);
printf("\n\n");
}

//主函数调用
int main(void)
{
ElemSN *head1,*head2,*head;
int a[M]={0},b[N]={0};
int i;
printf("\n请依次输入第一个链表每个结点的值:\n");
for(i=0;i<M;i++)
scanf_s ("%d",a+i);
head1=CreatLink1(a,M);
printf("\n请依次输入第二个链表每个结点的值:\n");
for(i=0;i<N;i++)
scanf_s ("%d",b+i);
head2=CreatLink1(b,N);
head=CombineLink(head1,head2);
PrintLink(head1);
return 0;
}
...全文
148 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
神奕 2014-08-04
  • 打赏
  • 举报
回复
创建链表时for(int i=0;i<N;i++) 把N改成n。另外,合并两个链表的函数中while循环没有写对。

//创建一个虚拟的新链表,原链表升序有序
#include <stdio.h>
#include <stdlib.h>
#define M 5
#define N 7

//定义一个含有两个域的结点
typedef struct node{
	int data;
	struct node *next;
}ElemSN;

ElemSN * CombineLink(ElemSN *h1,ElemSN *h2)
{
	ElemSN *h=NULL,*s;

	if(h1 && h2 && h1->data < h2->data){
		h = h1;
		s = h1;
		h1 = h1->next;
	}
	else{
		h = h2;
		s = h2;
		h2 = h2->next;
	}

	while(h1&&h2)
	{
		if(h1->data <h2->data )  
		{
			s->next = h1;
			h1 = h1->next;
			s = s->next;
		}
		else {
			s->next = h2;
			h2 = h2->next;
			s = s->next;
		} // 每次将较小的节点加入新链表中
	}
	if(h1)  s->next =h1;
	else  s->next =h2; // 判断哪个比较长,把剩余部分接到尾结点
	return h;
}

//创建正向链表(尾插)
ElemSN * CreatLink1(int a[],int n)
{
	ElemSN *h,*p,*t;
	for(int i=0;i<n;i++)
	{
		p=(ElemSN *)malloc(sizeof(ElemSN));
		p->data=a[i];
		p->next=NULL;
		if(!i) h=t=p;//是第一个结点
		else t=t->next=p;
	}
	return h;
}

//输出单向链表
void PrintLink(ElemSN *h)
{
	ElemSN *p;
	printf("\n输出的链表为:\n");
	for(p=h;p;p=p->next)
		printf("%5d",p->data);
	printf("\n\n");
}

//主函数调用
int main(void)
{
	ElemSN *head1,*head2,*head;
	int a[M]={0},b[N]={0};
	int i;
	printf("\n请依次输入第一个链表每个结点的值:\n");
	for(i=0;i<M;i++)
		scanf_s ("%d",a+i);
	head1=CreatLink1(a,M);
	printf("\n请依次输入第二个链表每个结点的值:\n");
	for(i=0;i<N;i++)
		scanf_s ("%d",b+i);
	head2=CreatLink1(b,N);
	head=CombineLink(head1,head2);
	PrintLink(head1); 
	system("pause");
	return 0;
} 

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧