1. 程式人生 > >朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現(9)

朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現(9)

朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現(9)

 

單鏈表的侷限性

(1)單鏈表是對陣列的一個擴充套件,解決了陣列的大小比較死板不容易擴充套件的問題。使用堆記憶體來儲存資料,將資料分散到各個節點之間,其各個節點在記憶體中可以不相連,節點之間通過指標進行單向連線。連結串列中的各個節點記憶體不相連,有利於利用碎片化的記憶體。

(2)單鏈表各個節點之間只由一個指標單向連線,這樣實現有一些侷限性。侷限性主要體現在單鏈表只能經由指標單向移動(一旦指標移動過某個節點就無法再回來,如果要再次操作這個節點,除非從頭指標開始再次遍歷一次),因此單鏈表的某些操作就比較麻煩(演算法比較侷限)。回憶之前單鏈表的所有操作(插入,刪除節點,遍歷,從單鏈表中取某個節點的數。。。),因為單鏈表的單向移動性導致了不少麻煩。

總結:單鏈表的單向移動性導致我們在操作單鏈表時,當前節點只能向後移動不能向前移動,因此不自由,不利於解決更復雜的演算法。

 

 

解決思路:

單鏈表的節點 = 有效資料 + 指標(指標指向後一個節點)

雙向連結串列的節點 = 有效資料 + 2個指標(一個指向後一個節點,另一個指向前一個節點)

 

 

雙鏈表的封裝和程式設計實現

#include <stdio.h>

//雙鏈表的節點
struct node
{
	int data;		//有效資料
	struct node *pPrev;	//前向指標,指向前一個節點
	struct node *pNext;	//後向指標,指向後一個節點
};

struct node *create_node(int data)
{
	struct node *p = (struct node *)malloc(sizeof(struct node));
	if (NULL == p)
	{
		printf("malloc error.\n");
		return NULL;
	}
	p->data = data;
	p->pPrev = NULL;
	p->pNext = NULL;	//預設建立的節點前向和後向指標都指向NULL

	return p;
}

int main(void)
{
	struct node *pHeader = create_node(0);	//頭指標指向頭節點	

	return 0;
}