欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)-創(chuàng)新互聯(lián)



    接著上一篇博文http://12172969.blog.51cto.com/12162969/1918256,把循環(huán)鏈表里的雙循環(huán)鏈表的基本操縱按照我個(gè)人的理解進(jìn)行總結(jié)一下。

成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注于成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)與策劃設(shè)計(jì),泰和網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:泰和等地區(qū)。泰和做網(wǎng)站價(jià)格咨詢(xún):13518219792

依然沿襲過(guò)去的風(fēng)格,進(jìn)入雙循環(huán)鏈表之前,先提另一種結(jié)構(gòu),雙向鏈表,先有了雙向鏈表再有了雙循環(huán)鏈表。這兩種結(jié)構(gòu)和單鏈表一樣都有帶頭結(jié)點(diǎn)和不帶頭結(jié)點(diǎn)之分。我們先來(lái)看一下這幾種結(jié)構(gòu)的結(jié)構(gòu)圖:


雙鏈表




循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)



雙循環(huán)鏈表


循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)


循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)



    既然單向鏈表有普通的鏈表也就是不循環(huán)的鏈表、那么雙向鏈表也一樣,也有普通的雙向鏈表和雙向循環(huán)鏈表;也有帶頭結(jié)點(diǎn),不帶頭結(jié)點(diǎn)的結(jié)構(gòu),這里依然是兩種結(jié)構(gòu)都給出算法,但是普通的循環(huán)鏈表不寫(xiě),這里只寫(xiě)循環(huán)雙鏈表。



首先我們先給出結(jié)構(gòu)定義等部分的代碼:


typedef int Status;

#define OK     1

#define ERROR   0

#define TRUE    1

#define FALSE   0

typedef int ElemType;

//定義雙鏈表的結(jié)點(diǎn)

typedef struct node

{

ElemType data;

struct node *next;

struct node *prev;

}Node;

typedef struct node *SeqNode;

//定義管理鏈表的結(jié)構(gòu)

typedef struct list

{

struct node *phead;

struct node *ptail;

size_t length;

}List;

//判斷結(jié)點(diǎn)是否為空,空返回FALSE,不空返回TRUE;

Status IsEmpty(SeqNode p)

{

if(NULL ==p)

{

return FALSE;

}

return TRUE;

}

//構(gòu)造新結(jié)點(diǎn),寫(xiě)后面的插入函數(shù)后會(huì)重復(fù)使用構(gòu)造節(jié)點(diǎn)的代碼,因此將重復(fù)代碼封裝在函數(shù)中減少重復(fù)代碼量

Node *BuyNode(ElemType x)

{

SeqNode s = (Node*)malloc(sizeof(Node));

if(FALSE == IsEmpty(s))

{

printf("out of mommery\n");

return FALSE;

}

s->data = x;

s->next = NULL;

s->prev = NULL;

return s;

}

//查找函數(shù):按照值插入,都需要找到需要插入的位置,為了優(yōu)化代碼,因此將這一部分封裝起來(lái)。


//查找要插入的結(jié)點(diǎn),因?yàn)殡p循環(huán)鏈表可以通過(guò)當(dāng)前節(jié)點(diǎn)找到自己的地址,因此不需用額外的變量保存當(dāng)前的地址,


//查找成功返回當(dāng)前結(jié)點(diǎn)的地址,查找失敗返回最后一個(gè)空間的地址

Node *Find(List head,SeqNode s,ElemType x)

{

while(head.length--)

{

if(s->data < x)

{

s = s->next;

continue;

}

return s;

}

return s;

}

//查找函數(shù):按照值刪除,都需要找到需要插入的位置,為了優(yōu)化代碼,因此將這一部分封裝起來(lái)。

//查找要插入的結(jié)點(diǎn),因?yàn)殡p循環(huán)鏈表可以通過(guò)當(dāng)前節(jié)點(diǎn)找到自己的地址,因此不需用額外的變量保存當(dāng)前的地址,


//查找成功返回當(dāng)前結(jié)點(diǎn)的地址,查找失敗返回NULL

Node *_Find(List head,SeqNode s,ElemType x)

{

while(head.length--)

{

if(s->data == x)

{

return s;

}

s = s->next;

}

return NULL;

}



