資料結構之雙鏈表

2021-07-02 13:03:40 字數 3435 閱讀 3835

前面我們介紹了單鏈表,單鏈表的優點是沒有空間的限制,可以隨意開闢空間。但與我們這次要講的雙鏈表相比,就有點相形見絀了。因為哪怕是單鏈表,在進行查詢、插入、排序等等時都要進行線性表的遍歷,而我們往往需要的是目標節點的前乙個節點,所以經常一不小心就錯過了我們需要的節點,或者經常需要乙個當前節點的備份,以便儲存我們需要的節點。雙鏈表的出現,極大地統一了線性表的各種演算法。

節點結構:

鍊錶結構:

標頭檔案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,...