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('\n'); printf("即將銷毀鏈表,請按任意鍵確認!"); getchar(); destoryLinkList(&List2); if (List2 == NULL) { printf("鏈表已被銷毀!"); }else { while ( List2 != NULL ) { printf("%c" , List2->date); List2 = List2->next; } } return 0; }
運行結果: