雙鏈表 鏈式棧 鏈式佇列 及實現

2021-07-02 13:29:04 字數 4442 閱讀 4236

一、雙鏈表

在單鏈表的基礎上再增加乙個指向它前驅的指標,就構成了雙鏈表。

所以雙鏈表有三個變數:資料資訊info、前驅指標llink、後繼指標rlink。

二、雙鏈表操作和實現

由於雙鏈表也為單鏈表的一種變型,一些相似的操作就沒一一枚舉,可以參考資料結構(四)——單鏈表 、帶頭結點的單鏈表、迴圈鍊錶 及其實現

1、資料結構

2、在i位置插入結點

3、在y元素後插入結點

4、刪除值為x的結點

1、資料結構

[cpp]view plain

copy

print?

typedef

intdatatype;  

typedef

struct

dlink_nodednode;  

2、在i位置插入結點

[cpp]view plain

copy

print?

include

"linklist.h"

node* insert_link_list_index(node *head,int

index,datatype x)  

if(index == 0)  

head->llink = q;    //非空鍊錶首插入

q->rlink = head;  

q->llink = null;  

head = q;  

return

head;  

}  else

ptr->rlink = p;      //鍊錶尾插入

p->llink = ptr;  

p->rlink = null;  

return

head;  

}  }  

3、在y元素之後插入

[cpp]view plain

copy

print?

#include"linklist.h"

node* intsert_node_yx(node *head,datatype x,datatype y)  

node *p = (node*)malloc(sizeof

(node));  

p->info = x;  

if(!q->rlink)  

p->rlink = q->rlink;     //中間結點 

q->rlink->llink = p;  

q->rlink = p;  

p->llink = q;  

return

head;  

}  

4、刪除值為x的結點

[cpp]view plain

copy

print?

#include"linklist.h"

node* del_link_list_node(node* head,datatype x)  

node* ptr=head;  

while

(!ptr && ptr->info != x)  

if(!ptr)else

if(ptr == head && ptr->rlink)else

if(ptr == head && !ptr->rlink)   

}else

if(!ptr->rlink)else

free(ptr);  

return

head;  

}  

三、鏈式棧

棧的鏈式儲存稱為鏈式棧。它的插入和刪除規定在單鏈表的同一端進行,棧頂指標用top表示。

1、輸出各個結點的值

2、取得棧頂元素

3、入棧

4、出棧

1、輸出各個結點的值

[cpp]view plain

copy

print?

#include"linklist.h"

void

display_link_list(node *stack)else

}  }  

2、取得棧頂元素

[cpp]view plain

copy

print?

#include"linklist.h"

node* get_top(node *stack)  

return

stack->info;  

}  

3、入棧

[cpp]view plain

copy

print?

#include"linklist.h"

node* push(node* stack,datatype x)  

4、出棧

[cpp]view plain

copy

print?

#include"linklist.h"

node* pop(node *stack,datatype *x)  

node *p = stack;  

stack=stack->next;  

*x = p->info;  

free(p);  

return

stack;  

}  

四、鏈式佇列

以佇列形式儲存的鏈式佇列,插入和刪除在單鏈表的不同端進行,隊首和隊尾指標存在乙個資料結構中。1、結構定義

2、建立乙個空佇列

3、判斷是否為空

4、取得首節點值

5、輸出各個結點

6、入列

7、出列

1、結構定義

[cpp]view plain

copy

print?

typedef

intdatatype;  

typedef

struct

link_queue_nodenode;  

typedef

struct

queuequeue;  

2、建立乙個空佇列

[cpp]view plain

copy

print?

#include"linkqueue.h"

queue* init_link_queue()  

3、判斷是否為空

[cpp]view plain

copy

print?

#include"linkqueue.h"

intis_empty_link_queue(queue *q)  

4、取得首節點值

[cpp]view plain

copy

print?

#include"linkqueue.h"

datatype* get_head(queue *q)  

return

q->front->info;  

}  

5、輸出各個結點

[cpp]view plain

copy

print?

#include"linkqueue.h"

void

display_link_queue(queue *q)else

}  }  

6、入列

[cpp]view plain

copy

print?

#include"linkqueue.h"

queue* en_list_queue(queue *q,datatype x)else

return

q;  

}  

7、出列

[cpp]view plain

copy

print?

#include"linkqueue.h"

queue* del_link_queue(queue *q,datatype *x)  

node *p = q->front;  

if(q->front == q->rear)else

*x = p->info;  

free(p);  

return

q;  

}  

資料結構(五) 雙鏈表 鏈式棧 鏈式佇列 及實現

一 雙鏈表 在單鏈表的基礎上再增加乙個指向它前驅的指標,就構成了雙鏈表。所以雙鏈表有三個變數 資料資訊info 前驅指標llink 後繼指標rlink。二 雙鏈表操作和實現 由於雙鏈表也為單鏈表的一種變型,一些相似的操作就沒一一枚舉,可以參考資料結構 四 單鏈表 帶頭結點的單鏈表 迴圈鍊錶 及其實現...

鏈式棧 鏈式佇列 順序佇列

暑期學習第一天,學習了鏈式棧 鏈式佇列和順序佇列 這三種都是舉一反三的型別 鏈式棧標頭檔案 ifndef stack h define stack h define ok 0 define error 1 結點 typedef struct stacknode stacknode 棧 typedef...

雙端鏈式佇列實現

雙端佇列,使用雙向鍊錶實現 隊頭 隊尾都可以進行入隊 出隊操作的佇列 雙端佇列的每一端都是乙個棧,都符合棧先進後出的特性 雙端佇列是一種多功能的資料結構,可以使用它來提供佇列和棧兩種功能 include include queue.h typedef struct doublelinknodedou...