初始化


    初始化的時(shí)候,就是要建立一個(gè)空表,上圖中已經(jīng)給出了空表的示意圖,那么 初始化就是建立這樣一個(gè)結(jié)構(gòu)。


//初始化帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表,初始化成功返回TRUE,失敗FALSE.

Status Init_Yes_SeqNode(List *head)

{

SeqNode s = BuyNode(0);

if(FALSE == IsEmpty(s))

{

printf("初始化失敗\n");

return FALSE;

}

head->length = 0;

head->phead = s;

head->ptail = s;

s->next = s;

s->prev = s;

return TRUE;

}

//初始化不帶頭結(jié)點(diǎn)的循環(huán)雙鏈表,初始化成功返回TRUE,失敗FALSE.

Status Init_No_Head(List *head)

{

head->length = 0;

head->phead = NULL;

head->ptail = NULL;

return FALSE;

}



雙循環(huán)鏈表頭插



個(gè)人一直覺(jué)得只要結(jié)構(gòu)弄清了,寫(xiě)代碼就好辦了。所以我繼續(xù)給出頭插的示意圖:



循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)


循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)

循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)

    帶不帶頭結(jié)點(diǎn)的雙循環(huán)鏈表頭插只要按照?qǐng)D中標(biāo)號(hào)順序,執(zhí)行就可以頭插成功,兩者都有一個(gè)特殊情況,就是空表的時(shí)候,需要維護(hù)結(jié)構(gòu)的完整性,需要單獨(dú)處理。當(dāng)然我給出的順序只是其中一種,其他的順序同樣可以達(dá)到相同的作用。



具體代碼實(shí)現(xiàn)如下


//帶頭結(jié)點(diǎn)的的雙循環(huán)雙鏈表頭插,插入成功返回TRUE,失敗返回FALSE


Status Insert_Yes_Head(List *head,ElemType x)


{

SeqNode s = BuyNode(x);

  //需要注意這里SeqNode 定義的變量是一個(gè)結(jié)點(diǎn)類(lèi)型的指針,BuyNode(x)函數(shù)是我之前定義的函數(shù),用來(lái)構(gòu)造結(jié)點(diǎn)的,后邊不在說(shuō)明

if(FALSE == IsEmpty(s))

{

printf("out of memory\n");

return FALSE;

}

s->next = head->phead->next;

s->prev = head->phead;

s->next->prev = s;

s->prev->next = s;

if(0 == head->length)              //處理空表的情況

{

head->ptail = s;

}

head->length++;

return TRUE;

}

//不帶頭結(jié)點(diǎn)的循環(huán)雙鏈表頭插,插入成功返回TRUE,失敗返回FALSE

Status Insert_No_Head(List *head,ElemType x)

{

SeqNode  s  = BuyNode(x);

if(FALSE == IsEmpty(s))

{

printf("out of memory\n");

return FALSE;

}

if(0 == head->length)

{

s->next = s;

s->prev = s;

head->phead = s;

head->ptail = s;

}

s->next = head->phead;

s->prev = head->ptail;

s->next->prev = s;

s->prev->next = s;

head->phead = s;

head->length++;


return TRUE;

}



雙循環(huán)鏈表尾插


我們繼續(xù)看圖:


循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)


循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)

循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)


    圖看明白了,只要按照步驟來(lái)寫(xiě)帶就可以了。


具體的實(shí)現(xiàn)代碼如下:



//帶頭結(jié)點(diǎn)的雙循環(huán)鏈表的尾插,插入成功返回TRUE,失敗返回FALSE


Status Insert_Yes_Tail(List *head,ElemType x)

{

SeqNode s = BuyNode(x);

if(FALSE == IsEmpty(s))

{

printf("out of memory\n");

return FALSE;

}

s->next = head->phead;

s->prev = head->ptail;

s->prev->next = s;

s->next->prev = s;

head->ptail = s;

head->length++;

return TRUE;

}

//不帶頭結(jié)點(diǎn)的雙循環(huán)鏈表的尾插,插入成功返回TRUE,失敗返回FALSE


Status Insert_No_Tail(List *head,ElemType x)

