刪除單向鏈表的最後一個節點

 

 

具體操作:

1、封裝一個生成鏈表的函數(createlist),一個遍歷並打印鏈表的函數(printlist),一個刪除鏈表最後節點的函數(deletelist需要判斷是否只剩1個節點);

2、生成一個包含5個節點的單向鏈表;

3、調用5次刪除節點的函數,完成刪除,其中第五次由於只剩一個節點無法刪除。

關鍵點:

1)找到倒數第二個節點{pTemp->next->next=NULL時,確定了最後一個節點,使得pHead=pTemp,而pTemp->nex(在移位前)則是倒數第二的節點},

2)將最後一個節點所佔用的內存(堆內存)釋放掉;pTemp = pTemp->next操作使得節點發生移位,之後再free(pTemp->next)

3)將新的最後一個節點(之前的倒數第二個節點)的指針域置爲NULL(移位後的pTemp->next=NULL);

/*
*copyright(c) 2018,HH
*All rights reserved.
*作 者:HH
*完成日期:2020年3月7日
*版本號:v1.0
*
*問題描述:生成一條包含5個節點的單向鏈表,然後從尾部開始依次刪除,直至剩下頭部節點
*輸入描述:學生C
*程序輸出:學生A、學生C、學生C;。
*備註:
思考如何
*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 *   DeleteTail(Node *pHead)
{
	//需要判斷這個鏈表是否只有一個節點,不存在倒數第二個節點
	if (pHead->next == NULL)
	{
		printf("當前鏈表只有一個節點\n");
		free(pHead);//刪完後,這條鏈表一個節點也沒有了
		return  NULL;
	}


	Node *pTemp = pHead;
	//需要獲取尾部節點的前一個節點指針(因爲我們要把前一個節點的next設置爲NULL)
	
	while (pTemp->next->next!=NULL) //獲取倒數第二個節點的指針
	{
        //當前節點下一個節點的指針域不是NULL時,移位到下一個節點!!!
		pTemp = pTemp->next;//pTemp的改變不影響實參
	}

	printf("當前節點是:%s  \n", pTemp->name);

	//刪除最後一個節點的內存!!!
	free(pTemp->next);
	//將倒數第二個的next置爲NULL,讓倒數第二個變成尾節點!!!
	pTemp->next = NULL;


	return pHead;
}


int main()
{
	Node  *pHead= CreateList(5);//生成鏈表
	PrintList(pHead);//打印鏈表

	pHead = DeleteTail(pHead);//刪除最後一個節點
	PrintList(pHead);//打印鏈表

	pHead = DeleteTail(pHead);//刪除最後一個節點
	PrintList(pHead);//打印鏈表

	pHead = DeleteTail(pHead);//刪除最後一個節點
	PrintList(pHead);//打印鏈表

	pHead = DeleteTail(pHead);//刪除最後一個節點
	PrintList(pHead);//打印鏈表

	//接受新的pHead
	pHead =DeleteTail(pHead);//刪除最後一個節點
	PrintList(pHead);//打印鏈表

    return 0;
}

 

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