链表插入输出结果死循环,求解释

calvary 发布于 2014/04/01 16:51
阅读 369
收藏 0

先把代码上了. 

#include  "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#include "string.h"
typedef struct Student
{
	char name[30];
	int age;
	float height;
	struct Student * next;
}stu,*Link;
Link insert(Link head);
Link  initNode(int  n);
void  printfLInk(Link node);
//插入 链表 //当找到名字为 ghost 的就将当前节点插入 实验是表中间插入.
Link insert(Link head)
{
        Link p1,p2,p3=NULL;
	p1=(Link)malloc(sizeof(stu));
	printf("please input link data content   !!!!\n");
	scanf("%s%d%f",p1->name,&p1->age,&p1->height);
	//p2->next=NULL;
	  p2=head;
	//遍历链表..寻找合适的位置 。插入节点
	int i=0;
	int  flag=0;
	while(p2&&flag==1)
	{
		//跟踪链表 
		i++;
		
		if((strcmp(p2->name,"ghost")==0))
		{
			flag=1;
			p3=p2;	
		}
		p2=p2->next;
		printf("foreach once time-->>:  %d\n",i);
	}	
	p3->next=p1;
	p1->next=p2;
	printf("break the circle  foreach !!!!\n");
	return  head ;
}



 对c不熟. 写得不怎么好.  见笑了.. 求解释..  ?

加载中
0
freesnow
freesnow

initNode中,for循环结束的时候,curp和p是相等的,可你free curp以后却去操作p,导致其实链表最后节点的next并不是null。你为什么要free(curp)?

free(curp); 

p->next=NULL; 


但是strcmp(p2->name,"ghost")==0这个条件应该不会让while一直循环啊,应该还有其他的问题。

calvary
calvary
你说对了噢。 就是这一句 free(curp)导致的. 最后把curp->next=NULL. 就完整的出来了.. 多谢多谢!
0
0小橙子0
0小橙子0

上GDB,自己查

calvary
calvary
可是没装gdb .
0
0
gvim
gvim

int  flag=0;  while(flag==1)  能进循环吗?  

//p2->next=NULL;  为什么要注释啊?

calvary
calvary
如果不注释的话。 那插入节点后,原来后面的节点都会没有了。。
0
calvary
calvary

引用来自“gvim”的评论

int  flag=0;  while(flag==1)  能进循环吗?  

//p2->next=NULL;  为什么要注释啊?

@gvim 嘿嘿。 说的是。
  循环条件是这样的. 
  while(p2&&strcmp(p2->name,"ghost")==0)
{
//跟踪链表 
i++;
p3=p2;
p2=p2->next;
printf("foreach once time-->>:  %d\n",i);
}
 
p3->next=p1;
p1->next=p2;


是这样的。 然后就死循环了。。。 我调半天调不出,哪里有问题呢.   你再帮忙看看.呢.

0
freesnow
freesnow

死循环的话,说明你的while条件一直满足,也就是链表形成了环。不知道你的链表是怎么生成的?

calvary
calvary
我贴出来..请帮忙看看.
0
calvary
calvary

引用来自“freesnow”的评论

死循环的话,说明你的while条件一直满足,也就是链表形成了环。不知道你的链表是怎么生成的?

 Link  initNode(int  n)
{
int i; //节点个数


Link head,curp ,p; //头节点. /首节点 /  临时节点
//开始给分配空间
curp=p=(Link)malloc(sizeof(stu));
scanf("%s%d%f",curp->name,&curp->age,&curp->height);
//curp->next=NULL;
head=NULL;

// 根据传入链表的大小。 来创建节点

for(i=0;i<n;i++)
{

if(head==NULL)
{
head=curp;
}
else
{

curp =(Link)malloc(sizeof(stu));
printf("输入学生的相关信息  姓名, 年龄,身高\n");
printf("姓名:\n");
scanf("%s",curp->name);
printf("年龄:\n");
scanf("%d",&curp->age);
printf("身高:\n");
scanf("%f",&curp->height);
p->next=curp;
p=curp;

}

}
free(curp);
p->next=NULL;
return head;
}

返回顶部
顶部