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的时候就没有实现在表头插入?
展开
 我来答
hubing_hust
推荐于2017-11-26 · TA获得超过379个赞
知道小有建树答主
回答量:148
采纳率:0%
帮助的人:132万
展开全部
#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。
mafangsan
推荐于2016-01-24 · TA获得超过1.2万个赞
知道大有可为答主
回答量:1万
采纳率:71%
帮助的人:2538万
展开全部
清除链表是需要两根指针前后走的,可以看成是一个“过河拆桥”的过程
1)首先让两个指针p,q指向链表头
2)然后让p指向q的next;
3)free掉q所指向的节点;
4)q指向p;
5)判断p是否为空,如果空,结束循环,否则转2)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-03-10
展开全部
使用循环一个一个结点free掉,别想着贪方便直接free头结点就完事
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xoaxa
2015-05-28 · TA获得超过8608个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3435万
展开全部
void ListClear(LinkList head) {
LinkList q,p = head;
while(p) {
q = p;
p = q->next;
free(q);
}
head = NULL:
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式