yuchu3d 2022-04-07 10:06 采纳率: 82.8%
浏览 189
已结题

C语言 链表清空的问题

在学习C语言 链表的时候,遇到一个问题 比较困惑,请看如下:

程序就是 创建一个 带头结点的链表 打印出来 再清空链表,在清空的时候 遇到一个不理解的问题:

程序:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <malloc.h>

#define  Array_length   40 

typedef struct  node 

{
    int list_length;
    
    char name[Array_length];
    
    int score;
    
    struct node  *next;
} Node;

typedef Node * List;

List createList(int length);      // 创建一个具有length个结点的链表 

void printList(List header);      //打印链表 

void freeList(List header);

char *s_gets(char *restal,int n);

int main(void)

{
    List Class_6_student;
    
    int list_length;
    
    printf("Please enter the length of the list you will create : \n");
    
    scanf("%d",&list_length);
    
    while(getchar()!='\n') ;
    
    Class_6_student=createList(list_length);
    
    printList(Class_6_student);    
    
    printf("Now the list will be free. \n");
    
    freeList(Class_6_student);
    
    if(Class_6_student==NULL)  printf("Free Success! \n");  //这一步总是出不来,好像是 虽然释放了结点,但是并不是完全为空 
    
    return 0;
    
    
}

List createList(int length)

{
    List header=NULL;
    
    List newnode=NULL;
    
    List tailnode=NULL; //定义头结点  新结点  尾结点
    
    int i;
    
    header=(List) malloc(sizeof(Node));
    
    if(header==NULL)  exit(-1);
    
    header->list_length=0;
    
    header->next=NULL;
    
    tailnode=header;
    
    for(i=0;i<length;i++)
    
    {
        newnode=(List)malloc(sizeof(Node));
        
        if(newnode==NULL) exit(-1);
        
        printf("Please enter the name  of NUMBER %d student : \n",i+1);
        
        s_gets(newnode->name,Array_length);
        
        printf("Please enter the score of NUMBER %d student : \n",i+1);
        
        scanf("%d",&newnode->score);
        
        while(getchar()!='\n') ;
        
        newnode->next=NULL;
        
        tailnode->next=newnode;
        
        tailnode=newnode;
        
        header->list_length++;    
        
    }
     
    return header;
    
}


char *s_gets(char *restal,int n)

{
    char *pt;
    
    int i=0;
    
    pt=fgets(restal,n,stdin);
    
    if(pt)
    
    {
        while(restal[i]!='\0'&&restal[i]!='\n') i++;
    
        if(restal[i]=='\n') restal[i]='\0';
    
        else 
    
        while(getchar()!='\n') continue;
    }
    
    
    return pt;    
}

void printList(List header)

{
    List temp;
    
    int i;
    
    temp=header->next;
    
    printf("There are %d student information in this list, which as follow :\n",header->list_length);
    
    while(temp!=NULL) 
    
    {
        i=1;
        
        printf("************\n");
        
        printf("NUMBER %d      %-20s     %d  \n ",i,temp->name,temp->score);
        
        printf("************\n");
        
        i++;
        
        temp=temp->next;    
        
    }    
}

void freeList(List header)

{
    List plist=NULL;
    
    int i=0;
    
    while(header!=NULL)
    
    {
        plist=header;
        
        header=header->next;
        
        free(plist);    
        
        printf("NOW number %d node was free! \n",i++);    
    }
}

不明白的地方 就是 这一步:
freeList(Class_6_student);

if(Class_6_student==NULL)  printf("Free Success! \n");  //这一步总是出不来,好像是 虽然释放了结点,但是并不是完全为空 

printf("Free Success! \n"); 这一步总是不会执行,说明 Class_6_student 链表不为空,可是我已经清空了啊,

因为 while(header!=NULL) (freeList(List header) 函数中) 这一步能够执行完,说明 链表就是NULL了, 为什么到这里 又执行不出来呢?

  • 写回答

8条回答 默认 最新

  • 一夜奈良山️ 2022-04-07 13:27
    关注

    你好,这个问题其实是你free函数没有掌握好,free的确是会释放掉开辟的空间的,但是他并不会把指向那块空间的指针置为空指针的,也就是说我们在free一块空间的时候都需要将那块空间的指针进行手动的置为空指针的,这是一个重要的良好习惯。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 4月17日
  • 已采纳回答 4月9日
  • 赞助了问题酬金5元 4月7日
  • 创建了问题 4月7日

悬赏问题

  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行