雙向迴圈鍊錶

2022-03-12 04:55:52 字數 3729 閱讀 7732

#include#include

#include

#include

//雙向迴圈鍊錶的結構體定義

typedef struct

node

node,*pnode,*linklist;

//初始化

void init(linklist *list)

//新增

void add(linklist list,int

data)

//插入 i>=1

void insert(linklist list,int i,int

data)

assert(i==0

); q = (pnode)malloc(sizeof(node));//

q為需要插入的節點

q->data =data;

q->next = p->next;

q->prior =p;

if(p->next)

p->next->prior =q;

p->next =q;}//

刪除void del(linklist list,int i,int *data)

assert(i==0 && p->next!=list);

q = p->next;//

q為要刪除的節點

*data = q->data;//

將刪除的節點的資料域返回

p->next = q->next;//

p斷開與q連線,和q的後繼相連

if(q->next)

q->next->prior = p;//

如果刪除節點存在後繼,那麼將這個的prior的指向p

}//end del

//獲取雙向迴圈鍊錶的長度

intgetlen(linklist list)

returni;}

//獲取第i個位置的資料

int getdata(linklist list,int

i)

return p->data;}//

正轉一圈輸出

void

display1(linklist list)

//end while

printf("\n"

);}//正轉兩圈輸出

void

display2(linklist list)

else

}printf("\n

");}//

反轉一圈輸出

void

display_1(linklist list)

printf("\n

");}//

反轉兩圈輸出

void

display_2(linklist list)

else

}printf("\n

");}//

銷毀void destroy(linklist *list)

*list =null;}//

顯示選單

void

displaymenu()

//end displaymenu

intmain()

//end while

printf("

--新增操作結束--\n\n");

break

;

case2:

printf(

"--你當前選擇了插入操作--\n");

printf(

"--請輸入插入元素的資料:");

scanf("%d

",&j);

printf(

"--請輸入插入位置:");

scanf("%d

",&i);

insert(list,i,j);

printf(

"--插入結束--\n\n");

break

;

case3:

printf(

"--你當前選擇了刪除操作--\n");

printf(

"--請輸入刪除位置:");

scanf("%d

",&i);

del(list,i,&j);

printf(

"--你刪除的元素的資料:%d \n

",j);

printf(

"--刪除結束--\n\n");

break

;

case4:

printf(

"--你當前選擇了獲取長度操作--\n");

printf(

"雙向迴圈鍊錶的長度:%d\n

",getlen(list));

printf(

"--獲取表長結束--\n\n");

break

;

case5:

printf(

"--你當前選擇了獲取資料操作--\n");

printf(

"--請輸入你要獲取元素的位置:");

scanf("%d

",&i);

printf(

"第%d個位置的資料為:%d\n

",i,getdata(list,i));

printf(

"--獲取資料結束--\n");

break

;

case6:

printf(

"--你當前選擇了正轉輸出一圈操作--\n");

display1(list);

printf(

"--正轉輸出一圈操作結束--\n\n");

break

;

case7:

printf(

"--你當前選擇了正轉輸出兩圈操作--\n");

display2(list);

printf(

"--正轉輸出兩圈操作結束--\n\n");

break

;

case8:

printf(

"--你當前選擇了反轉輸出一圈操作--\n");

display_1(list);

printf(

"--反轉輸出一圈操作結束--\n\n");

break

;

case9:

printf(

"--你當前選擇了反轉輸出兩圈操作--\n");

display_2(list);

printf(

"--反轉輸出兩圈操作結束--\n\n");

break

;

case0:

printf(

"--你當前選擇了銷毀並退出操作--\n");

destroy(&list);//

銷毀鍊錶

flag=0;//

退出迴圈

printf("

--退出操作結束--\n\n");

break

;

default

: printf(

"--你選擇錯誤!\n\n");

break

; }

//end switch

}//end while(flag)

system(

"pause");

return0;

}

雙向鍊錶和雙向迴圈鍊錶

和單向鍊錶相比,多了乙個前驅結點。如果他為空,那麼next和prior都指向自己。而對於雙迴圈鍊錶,只需要最後乙個元素的next指向head next,head next的prior指向最後乙個節點即可。新節點s插入鍊錶,s next給p結點,s prior給p prior,然後,p prior n...

迴圈鍊錶,雙向鍊錶

迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...

鍊錶 雙向迴圈鍊錶

雙向迴圈鍊錶與單鏈表一樣,都是邏輯連續 物理不連續的儲存方式,但它的效果要遠遠優於單鏈表,其結構如下 雙向迴圈鍊錶首先要有乙個頭節點,頭節點中不存放資料,真正的資料從頭節點的下乙個節點開始存放 然後每乙個節點都有兩個指標,分別指向前乙個節點和後乙個節點 最後頭尾相連,就成了雙向迴圈鍊錶。includ...