刪除單向鏈表的頭節點

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章