#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...