1.首先,将*list(头指针)赋值给p,这样p也指向链表的第一个结点,成为链表的表头
2.然后判断只要p不为空,就将p指向下一个的指针赋值给q,再释放掉p
3.之后再将q赋值给p,用来找到下一轮释放掉的结点的下一个结点
代码如下:
#include<stdio.h> #include<stdlib.h> typedef struct Node { char date; struct Node *next; }Node , *LinkList; //创建链表 LinkList creat_linklist(int n) { LinkList New_node,Tail_node; LinkList Head_node = NULL; char c; for (size_t i = 0; i < n; i++) { printf("请输入在第%d个结点存入的数据:",i+1); scanf("%c",&c); fflush(stdin); New_node = (LinkList)malloc( sizeof(Node) ); New_node->date = c; New_node->next = NULL; if (Head_node == NULL) { Head_node = New_node; }else { Tail_node->next = New_node; } Tail_node = New_node; } return Head_node; } //销毁链表 void destoryLinkList(LinkList *List) { LinkList p,q; p = *List; while (p) { q = p->next; free(p); p = q; } *List = NULL; } int main() { int n; char c; LinkList List , List2; //List用于第一次打印单链表,List2用于第二次打印单链表 printf("请输入结点个数:"); scanf("%d",&n); fflush(stdin); List = creat_linklist(n); List2 = List;//复制一遍链表,第一次打印链表后链表后头指针会直接指向NULL,导致第二次打印失败 printf("打印单链表:"); while ( List != NULL ) { printf("%c" , List->date); List = List->next; } putchar(' '); printf("即将销毁链表,请按任意键确认!"); getchar(); destoryLinkList(&List2); if (List2 == NULL) { printf("链表已被销毁!"); }else { while ( List2 != NULL ) { printf("%c" , List2->date); List2 = List2->next; } } return 0; }
运行结果: