鍊錶的C語言實現之迴圈鍊錶及雙向鍊錶

2021-04-12 16:39:53 字數 2935 閱讀 9596

一、迴圈鍊錶

迴圈鍊錶是與單鏈表一樣,是一種鏈式的儲存結構,所不同的是,迴圈鍊錶的最後乙個結點的指標是指向該迴圈鍊錶的第乙個結點或者表頭結點,從而構成乙個環形的鏈。

迴圈鍊錶的運算與單鏈表的運算基本一致。所不同的有以下幾點:

1、在建立乙個迴圈鍊錶時,必須使其最後乙個結點的指標指向表頭結點,而不是象單鏈表那樣置為null。此種情況還使用於在最後乙個結點後插入乙個新的結點。

2、在判斷是否到表尾時,是判斷該結點鏈域的值是否是表頭結點,當鏈域值等於表頭指標時,說明已到表尾。而非象單鏈表那樣判斷鏈域值是否為null。

二、雙向鍊錶

雙向鍊錶其實是單鏈表的改進。

當我們對單鏈表進行操作時,有時你要對某個結點的直接前驅進行操作時,又必須從表頭開始查詢。這是由單鏈表結點的結構所限制的。因為單鏈表每個結點只有乙個儲存直接後繼結點位址的鏈域,那麼能不能定義乙個既有儲存直接後繼結點位址的鏈域,又有儲存直接前驅結點位址的鏈域的這樣乙個雙鏈域結點結構呢?這就是雙向鍊錶。

在雙向鍊錶中,結點除含有資料域外,還有兩個鏈域,乙個儲存直接後繼結點位址,一般稱之為右鏈域;乙個儲存直接前驅結點位址,一般稱之為左鏈域。在c語言中雙向鍊錶結點型別可以定義為:

typedef struct node

jd;

當然,也可以把乙個雙向鍊錶構建成乙個雙向迴圈鍊錶。

雙向鍊錶與單向鍊錶一樣,也有三種基本運算:查詢、插入和刪除。

雙向鍊錶的基本運算:

1、查詢

假若我們要在乙個帶表頭的雙向迴圈鍊錶中查詢資料域為一特定值的某個結點時,我們同樣從表頭結點往後依次比較各結點資料域的值,若正是該特定值,則返回指向結點的指標,否則繼續往後查,直到表尾。

下例就是應用雙向迴圈鍊錶查詢演算法的乙個程式。

#include <stdio.h>

#include <malloc.h>

#define n 10

typedef struct node

stud;

stud * creat(int n)

h->name[0]=』/0』;

h->llink=null;

h->rlink=null;

p=h;

for(i=0;i<n;i++)

p->rlink=s;

printf("請輸入第%d個人的姓名",i+1);

scanf("%s",s->name);

s->llink=p;

s->rlink=null;

p=s;

} h->llink=s;

p->rlink=h;

return(h);

} stud * search(stud *h,char *x)

printf("沒有查詢到該資料!");

} void print(stud *h)

printf("/n");

} main()

stud;

stud * creat(int n)

h->name[0]=』/0』;

h->llink=null;

h->rlink=null;

p=h;

for(i=0;i<n;i++)

p->rlink=s;

printf("請輸入第%d個人的姓名",i+1);

scanf("%s",s->name);

s->llink=p;

s->rlink=null;

p=s;

} h->llink=s;

p->rlink=h;

return(h);

} stud * search(stud *h,char *x)

printf("沒有查詢到該資料!");

} void print(stud *h)

printf("/n");

} void insert(stud *p)

printf("請輸入你要插入的人的姓名:");

scanf("%s",stuname);

strcpy(s->name,stuname);

s->rlink=p->rlink;

p->rlink=s;

s->llink=p;

(s->rlink)->llink=s;

} main()

3、刪除

刪除某個結點,其實就是插入某個結點的逆操作。還是對於雙向迴圈鍊錶,要在連續的三個結點s,p,q中刪除p結點,只需把s的右鏈域指標指向q,q的左鏈域指標指向s,並收回p結點就完成了。

下面就是乙個應用雙向迴圈鍊錶刪除演算法的例子:

#include

#include

#include

#define n 10

typedef struct node

stud;

stud * creat(int n)

h->name[0]=』/0』;

h->llink=null;

h->rlink=null;

p=h;

for(i=0;i〈n;i++)

p-〉rlink=s;

printf("請輸入第%d個人的姓名",i+1);

scanf("%s",s->name);

s->llink=p;

s->rlink=null;

p=s;

} h->llink=s;

p->rlink=h;

return(h);

} stud * search(stud *h,char *x)

printf("沒有查詢到該資料!");

} void print(stud *h)

printf("/n");

} void del(stud *p)

main()

c語言實現迴圈鍊錶

迴圈鍊錶的建立其實並不複雜,只需要在建立單鏈表時定義乙個節點 本文章中為s 參與迴圈找到尾節點然後讓其指向頭節點的下乙個 因為第乙個節點時沒有值的 在之後的遍歷中則需要使用do while迴圈因為跳躍了第乙個節點在我們遍歷時新的第乙個節點是有值的,之後的插入刪除查詢操作,則是在原文的基礎上刪除了迴圈...

C語言實現雙向迴圈鍊錶

list 雙向迴圈鍊錶,帶頭指標 struct list node 初始化頭指標 void list init head struct list node head 量表是否為空 是返回1,否返回0 int list is empty const struct list node head 鍊錶遍歷...

C語言實現雙向迴圈鍊錶

list 雙向迴圈鍊錶,帶頭指標 struct list node 初始化頭指標 void list init head struct list node head 量表是否為空 是返回1,否返回0 int list is empty const struct list node head 鍊錶遍歷...