雙鏈表的實現

2021-06-03 12:33:21 字數 1753 閱讀 6161

雙鏈表

1、雙向鍊錶(double linked list)

雙(向)鍊錶中有兩條方向不同的鏈,即每個結點中除next域存放後繼結點位址外,還增加乙個指向其直接前趨的指標域prior。

注意:①雙鏈表由頭指標head惟一確定的。

②帶頭結點的雙鏈表的某些運算變得方便。

③將頭結點和尾結點鏈結起來,為雙(向)迴圈鍊錶。

2、雙向鍊錶的結點結構和形式描述

①結點結構(見上圖a)

②形式描述

typedef struct dlistnodedlistnode;

typedef dlistnode *dlinklist;

dlinklist head;

3、雙向鍊錶的前插和刪除本結點操作

由於雙鏈表的對稱性,在雙鏈錶能能方便地完成各種插入、刪除操作。

①雙鏈表的前插操作

void dinsertbefore(dlistnode *p,datatype x)

②雙鏈表上刪除結點*p自身的操作

void ddeletenode(dlistnode *p)

注意:與單鏈表上的插入和刪除操作不同的是,在雙鏈表中插入和刪除必須同時修改兩個方向上的指標。

上述兩個演算法的時間複雜度均為o(1)。

#include#includetypedef struct node //定義雙鏈表

snode;

snode *creat() //建立雙鏈表

q->next = null;

return head;

}void display(snode *head)//便利列印雙鏈表

printf(" ");

}int length(snode *head)//測鍊錶的結點數

return i;

}void opposite(snode *head)

while (p != head)

printf(" ");

}int insnode(snode *head, int x, int i) //把x插入到鍊錶的第i的位置,即在第i個元素p之前插入,與單鏈表在p之後插入相區別

s->data = x;

s->prior = p->prior;//插入 四步完成

s->next = p;

p->prior->next = s;

p->prior = s;

}return 1;

}int delnode(snode *head, int i)//刪除鍊錶中第i個結點

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

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

free(p);

}return 1;

}int main(void)

else

printf("輸入有誤 ");

printf("請輸入您想刪除的結點位置:");

scanf("%d", &location);

if (delnode(headl, location))

else

printf("輸入有誤! ");

}

**:

雙鏈表的實現

資料結構 實驗二 線性表綜合實驗 一 實驗目的 鞏固線性表的資料結構的儲存方法和相關操作,學會針對具體應用,使用線性表的相關知識來解決具體問題 二.實驗內容 1.建立乙個由n個學生成績的順序表,n的大小由自己確定,每乙個學生的成績資訊由自己確定,實現資料的對錶進行插入 刪除 查詢等操作。分別輸出結果...

雙鏈表實現

一 實驗目的 鞏固線性表的資料結構的儲存方法和相關操作,學會針對具體應用,使用線性表的相關知識來解決具體問題。二 實驗內容 建立乙個由n個學生成績的順序表,n的大小由自己確定,每乙個學生的成績資訊由自己確定,實現資料的對錶進行插入 刪除 查詢等操作。分別輸出結果。三 源 includeconst i...

雙鏈表實現

以前寫的不帶頭的單鏈表實現,當時也啥也沒學,好多東西不知道,加上一心想壓縮 減少情況,所以寫得不太好。請教了老師,首先是命名問題和 緊湊性等的改進。還有可讀性方面的改進,多寫了一些注釋。並且因為帶頭的比較好寫,好操作,所以標準寫法也不是很長,繁瑣。下面貼 include include includ...