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;
}
運行結果:

