1、使用pTemp保存頭節點的指針域(第二個節點的首地址),
2、刪除(free)頭節點,
3、再將pTemp傳給新的pHead進而指向新的頭節點。
/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2020年3月19日
*版本號:v1.0
*
*問題描述:生成一條包含5個節點的單向鏈表,然後從頭部開始依次刪除,直至刪除全部節點
*輸入描述:
*程序輸出:
*備註:
思考如何
*1)獲取鏈表中指定元素的位置;
*2)獲取單鏈表中結點個數;
*3)鏈表插入or刪除
*4)兩個鏈表的合併
*5)鏈表倒置
*6)遍歷鏈表
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Node
{
char name[32];
Node *next;
};
//創建一條鏈表,擁有N個節點,尾插法
Node * CreateList(int N)
{
Node *pHead = NULL;//始終指向第一個節點的首地址,沒有節點存在時爲NULL
Node *pTail = NULL;//始終指向最後一個節點的首地址,沒有節點存在時爲NULL
for (size_t i = 0; i < N; i++)
{
Node * pNode = (Node *)malloc(sizeof(Node));//節點生成公式!!!!!pNode爲指向所生成的節點的指針
sprintf(pNode->name, "學生%d", i+1);//把格式化的數據寫入某個字符串緩衝區
pNode->next = NULL;
if (pHead == NULL)//如果是第一個節點
{
pHead = pNode;
}
else
{
pTail->next = pNode;
}
pTail = pNode;
}
return pHead;//返回鏈表頭結點的指針
}
//打印一條鏈表
void PrintList(Node *pHead)
{
while (pHead!=NULL)
{
printf("%s ", pHead->name);
pHead = pHead->next;//pHead的改變不影響實參,因爲是參數的拷貝
}
printf("\n");
}
//刪除鏈表的頭節點
Node * DeleteHead(Node *pHead)
{
if (pHead == NULL) return NULL;//最後一個節點被刪除時,返回NULL
Node *pTemp = pHead->next; //pTemp指向第二個節點,便於下一步新的pHead
printf("釋放內存前,pHead的值: %p , pHead->next的值: %p\n",pHead, pHead->next);
free(pHead); //釋放頭結點的內存
if (pTemp == NULL) return NULL;//最後一個節點被刪除時pTemp==NULL,pTemp->next會報錯!!!因此進行限制
printf("釋放內存後,pTemp的值: %p , pTemp->next的值: %p\n",pTemp, pTemp->next);
//此刻,pHead指向的內存已經釋放, 內存中的next已經是無效值了
pHead = pTemp;//通過pTemp,讓頭結點指針指向第二個節點
return pHead;
}
int main()
{
Node *pHead= CreateList(5);//生成鏈表
PrintList(pHead);//打印鏈表
pHead = DeleteHead(pHead);//刪除第一個節點
PrintList(pHead);//打印鏈表
pHead = DeleteHead(pHead);//刪除第一個節點
PrintList(pHead);//打印鏈表
pHead = DeleteHead(pHead);//刪除第一個節點
PrintList(pHead);//打印鏈表
pHead = DeleteHead(pHead);//刪除第一個節點
PrintList(pHead);//打印鏈表
pHead = DeleteHead(pHead);//刪除第一個節點
PrintList(pHead);//打印鏈表
pHead = DeleteHead(pHead);//刪除第一個節點
PrintList(pHead);//打印鏈表
return 0;
}