躲猫猫的鱼 2019-12-21 08:51 采纳率: 0%
浏览 797

【C语言-链表】请问怎么判断链表已经被销毁?

【问题描述】学习链表,销毁链表总感觉没有成功,请问怎么确定链表确实被销毁了?为什么其余节点的内容没有变化?
【代码】

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct link_list
{
    int num;
    char name[20];
    struct link_list *next;
};
typedef struct link_list ls;

int icount = 0; /*链表长度*/
/*链表创建函数*/
ls* create()
{
   ls *phead = NULL;
   ls *pend, *pnew;
   char flag;

/*******************************************************************
 链表循环赋值
*******************************************************************/
    while(1)
    {
        pnew = (ls*)malloc(sizeof(struct link_list));/*分配空间*/
        if(pnew == NULL) /*检测内存分配情况*/
        {
            printf("内存分配失败\n");
            return NULL;
        }
        if(0 == icount)/*如果是第一个节点*/
        {
            icount++;
            pnew->next = NULL;/*尾指针指向空*/
            phead = pnew;/*头指针指向头节点*/
            pend = pnew;/*保存当前指针*/
            printf("phead=%d\n", phead);
            printf("输入姓名:\n");
            scanf("%s", pnew->name);
            printf("输入学号:\n");
            scanf("%d", &pnew->num);

            printf("是否结束输入?y结束,n继续\n");
            getchar();
            flag = getchar();
            if(flag == 'y')
            {
                return phead;
            }
        }
        else
        {
            icount++;
            pend->next = pnew;
            pend = pnew;
            pnew->next = NULL;
            printf("输入姓名:\n");
            scanf("%s", pnew->name);
            printf("输入学号:\n");
            scanf("%d", &pnew->num);

            printf("是否结束输入?y结束,n继续");
            getchar();
            flag = getchar();
            if(flag == 'y')
            {
                return phead;
            }

        }
    }
}

/*遍历输出*/
void print(ls* phead)
{
    ls* ptemp;

    ptemp = phead;
    while(NULL != ptemp)
    {
        printf("\n\n学号:%d\n姓名:%s\n", ptemp->num, ptemp->name);
        ptemp = ptemp->next;
    }
}

/*销毁*/
void damage(ls* phead)
{
    ls *ptemp1;

    do
    {
        printf("删除前节点内容%d     地址phead=%d\n", phead->num, phead);
        ptemp1 = phead->next; /*保存当前销毁节点指向的地址*/
        printf("被销毁节点指向的地址ptemp1=%d\n", ptemp1);
        free(phead); /*释放当前指针指向的节点空间*/
        printf("释放后节点内容%d\n", phead->num);
        printf("释放后phead=%d\n", phead);
        phead = ptemp1; /*获取下一个节点地址*/
        printf("重新赋值phead=%d\n\n", phead);

    }while(ptemp1 != NULL);

}

int main(void)
{
    ls* phead = NULL;
    int lcat, lcat_del;

    phead = create();
    printf("主函数头指针地址%d\n", phead);
    print(phead);
    damage(phead);

    return 0;
}

【运行结果】
图片说明
图片说明

  • 写回答

2条回答 默认 最新

  • threenewbee 2019-12-21 10:58
    关注

    free(phead);
    这里就是释放,释放只是告诉系统,这个内存现在可以重新使用了。
    但是phead指针的内容不会改变
    phead指向的内存,除非被别的内容改写,否则也不会变化。

    作为习惯,只要free就要在后面加上
    phead = NULL;

    评论

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示