线性表---双链表
雙鏈表是單鏈表的拓展,單鏈表結點中只有一個指向其后繼的指針,雙鏈表有兩個結點,一個指向其后繼的指針,另一個指向前驅。
為什么要引入雙鏈表呢?
這就要說單鏈表只有一個指針了,使得單鏈表只能從結點依次順序地向后遍歷,要訪問某個p結點前面的結點,只能從頭遍歷,為了克服這個缺點,引入了雙鏈表。
定義
typedef struct DNode {ElemType data;struct DNode* prior, * next; }DNode,*DLinkList;雙鏈表結點中有兩個指針prior和next,分別指向前驅和后繼結點
相對于單鏈表,雙鏈表只增加了prior指針。因此在雙鏈表按照值查找和按照位查找的操作相同(沒有用到prior指針),但在插入和刪除操作上有不同。
基本操作
1、按照值查找和按照位查找
/*按序號查找結點值: */ DNode* GetElem(DLinkList L, int i) {int j = 1; //計數DNode* p = L->next;if (i <= 0)return NULL;while (p && j < i) {p = p->next;j++;}return p; }/*按照值來查找 */DNode* LocateElem(DLinkList L, ElemType e) {DNode* p = L->next;while (p != NULL && p->data != e){p = p->next;}return p; }2、雙鏈表的插入操作
在雙鏈表中p所指的結點之后插入結點s
是在p后面插入,p的后繼我們還不知道,所以要把p的后繼指針修改好
3、刪除操作
刪除第i個結點
刪除第i個結點p,將p結點的后繼的前驅改為p的前驅,p的前驅的后繼改為p的后繼,在free就可以了
總結
- 雙鏈表有兩個指針,一個指向后繼,一個指向前驅
- 單鏈表訪問后繼結點的時間復雜度為0(1),訪問前驅為0(n),而雙鏈表都是0(1)
- 雙鏈表是犧牲內存來減小時間
- 雙鏈表和單鏈表的區別就在于雙鏈表有一個前驅指針,其他都一樣
總結
- 上一篇: 杜高犬多少钱一只啊?
- 下一篇: 线性表----循环链表和静态链表