雙鏈表
1、雙向鍊錶(double linked list)
雙(向)鍊錶中有兩條方向不同的鏈,即每個結點中除next域存放後繼結點位址外,還增加乙個指向其直接前趨的指標域prior。
注意:①雙鏈表由頭指標head惟一確定的。
②帶頭結點的雙鏈表的某些運算變得方便。
③將頭結點和尾結點鏈結起來,為雙(向)迴圈鍊錶。
2、雙向鍊錶的結點結構和形式描述
①結點結構(見上圖a)
②形式描述
3、雙向鍊錶的前插和刪除本結點操作typedef struct dlistnodedlistnode;
typedef dlistnode *dlinklist;
dlinklist head;
由於雙鏈表的對稱性,在雙鏈錶能能方便地完成各種插入、刪除操作。
①雙鏈表的前插操作
②雙鏈表上刪除結點*p自身的操作void dinsertbefore(dlistnode *p,datatype x)
注意:與單鏈表上的插入和刪除操作不同的是,在雙鏈表中插入和刪除必須同時修改兩個方向上的指標。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...