C语言中如何用free清除一串链表
我看的Cprime里面用的是这样的语句;current=head;while(current!=NULL){free(current);current=current->...
我看的C prime里面用的是这样的语句;
current = head;
while(current!=NULL)
{free(current);
current = current->next;
}
但是我有个问题,在free了current指向的节点之后,那current不就悬空了?哪来的current-〉next?
然后再编程中,发现了这样的问题。
要求的功能是循环输入创建链表,然后编一个函数insert(node *h,int a,int pos),即在第pos个后面插入一个新节点,内容是a,如果pos==0,那么插在表头。
程序如下:
#include <stdio.h>
#include <stdlib.h>
struct Node{
int con;
Node *next;
};
void insert(Node *h,int a,int pos)
{Node *p=(Node *)malloc(sizeof(Node));
Node *pt=h;
if (pos==0) {
p->con=a;
p->next=h;
h=p;}
else{
for(int i=1;i<pos;i++){
pt=pt->next;}
p->con=a;
p->next=pt->next;
pt->next=p;}
}
int main()
{int i;
int count=0;
puts("Enter num");
scanf("%d",&i);
Node *p=( Node *)malloc(sizeof( Node));
Node *head=p;
p->next=NULL;
p->con=i;
Node *c=head;
puts("Next one,nonnum to stop"); //非数字停止
while(scanf("%d",&i)==1)
{fflush(stdin);
p=(struct Node*)malloc(sizeof(struct Node));
p->con=i;
c->next=p;
p->next=NULL;
c=p;
puts("Next one,nonnum to stop");
}
fflush(stdin);
int a,pos; //调用插入函数
puts("insert a at pos");
scanf("%d %d",&a,&pos);
insert(head,a,pos);
c=head;
while(c!=NULL) //输出
{printf("%d %d\n",count,c->con);
count++;
c=c->next;
}
c=head; //释放内存
while(c!=NULL);
{free(c);
c=c->next;
}
return 0;
}
结果有两个问题,第一个就是开头所讲的一旦有最后一段释放内存的代码,就会死循环(也就是不出现press any key to continue),如果注释掉释放内存的代码,就正常?
第二个pos==1,2,……(不超过节点数)都正常的,但是pos==0的时候就没有实现在表头插入? 展开
current = head;
while(current!=NULL)
{free(current);
current = current->next;
}
但是我有个问题,在free了current指向的节点之后,那current不就悬空了?哪来的current-〉next?
然后再编程中,发现了这样的问题。
要求的功能是循环输入创建链表,然后编一个函数insert(node *h,int a,int pos),即在第pos个后面插入一个新节点,内容是a,如果pos==0,那么插在表头。
程序如下:
#include <stdio.h>
#include <stdlib.h>
struct Node{
int con;
Node *next;
};
void insert(Node *h,int a,int pos)
{Node *p=(Node *)malloc(sizeof(Node));
Node *pt=h;
if (pos==0) {
p->con=a;
p->next=h;
h=p;}
else{
for(int i=1;i<pos;i++){
pt=pt->next;}
p->con=a;
p->next=pt->next;
pt->next=p;}
}
int main()
{int i;
int count=0;
puts("Enter num");
scanf("%d",&i);
Node *p=( Node *)malloc(sizeof( Node));
Node *head=p;
p->next=NULL;
p->con=i;
Node *c=head;
puts("Next one,nonnum to stop"); //非数字停止
while(scanf("%d",&i)==1)
{fflush(stdin);
p=(struct Node*)malloc(sizeof(struct Node));
p->con=i;
c->next=p;
p->next=NULL;
c=p;
puts("Next one,nonnum to stop");
}
fflush(stdin);
int a,pos; //调用插入函数
puts("insert a at pos");
scanf("%d %d",&a,&pos);
insert(head,a,pos);
c=head;
while(c!=NULL) //输出
{printf("%d %d\n",count,c->con);
count++;
c=c->next;
}
c=head; //释放内存
while(c!=NULL);
{free(c);
c=c->next;
}
return 0;
}
结果有两个问题,第一个就是开头所讲的一旦有最后一段释放内存的代码,就会死循环(也就是不出现press any key to continue),如果注释掉释放内存的代码,就正常?
第二个pos==1,2,……(不超过节点数)都正常的,但是pos==0的时候就没有实现在表头插入? 展开
4个回答
展开全部
#include <stdio.h>
#include <stdlib.h>
struct Node{
int con;
Node *next;
};
Node* insert(Node *h,int a,int pos)//这里,增加返回类型
{
Node *p=(Node *)malloc(sizeof(Node));
Node *pt=h;
if (pos==0)
{
p->con=a;
p->next=h;
h = p;
}
else
{
for(int i=1;i<pos;i++)//这里,如果pos值输入大于节点个数,会导致越界,自己修改
{
pt=pt->next;
}
p->con=a;
p->next = pt->next;
pt->next=p;
}
return h;//这里,返回地址
}
int main()
{
int i;
int count=0;
puts("Enter num");
scanf("%d",&i);
Node *p=( Node *)malloc(sizeof( Node));
Node *head=p;
p->next=NULL;
p->con=i;
Node *c=head;
puts("Next one,nonnum to stop");
while(scanf("%d",&i)==1)
{
fflush(stdin);
p=(struct Node*)malloc(sizeof(struct Node));
p->con=i;
c->next=p;
p->next=NULL;
c=p;
puts("Next one,nonnum to stop");
}
fflush(stdin);
int a,pos;
puts("insert a at pos");
scanf("%d %d",&a,&pos);
head = insert(head,a,pos);//这里,地址传出来
c=head;
while(c!=NULL)
{
printf("%d %d\n",count,c->con);
count++;
c=c->next;
}
c=head;
Node *tmp;
while(c!=NULL)//here,多了个分号,内存释放需要改
{
tmp = c;
c=c->next;
free(tmp);
}
return 0;
}
追问
这样清除内存确实可以,但是为什么C Prime会那么写?
毕竟C prime plus 是很经典的教材,而且国外的的教程错误很少的,难道是它真的写错了?
追答
书上也不完全错,准确地说,这样写不好。一个指针被free之后,只是标记它所指向的内存可以再分配,并没有清空这个指针里面的数据。也就是说,该指针还是可以被访问的,但是有很大的危险性。因为那时该内存是未定义的。所以一般的做法是free一个指针,然后将其置为NULL。
2014-03-10
展开全部
使用循环一个一个结点free掉,别想着贪方便直接free头结点就完事
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void ListClear(LinkList head) {
LinkList q,p = head;
while(p) {
q = p;
p = q->next;
free(q);
}
head = NULL:
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询