1. 程式人生 > >c/c++ 迴圈單鏈表變迴圈雙鏈表

c/c++ 迴圈單鏈表變迴圈雙鏈表

最近遇到了一個作業題目是:

建立一個迴圈連結串列,其節點有前置,資料和下一個三個域,其中資料為資料域,存放元素的有效資訊,下一個域為指標域,指向後繼節點,之前為指標域,它的值為NULL。編寫一個演算法將此表格改為迴圈雙鏈表。

  • 建立連結串列節點結構 

連結串列節點在Ç語言建立的方法是通過結構體建立在結構體內部建立其結構本身型別的指標來實現連結串列節點,聽起來有點拗口,下面看看程式碼如何實現

簡單型

struct TheList 
{ 
	int data = 0; //資料域
	TheList * next; //指向連結串列的下一個節點
	TheList * prior; //指向連結串列的上一個節點
}; 
TheList * head = NULL; //宣告頭結點

這種是最簡單的建立結構體方法,當然簡單的同時也不是很標準,下面是標準的建立連結串列方法

標準型

typedef struct NODE  
{   
    int data; //資料域,用來存放資料域;  
    struct Node * pNext; //定義一個結構體指標,指向下一次個與當前節點資料型別相同的節點   
} NODE,* PNODE; // NODE等價於struct Node; PNODE等價於struct Node *;此處用大寫是為了與變數區分,可以讓人容易變出是個資料型別

當然為了更好地理解這個連結串列,簡單型也可以。通過的結構建立連結串列,主要能讓其內部屬性元素指向其型別的本身

就行了。

  • 建立連結串列

迴圈單鏈表的連線通過迴圈將節點指向其結構類指標構成,例如將一個數組變成一個連結串列:

TheList * CreateList()
{ 
	int A [] = {1,2,3,2,4,5,7,9,-2,3,-4,5,-6,7}; 
	TheList * head = NULL,* h = NULL; //連結串列頭節點宣告
	int ArrLenth = sizeof(A)/ sizeof(int); //獲取陣列長度
	for(int i = 0; i<ArrLenth; i ++)//遍歷其陣列元素生成節點
	{ 
		if(head == NULL)//先判斷頭節點是否為空,為空就將頭結點賦值
		{ 
			head = new TheList(); // new的用法是例項化類也可以用於結構體,主要目的是分配記憶體給頭指標           
                        head-> data = A [0]; //頭結點賦值
			h = head; // h用來參與迴圈的節點,其目的是不斷地指向其下一個節點成為尾節點; 
		} 
		TheList * p = new TheList(); //宣告臨時節點p 
		p-> data = A [i]; //將p賦值
		h-> next = p; // h是上一個節點
		h = p; //將h指向p,讓h變成尾
	} 
	TheList * temp = head; 
	while(temp!= NULL)//迴圈輸出連結串列元素
	{ 
		cout << temp- > data << endl; 
		temp = temp-> next; 
		if(temp == head)break; 
	} 
	cout << endl; 
	return head; //返回頭節點
}

這樣就生成了連結串列,當然這個連結串列是迴圈單鏈表,需要將其轉化為迴圈雙鏈表

  • 轉化迴圈雙鏈表

雙鏈表指的是結構內部兩個指向其結構型別的指標分別表示後繼節點和前繼節點

雙鏈表示例:

struct TheList 
{ 
	int data = 0; //資料域
	TheList * next; //指向連結串列的下一個節點
	TheList * prior; //指向連結串列的上一個節點
}; 
TheList * head = NULL; //宣告頭結點

如何將迴圈單鏈錶轉換迴圈雙鏈表,其思路就是迴圈遍歷單鏈表,讓其的節點的next節點的prior節點指向其節點本身

程式碼如下

TheList * ChangeList(TheList * head)
{ 
	TheList * p = head,* q = head; 
	while(p!= NULL)
	{ 
		cout << p-> data << endl; 
		//關鍵
		p-> next-> prior = p; //這個就是關鍵步驟,意思就是一個節點的下一個節點的上一個節點是其本身
		p = p-> next; 
		if(p == head)break; 
	} 
	cout << endl; 
	while(q!= NULL)//迴圈輸出
	{ 
		cout <<“data:”<< q-> data <<“next-> data:”<< q-> next-> data << endl <<“prior - > data:“<< q-> prior-> data << endl << endl; 
		q = q-> next; 
		if(q == head)break; //防止死迴圈,判斷其為頭結點就要退出迴圈
	} 

	return head; 
}

完整程式碼在:https://github.com/MyHGAME/C-/blob/master/1-2.cpp

有什麼問題歡迎指出