演算法與資料結構(c語言) 雙向鍊錶的基本操作

2021-08-29 02:36:00 字數 1336 閱讀 4738

定義乙個雙向鍊錶結構:

typedef struct dulnodedulnode,*dulinklist;
初始化乙個雙向鍊錶 :

dulinklist doublelinkedlistinit()
建立乙個雙向鍊錶:

//尾插法

void dulinklistcreatet(dulinklist l,int size)

t->next = null;

}// 頭插法

void dulinklistcreateh(dulinklist l,int size)

l->next = p;}}

列印輸出:

void printdulinklist(dulinklist l)

}printf("]\n");

printf("反向遍歷結果:[");

while(t->prior&&t!=l)

}printf("]\n");

}

指定位置插入

status dulinklistinsert(dulinklist l,int index,element v)

if(!p||i>index)

e = (dulinklist) malloc(sizeof(dulnode));

// 設定插入節點的資料為傳遞過來的引數值

e->data = v;

// 將要插入節點後繼為p指標的next,前驅就是p指標

e->next = p->next;

e->prior = p;

// 將原本是index位置節點的前驅指向要插入的元素

p->next->prior = e;

// 將p的next指向要插入的元素。

p->next = e;

return ok;

}

刪除指定位置的元素:

void dulinklistremove(dulinklist l,int index,element *e)

if(!p||i>index)

p->next->prior = p->prior;

p->prior->next = p->next;

*e = p->data;

// 釋放所在的記憶體空間

free(p);

}

測試結果:

資料結構與演算法 雙向鍊錶

雖然從表內第乙個節點到最後乙個節點的遍歷操作是非常簡單的,但是反向遍歷鍊錶卻不是一件容易的事情。如果為node類新增乙個欄位來儲存指向前乙個節點的連線,那麼久會使得這個反向操作過程變得容易許多。當向鍊錶插入節點的時候,為了吧資料複製給新的字段會需要執行更多的操作,但是當腰吧節點從表移除的時候就能看到...

資料結構與演算法 雙向鍊錶

typedef struct lineline line initline line head return head line insertline line head,int data,int add else 判斷條件為真,說明插入位置為鍊錶尾 if body next null else r...

資料結構與演算法 雙向鍊錶

ps 前面已經說過線性表的兩種表現形式,一種是順序,另一種是鏈式,鏈式的一種普通表現形式就是加入乙個指標,前乙個的指標指向後乙個結點的位址,那麼還有一種形式就是雙向鍊錶,裡面又加上了乙個指標變數,讓前指標變數指向直接前驅,後指標變數指向直接後繼。建立結構體 typedef struct double...