我想问一个有关C语言链表的问题

来源:百度知道 编辑:UC知道 时间:2024/06/06 07:23:34
大家帮我看下。为啥我一运行前面都操作正常,最后也能得到结果,可是得出结果后系统就自动跳出来。我用的是VC6编译器

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct file{
char name[30];
int num;
struct file *next;
};
int main(void)
{
struct file *head=NULL;
struct file *mid,*mir;
char input[30];
while(gets(input)!=NULL&&input[0]!='\0')
{
mid=(struct file*)malloc(sizeof(struct file));
if(head==NULL)
head=mid;
else
mir->next=mid;
mid->next=NULL;
strcpy(mid->name,input);
printf("please enter num");
scanf("%d",&mid->num);
while(getchar()!='\n')
continue;
mir=mid;
}
if(head==NULL)
printf("no data\n");
else
printf("list:\n");
mid=head;
while(mid!=NULL)
{
printf("%s and %d\n",mid->name,mi

最后释放空间的函数有问题!

while(mid!=NULL)
{
free(mid); //free掉mid后mid->next就不存在了,所以出错
mid=mid->next;
}

改成:
struct file *mid2;
mid2=(struct file*)malloc(sizeof(struct file));
while(mid!=NULL)
{
mid2=mid->next;
free(mid);
mid=mid2;
}
其中mid2是一个临时指针

这里一段做法有问题了:

mid=head;
while(mid!=NULL)
{
free(mid);
mid=mid->next;
}

这里一段中, free(mid)后 mid所指向的结点就被回收了,mid->引用的东西是不可预测的。应该这样写

file *temp;
mid=head;
while(mid!=NULL)
{
temp=mid;
mid=mid->next;
free(temp);
}