雙向鍊錶 結構體 指標

2021-08-19 22:32:22 字數 2090 閱讀 2401

首先當然得了解單向鍊錶了

傳送門

首先,表中的各個元素稱作「結點」。雙向鍊錶的結點時結構體,有資料本體,指向前一元素的指標prev以及指向後一元素的指標next組成。這些結構體通過指標構成乙個鍊錶,就形成了雙向鍊錶。

struct node;
另外,在表頭設定乙個特殊節點可以簡化鍊錶的實現,將這個結點稱為「頭節點」,頭節點中不包括實際資料,但它可以讓我們更輕鬆地對鍊錶做更改。

init函式用於初始化鍊錶。它會生成乙個nil節點作為鍊錶的頭節點,然後讓prev和next都指向這個頭節點,從而建立乙個空表。

然後就是很重要的插入元素。

listsearch函式用於搜尋元素,它可以在鍊錶中尋找包含指定鍵值的結點,並返回其指標,假設cur為指向當前位置結點的指標,那麼只要從頭節點的next所指的結點,即鍊錶開頭的元素逐個進行cur=cur->next,即可逐一訪問每個結點。

node* listsearch(int key)

return cur;

}

deletenode函式刪除指定結點t。

t->prev->next=t->next;//修改前面的指向

t->next->prev=t->prev;//修改後面的指向

free(t);

}void deletefirst()

void deletelast()

void deletekey(int key)

deletelastfirst函式,deletelast函式分別用於刪除頭節點next,prev所指向的結點,deletekey函式可以刪除包含指定key的結點,它可以先通過listsearch函式搜尋出與key一致的結點t,然後再使用deletenode(t)刪除該節點。

整體運用一下:

#include#include#include#includeusing namespace std;

struct node;

node *nil;

void init()

void insert(int key)

void deletenode(node*t)

t->prev->next=t->next;

t->next->prev=t->prev;

free(t);

}void deletefirst()

void deletelast()

node* listsearch(int key)

return cur;

}void deletekey(int key)

void printlist()

if(isf++>0)

printf("%d",cur->key);

cur=cur->next;

}printf("\n");

}int main()

else if(com[6]=='l')else}}

}printlist();

return 0;}/*

7insert 5

insert 2

insert 3

insert 1

delete 3

insert 6

delete 5

*/

雙向鍊錶結構實現

雙向鍊錶 雙向鍊錶是可以正向遍歷鍊錶節點和反向遍歷鍊錶節點的一種鍊錶資料結構。在單向鍊錶中,每個節點只有乙個指向下乙個節點的引用,在雙向鍊錶中節點新增乙個指向前乙個節點的引用,新增相應的反向遍歷方法,即可實現訪問前乙個節點的。新增和刪除節點時需要解決四個指向 引用 操作,相對來說更複雜,但是解決好在...

線性結構 雙向鍊錶

雙向鍊錶 1.單向鍊錶的特點 1.只能從頭遍歷到尾,或者從尾遍歷到頭 一般是從頭到尾 即鍊錶數單向的 2.單向鍊錶存在的問題 2.而實際中,我們需要從某個節點嗲它的上乙個節點。如文字編輯中,通過前後箭頭可以使得游標前後移動 3.雙向鍊錶的特點 1.既可以從頭遍歷到尾,也可以從尾遍歷到頭 4.雙向鍊錶...

資料結構 鍊錶 雙向鍊錶

注意typedef的定義結構,以及dinklist的資料型別 typedef struct dnode dnode,dinklist 注意插入第乙個結點時,prior指標的空指向問題 if l next null 若l後繼結點為空 則省略該步驟 l next prior p 基本 頭插法建立雙向鍊錶...