1. 程式人生 > >c++之連結串列篇1:單向連結串列的建立,列印,刪除,插入,銷燬等基本操作

c++之連結串列篇1:單向連結串列的建立,列印,刪除,插入,銷燬等基本操作

在牛客網上刷題的過程遇到很多連結串列的問題,所以自己又結合著傳智播客上的視訊把連結串列整理了一下得意

#include <iostream>
using namespace std;
//連結串列的的結點
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};
//建立一個單向連結串列
ListNode* list_Create()
{
	ListNode* pHead,*pCurrent,*pNew;
	int data;								// 不斷輸入的資料
	pHead = new ListNode(0);
	pCurrent = pHead;
	cin>>data;
	while(data != -1)
	{
		pNew = new ListNode(data);			//1.建立新節點
		pCurrent->next = pNew ;				//2.插入新節點
		pCurrent = pNew ;					//3.讓新節點變成當前節點
		cin>>data;

	}
	return pHead->next;						//因為上面程式碼中的標頭檔案不是輸入資料,只是為了方便操作
} 
//列印單向連結串列
void list_Print(ListNode* pHead)
{
	ListNode* tem ;
	if(pHead == NULL)
		return ;
	tem = pHead ;							//養成好習慣:對傳入的資料用另外一個臨時變數接住
	while(tem)
	{
		cout<<tem->val<<"	";
		tem = tem->next;
	}
	cout<<endl;
}
//插入單向連結串列
ListNode *list_Insert(ListNode* pHead,int x,int y)//在連結串列中值為x的結點後面插入y值的新節點
{
	if(pHead == NULL)
		return NULL;
	ListNode *pCurrent,*pNew;
	pCurrent = pHead ;
	pNew = new ListNode(y);
	while(pCurrent)
	{
		if(pCurrent->val == x)
			break;
		pCurrent = pCurrent->next;
	}
	pNew->next = pCurrent->next ;//在單向連結串列中,一定要注意當前節點的位置存放在前面結點的next域中
	pCurrent->next = pNew ;		 //所以賦值的過程中是從後面的結點向前面的結點賦值的,而且指標指向誰,就賦給誰
	return pHead ;
}
//刪除單向連結串列中的值為data的結點
ListNode* listDelete(ListNode* pHead,int data)
{
	if(pHead == NULL)
		return NULL;
	ListNode* pPre,*pCurrent ;
	pPre = pHead ;
	pCurrent = pPre->next ;
	//pNew = new ListNode(data);
	while(pCurrent)
	{
		if(pCurrent->val == data )
			break;
		pPre = pCurrent;
		pCurrent = pCurrent->next;
	}
	if(pCurrent == NULL)
		cout<<"未能找到值為:"<<data<<"的結點"<<endl;
	else
	{
		pPre->next = pCurrent->next ;
		delete pCurrent;
	}
	return pHead;
}
//單向連結串列的銷燬
int listDestory(ListNode* pHead)
{
	if(pHead == NULL)
		return 0;
	ListNode *tem = NULL;
	while(pHead)
	{
		tem = pHead->next;
		delete pHead;
		pHead = tem;
	}
	return 0;
}
int  main()
{
	//新建連結串列測試
	ListNode* node = list_Create();
	//列印連結串列測試
	list_Print(node);


	//插入連結串列測試
	//ListNode* node5 = list_Insert(node ,10,999);
	//list_Print(node5);


	//刪除連結串列測試
	//ListNode* node6 = listDelete(node,20);
	//list_Print(node6);

	//銷燬連結串列測試
	int node7 = listDestory(node);

   return 0;
}