【问题描述】学习链表,销毁链表总感觉没有成功,请问怎么确定链表确实被销毁了?为什么其余节点的内容没有变化?
【代码】
#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;
}
【运行结果】