{

SeqNode s = BuyNode(x);

if(FALSE == IsEmpty(s))

{

printf("out of memory\n ");

return FALSE;

}

if(0 == head->length)    //處理空鏈表的情況

{

head->phead = s;

head->ptail = s;

s->next = s;

s->prev = s;

}

s->next = head->phead;

s->prev = head->ptail;

s->next->prev = s;

s->prev->next = s;

head->ptail = s;

head->length++;

return TRUE;

}



雙循環(huán)鏈表的按值插(這里是按照從小到大的順序)


    雙循環(huán)鏈表按值插入(這里是從小到大的順序),無(wú)論是帶頭結(jié)點(diǎn)還是不帶頭結(jié)點(diǎn),當(dāng)是空表的時(shí)候,直接插入鏈表,不需用查找插入位置。


    其他情況調(diào)用Find函數(shù)查找要插入的位置,F(xiàn)ind函數(shù)的返回值是要插入的地址的后一個(gè)元素的地址。由于雙循環(huán)鏈表可以同過(guò)當(dāng)前元素找到前一個(gè)結(jié)點(diǎn)所以Find返回來(lái)的地址就可以完成插入操作。當(dāng)是空表的時(shí)候,與頭插或者尾插的空表示意圖一樣,讀者返回到前邊看,這里不給出示意圖,這里只給出有元素的按值插入示意圖:


循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)

    不帶頭結(jié)點(diǎn)的按值插入,有一點(diǎn)需要注意,當(dāng)只有一個(gè)結(jié)點(diǎn)的時(shí)候再次插入第二個(gè)結(jié)點(diǎn)的時(shí)候需要修改phead和ptail的指向,由于只有一個(gè)結(jié)點(diǎn),不管是第二個(gè)要插入的值比第一個(gè)大還是小,由于是循環(huán)鏈表,F(xiàn)ind函數(shù)返回的都是第一個(gè)結(jié)點(diǎn),這樣就需要在插如函數(shù)中,進(jìn)行單獨(dú)處理。



循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)

    由于帶頭結(jié)點(diǎn),所以不會(huì)出現(xiàn)不帶頭結(jié)點(diǎn)那種需要單獨(dú)處理的特殊情況,但是帶頭節(jié)點(diǎn)與不帶頭結(jié)點(diǎn)都有共同的特殊情況,那就是空表時(shí)的情況。


具體代碼實(shí)現(xiàn):



//帶頭結(jié)點(diǎn)的按值插入,插入成功返回TRUE,失敗返回FALSE。

Status Insert_Yse_Value(List *head,ElemType value)

{

SeqNode s =  BuyNode(value);

SeqNode p = NULL;

if(FALSE == IsEmpty(s))

{

printf("out of memory\n");

return FALSE;

}

if(0 == head->length)         //處理空表的情況

{

s->next = head->phead;

s->prev = head->phead;

head->phead->next = s;

head->ptail = s;

head->phead->prev = s;

head->length++;

return TRUE;

}

p = Find(*head,head->phead->next,value);       //Find函數(shù),之前定義的,返回要插入的位置的地址。

 //這里我提一下這個(gè)判斷條件,給Find函數(shù)傳過(guò)去的地址,是首元結(jié)點(diǎn)的地址,所以當(dāng)Find()函數(shù)返回的地址為head->phead時(shí),說(shuō)明該元素需要插入到表尾,所以就需要修改ptial的指向。

if(head->phead == p)

{

head->ptail = s;

}

s->next = p;

s->prev = p->prev;

s->prev->next = s;

s->next->prev = s;

head->length++;

return TRUE;

}

//不帶頭結(jié)點(diǎn)的按值插入,插入成功返回TRUE,失敗返回FALSE。

Status Insert_No_Value(List *head,ElemType value)

{

SeqNode s = BuyNode(value);

SeqNode p = NULL;

if(FALSE == IsEmpty(s))

{

printf("out of memory\n");

return FALSE;

}

if(0 == head->length)          //處理空表的情況

{

head->phead = s;

head->ptail = s;

s->next = s;

s->prev = s;

head->length++;

return TRUE;

}

p = Find(*head,head->phead,value);   //Find函數(shù),之前定義的,返回要插入的位置的地址。

s->next = p;

s->prev = p->prev;

p->prev = s;

s->prev->next = s;

//重點(diǎn)說(shuō)一下這一部分,由于沒(méi)有頭結(jié)點(diǎn),所以當(dāng)Find()函數(shù)head->phead時(shí),有可能是往頭插,也有可能是往尾插,所以就需要進(jìn)行判斷,當(dāng)Find()函數(shù)的返回值等于頭指針時(shí),如果將要插入的值大于首元結(jié)點(diǎn)的值,那么就是說(shuō),要插入的值是往最后插,即就是需要把ptail修改指向新結(jié)點(diǎn)。否則修改phead。

if(head->phead == p)

{

if( s->data > head->ptail->data)

{

head->ptail = s;

}

else

{

head->phead = s;

}

}

head->length++;

return TRUE;

}



