前面我們介紹了單鏈表,單鏈表的優點是沒有空間的限制,可以隨意開闢空間。但與我們這次要講的雙鏈表相比,就有點相形見絀了。因為哪怕是單鏈表,在進行查詢、插入、排序等等時都要進行線性表的遍歷,而我們往往需要的是目標節點的前乙個節點,所以經常一不小心就錯過了我們需要的節點,或者經常需要乙個當前節點的備份,以便儲存我們需要的節點。雙鏈表的出現,極大地統一了線性表的各種演算法。
節點結構:
鍊錶結構:
標頭檔案list.h
#ifndef _dlist_h
#define _dlist_h
#include#includeusing namespace std;
#define elemtype int
typedef struct node
node;
typedef struct list
list;
void initlist(list *list);
bool push_back(list *list,elemtype x);
bool push_front(list *list,elemtype x);
void showlist(list *list);
bool pop_back(list *list);
bool pop_front(list *list);
bool insert_val(list *list,elemtype x);
bool delete_val(list *list,elemtype x);
node *find(list *list,elemtype x);
elemtype getvalue(list *list,int x);
bool clear(list *list);
#endif
函式實現:list.cpp#include"dlist.h"
void initlist(list *list)
bool push_back(list *list,elemtype x)
s->data=x;
s->next=null;
s->prio=list->last;
list->last->next=s;
list->last=s;
list->size++;
return true;
}bool push_front(list *list,elemtype x)
list->size++;
return true;
}void showlist(list *list)
cout<
node *p=list->last;
list->last=p->prio;
free(p);
list->last->next=null;
list->size--;
return true;
}bool pop_front(list *list)
node *p=list->first->next;
if (list->size==1)
else
free(p);
list->size--;
return true;
}bool insert_val(list *list,elemtype x)
s->data=x;
if (list->size==0)
else
if (p==list->last)
s->next=p->next;
p->next->prio=s;
p->next=s;
s->prio=p;
p=p->next;
} list->size++;
return true;
}bool delete_val(list *list,elemtype x)
p=p->next;
} if (p==list->last&&p->data==x)
return false;
}node *find(list *list,elemtype x)
node *p=list->first->next;
while (p->next!=null)
p=p->next;
} if (p==list->last&&p->data==x)
return null;
}elemtype getvalue(list *list,int x)
node *p=list->first;
for (int i=0;inext;
} return p->data;
}bool clear(list *list)
node *p=list->first->next;
node *q=p;
while (p->next!=null)
return true;
}
主函式:main.cpp
#include"dlist.h"
void main()
break;
case 2:
cout
while(cin>>item,item!=-1)
break;
case 3:
showlist(&mylist);
break;
case 4:
pop_back(&mylist);
break;
case 5:
pop_front(&mylist);
break;
case 6:
break;
case 7:
cout
cin>>item;
insert_val(&mylist,item);
break;
case 8:
break;
case 9:
cout
cin>>item;
delete_val(&mylist,item);
break;
case 10:
cout
cin>>item;
p=find(&mylist,item);
if(p!=null)
{cout
cin>>item;
cout<
資料結構 雙鏈表
typedef struct nodenode 雙鏈表的根節點的bwd指標指向雙鏈表的最後乙個節點,fwd指標指向雙鏈表的第乙個節點,雙鏈表的value欄位為空 以下程式是將乙個值插入到乙個有序的雙鏈表中,如果鍊錶中已經有和該值相同的節點則不插入 include include typedef st...
資料結構 雙鏈表
目標 掌握雙鏈表的資料結構 來看看什麼是雙鏈表吧 雙鏈表與單鏈表的區別,單鏈表是單項的 而雙鏈表是有左右的 題目acwing 827 實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k...
資料結構 雙鏈表
單鏈表結點中只有乙個只指向後繼的指標,使得單鏈表只能從頭結點開始一次順序的先後遍歷。要訪問某個結點的前驅結點 插入刪除操作時 只能從頭開始遍歷,訪問後繼節點的時間複雜度為o 1 訪問前驅結點的時間複雜度為o n 為了克服單鏈表的上述缺點,引入了雙鏈表,雙鏈表結點中有兩個指標prior 和 next,...