資料結構實驗三之雙鏈表

2021-08-19 16:25:05 字數 3140 閱讀 1325

《資料結構》實驗三:

鞏固線性表的資料結構的儲存方法和相關操作,學會針對具體應用,使用線性表的相關知識來解決具體問題。

準備時間為第 7 周到第 8 周,具體集中實驗時間為第 4 週第 2 次課。

2個學時。

1.建立乙個由 n 個學生成績的順序表,n 的大小由自己確定,每乙個學生的成績資訊由自己確定,實現資料的對錶進行插入、刪除、查詢等操作。分別輸出結果。

要求如下:

(3)用雙鏈表實現。

#ifndef linklist_h

#define linklist_h

template//定義模板類

struct dulnode

datatype data;

dulnode*prior,*next;

template

class dullinklist

public:

dullinklist();  //無參建構函式

dullinklist(datatype a,int n);  //有參建構函式

~dullinklist();            //析構函式

int locate(datatype x);

void insert(int i,datatype x);

datatype delete(int i);

void printlist();            

private:

dulnode*first;                

#endif

#include

using namespace std;

template

int dullinklist::locate(datatype x)

dulnode*p=first->next;

int count=1;   //工作指標p和累加器count初始化

while(p!=null)

if(p->data==x)return count; //查詢成功,結束函式並返回序號

p=p->next;

count++;

return 0;  //退出迴圈,說明查詢失敗

template

void dullinklist::insert(int i,datatype x)

dulnode*p=first,*s=null;

int count=0;

while(p!=null && count//查詢第i-1個結點

p=p->next;

count++;

if(p==null)throw"位置";  //沒有找到第i-1個結點

else

s=new dulnode;s->data=x;  //申請乙個結點s,其資料域為x

s->prior=p;

s->next=p->next;p->next=s;  //將結點s插入到結點p之後

template

dullinklist::dullinklist()

first=new dulnode;  //生成頭結點

first->next=null;  //頭結點的指標域置空

first->prior=null;

template

dullinklist::dullinklist(datatype a,int n)

dulnode*r,*s;

first=new dulnode;   //生成頭結點

r=first;    //尾指標初始化

for(int i=0;is=new dulnode;s->data=a[i];  //為每個陣列元素建立乙個結點

r->next=s;r=s;  //將結點s插入到終端結點之後

r->next=null;  //單鏈表建立完畢,將終端結點的指標域置空

template

datatype dullinklist::delete(int i)

dulnode*p=first,*q=null;

int count=0;

while(p!=null && count//查詢第i-1個結點

p=p->next;

count++;

if(p==null||p->next==null)  //結點p不存在或p的後繼結點不存在

throw"位置";

else

datatype x=p->data;

(p->prior)->next=p->next;

(p->next)->prior=p->prior;

delete q;

return x;

template

dullinklist::~dullinklist()

dulnode*q=null;

while(first!=null)  //釋放單鏈表的每乙個結點的儲存空間

q=first;  //暫存被釋放結點

first->prior->next=first->next;

first->next->prior=first->prior;

first=first->next;  //first指向被釋放結點的下一結點

delete q;

delete first;

template

void dullinklist::printlist()

dulnode*p=first->next;  //工作指標p初始化

while(p!=null)

cout

p=p->next;   //工作指標p後移

cout

int r[5]=;

dullinklist l(r,5);

cout<

tryl.insert(2,55);   //在第2個位置插入值為55的元素

catch(char *s)

cout

cout<

cout

tryl.delete(1);   //刪除第1個元素

catch(char *s)

cout

return 0;

執行結果:

資料結構之雙鏈表

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

資料結構 雙鏈表

typedef struct nodenode 雙鏈表的根節點的bwd指標指向雙鏈表的最後乙個節點,fwd指標指向雙鏈表的第乙個節點,雙鏈表的value欄位為空 以下程式是將乙個值插入到乙個有序的雙鏈表中,如果鍊錶中已經有和該值相同的節點則不插入 include include typedef st...

資料結構 雙鏈表

目標 掌握雙鏈表的資料結構 來看看什麼是雙鏈表吧 雙鏈表與單鏈表的區別,單鏈表是單項的 而雙鏈表是有左右的 題目acwing 827 實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k...