循環(huán)雙鏈表的頭刪


    不論是帶頭結(jié)點(diǎn)的鏈表還是不帶頭結(jié)點(diǎn)當(dāng)鏈表為空時(shí)直接返回FALSE;對(duì)于帶頭結(jié)點(diǎn)和不帶頭結(jié)點(diǎn)的雙循環(huán)鏈表,都需要注意一個(gè)結(jié)點(diǎn)的情況,對(duì)于帶頭結(jié)點(diǎn)的雙循環(huán)鏈表,由于phead始終是指向頭結(jié)點(diǎn)的,所以,不需用修改頭指針的指向,以及最后一個(gè)節(jié)點(diǎn)的next域除了當(dāng)刪除到最后一個(gè)結(jié)點(diǎn)時(shí),其他的都不用修改phead、ptail、ptail->next、phead->prev。然而對(duì)于不帶頭結(jié)點(diǎn)就需要每次維護(hù)循環(huán)鏈表的完整性,修改這些值。我們繼續(xù)看圖:



循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)


循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)


具體代碼實(shí)現(xiàn):


//帶頭結(jié)點(diǎn)的循環(huán)雙鏈表的頭刪,刪除失敗返回FALSE,刪除成功返回TRUE.

Status Delite_Yes_Head(List *head)

{

SeqNode p = head->phead->next;

if(head->phead == p)

{

printf("鏈表中已空,無(wú)元素可刪\n");

return FALSE;

}

head->phead->next = p->next;

p->next->prev = head->phead;

free(p);

p = NULL;

if(1 == head->length)    //處理刪除時(shí)只有一個(gè)結(jié)點(diǎn)時(shí)的情況

{

head->ptail = head->phead;

}

head->length--;

return TRUE;

}

//不帶頭結(jié)點(diǎn)的頭刪,刪除失敗返回FALSE,刪除成功返回TRUE.

Status Delite_No_Head(List *head)

{

SeqNode p = head->phead;

if(NULL == p)

{

printf("鏈表已空,已經(jīng)無(wú)元素可以刪除\n");

return FALSE;

}

if(1 == head->length)      //處理刪除時(shí)只有一個(gè)結(jié)點(diǎn)時(shí)的情況

{

head->phead = NULL;

head->ptail = NULL;

}

else               //處理一般情況

{

head->phead = p->next;

p->next->prev = head->phead;

head->ptail->next = head->phead;       //維護(hù)循環(huán)鏈表的完整性


head->phead->prev = head->ptail;

}

free(p);

p = NULL;

head->length--;

return TRUE;

}



循環(huán)雙鏈表的尾刪


    由于尾刪每次都需要修改ptail的指向,并且修改頭結(jié)點(diǎn)的prev的指向,所以對(duì)于帶頭結(jié)點(diǎn)的雙循環(huán)鏈表,所有情況都是一樣的不需用單獨(dú)處理那種情況,然而對(duì)于不帶頭結(jié)點(diǎn)的雙循環(huán)鏈表,由于刪除最后一個(gè)結(jié)點(diǎn)后phead和ptail都會(huì)指向NULL,所以要對(duì)不帶頭結(jié)點(diǎn)的雙循環(huán)鏈表的一個(gè)結(jié)點(diǎn)的情況單獨(dú)處理。ok,能用圖解決的問(wèn)題覺(jué)絕不廢話(huà),當(dāng)然這是玩笑循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版),好了我們來(lái)看圖:




循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)


循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)


具體代碼實(shí)現(xiàn):



//帶頭結(jié)點(diǎn)的尾刪,刪除成功返回TRUE,失敗返回FALSE;


Status Delite_Yes_Tail(List *head)

{

SeqNode p = head->ptail;

if(head->phead == p)

{

printf("鏈表已空、已經(jīng)無(wú)元素可以刪除\n");

return FALSE;

}

p->prev->next = head->phead;

head->phead->prev = p->prev;

head->ptail = p->prev;

free(p);

p = NULL;

head->length--;

return TRUE;

}

//不帶頭結(jié)點(diǎn)的循環(huán)雙鏈表的尾刪

Status Delite_No_Tail(List *head)

{

SeqNode p = head->ptail;

if(NULL == p)

{

printf("鏈表已空、已經(jīng)無(wú)元素可以刪除\n");

return FALSE;

}

if(1 == head->length)     //處理只有一個(gè)結(jié)點(diǎn)的情況

{

head->phead = NULL;

head->ptail = NULL;

}

else

{

p->prev->next = head->phead;

head->phead->prev = p->prev;

head->ptail = p->prev;

}

free(p);       //釋放結(jié)點(diǎn)空間

p = NULL;

head->length--;

return TRUE;

}



循環(huán)雙鏈表的尾刪


    為了便于操作,這里就要用到之前寫(xiě)的另一個(gè)Find函數(shù),注意這兩個(gè)Find是不一樣的這里Find函數(shù)名是_Find函數(shù)名前有個(gè)下劃線(xiàn),這只是從名字上的差別,它的功能也不同_Find函數(shù)在鏈表中搜索一個(gè)特定值,如果搜索到返回當(dāng)前地址,沒(méi)有搜索到返回NULL。


    然后對(duì)于帶頭結(jié)點(diǎn)的雙循環(huán)單鏈表,就有這么幾種情況,1、如果表為空,直接返回不用查找了。2、如果_Find返回NULL,說(shuō)明表中沒(méi)有此元素,所以也刪除失敗,3、再就是找到元素,返回它的地址,將其刪除掉釋放掉空間,這里需要注意,由于帶頭結(jié)點(diǎn)phead始終指向頭結(jié)點(diǎn),絕不需要修改phead的指向,但是當(dāng)刪除ptail指向的結(jié)點(diǎn)時(shí)就需要修改指向。這個(gè)要單獨(dú)處理。

    對(duì)于不帶頭結(jié)點(diǎn)的雙循環(huán)鏈表。1、同樣如果鏈表為空,不用查找直接返回,刪除失?。?、如果_Find返回NULL,說(shuō)明表中沒(méi)有此元素,所以也刪除失敗;3、再就是找到元素,對(duì)于不帶頭結(jié)點(diǎn)的鏈表,又分為四種情況:a、如果phead == ptail 并且 _Find 返回的地址等于他們說(shuō)明鏈表只有一個(gè)結(jié)點(diǎn),并且要把他刪除了;b、如果_Find 返回的地址 == ptail  就需要修改 ptail的指向以及附帶的指向;c、如果_Find 返回的地址 == phead 就需要修改phead的指向以及附帶的指向。d、再就是一般情況,注意這幾個(gè)條件判斷是有順序的,如果沒(méi)有順序就需要b和c再添加條件。接下來(lái)我們繼續(xù)不看圖了,直接上代碼,這篇都畫(huà)了那么多圖了,并且這里會(huì)出現(xiàn)的情況,也就是之前那么多刪除操作的綜合,ok,所以沒(méi)有圖咯,不上圖了呢,代碼呢我就會(huì)給出盡可能多的注釋。


//帶頭結(jié)點(diǎn)的按照值,刪除,這里先不考慮重復(fù)值,刪除成功返回TRUE,失敗返回FALSE;


Status Delite_Yes_Value(List *head,ElemType value)

{

SeqNode p = NULL;

if(0 == head->length)             //表為空,不用查找,刪除失敗,直接返回FALSE

{

printf("鏈表已空,%d刪除失敗\n",value);

return FALSE;

}

p = _Find(*head,head->phead->next,value);

if(NULL == p)             //查找完成,表中不存在特定值的情況,刪除失敗,返回FALSE

{

printf("%d刪除失敗,鏈表中沒(méi)有%d\n",value,value);

return FALSE;

}

if(head->ptail == p )        //刪除尾結(jié)點(diǎn)的情況,就需要修改ptail指向

{

head->ptail = head->ptail->prev;

}

p->prev->next = p->next;

p->next->prev = p->prev;

free(p);

p = NULL;

head->length--;

return TRUE;

}

//不帶頭結(jié)點(diǎn)的按照值刪除,這里不考慮重復(fù)值,只刪除第一個(gè)遇到的,刪除成功返回TRUE,失敗返回FALSE;

Status Delite_No_Value(List *head,ElemType value)

{

SeqNode p = head->phead;

if(FALSE == IsEmpty(p))          //表為空,不用查找,刪除失敗,直接返回

{

printf("鏈表已空,%d刪除失敗\n",value);

return FALSE;

}

p = _Find(*head,head->phead,value);

if(NULL == p)        //查找完成,表中不存在特定值的情況,刪除失敗,返回FALSE

{

printf("%d刪除失敗,鏈表中沒(méi)有%d元素\n",value,value);

return FALSE;

}

 //表中元素只有一個(gè)并且要?jiǎng)h除的元素就是這一個(gè),就需要修改phead 和 ptail的指向

if(head->phead == head->ptail && p == head->phead)

{

head->phead = NULL;

head->ptail = NULL;

}

//刪除頭結(jié)點(diǎn)的情況,就需要修改phead指向,以及附帶的其他指向,使其保持循環(huán)結(jié)構(gòu)的完整性

else if(head->phead == p)

{

head->phead = head->phead->next;

head->ptail = head->phead;

}

//刪除尾結(jié)點(diǎn)的情況,就需要修改ptail指向,以及附帶的其他指向,使其保持循環(huán)結(jié)構(gòu)的完整性

else if(head->ptail == p)

{

head->ptail = head->ptail->prev;

head->phead->prev = head->phead;

}

//一般情況

p->prev->next = p->next;

p->next->prev = p->prev;

free(p);

p = NULL;

head->length--;

return TRUE;

}



循環(huán)雙鏈表的打印輸出


//打印輸出不帶頭結(jié)點(diǎn)的循環(huán)雙鏈表中所有元素。

void Show_No(List head)

{

SeqNode p = head.phead;

if(NULL == p)

{

printf("鏈表為空\(chéng)n");

return ;

}

if(1 == head.length)

{

printf("%d ",p->data);

printf("\n");

return ;

}

while(head.phead != p->next)

{

printf("%d ",p->data);

p = p->next;

}

printf("%d ",p->data);

printf("\n");

}

//打印輸出帶頭結(jié)點(diǎn)的循環(huán)雙鏈表中所有元素。

void Show_Yes(List head)

{

SeqNode p = head.phead->next;

while(head.phead != p)

{

printf("%d ",p->data);

p = p->next;

}

printf("\n");

}



    寫(xiě)到這里循環(huán)鏈表的基本操作就寫(xiě)完了,當(dāng)然有幾個(gè)操作沒(méi)有寫(xiě),比如排序,這里先不寫(xiě),后邊會(huì)有一個(gè)專(zhuān)題是寫(xiě)排序的。還有獲取鏈表長(zhǎng)度等大家都很容易實(shí)現(xiàn)的就沒(méi)有寫(xiě),主要把帶頭結(jié)點(diǎn)不帶頭結(jié)點(diǎn)的插入刪除對(duì)比的實(shí)現(xiàn)。后續(xù)會(huì)繼續(xù)完善。好了以上就是雙循環(huán)鏈表的基本操作,雙循環(huán)鏈表寫(xiě)完了,線(xiàn)性表也就告一段落了。ok,從線(xiàn)性表到鏈表,我把帶頭節(jié)點(diǎn)不帶頭結(jié)點(diǎn)的基本操作都盡可能多的實(shí)現(xiàn)了,我們會(huì)發(fā)現(xiàn)帶頭結(jié)點(diǎn)的操作會(huì)方便了好多。接下來(lái),數(shù)據(jù)結(jié)構(gòu)繼續(xù)向前推進(jìn)




另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

標(biāo)題名稱(chēng):循環(huán)鏈表之雙循環(huán)鏈表(C語(yǔ)言版)-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)源:http://chinadenli.net/article14/dhjide.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)網(wǎng)站排名、定制網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、定制開(kāi)發(fā)營(yíng)銷(xiāo)型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)