數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實(shí)例代碼
數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取
雙向鏈表是為了滿足更加方便的查找前驅(qū),而付出空間的代價(jià)的一個(gè)數(shù)據(jù)結(jié)構(gòu)。雙向鏈表的節(jié)點(diǎn)定義如下:
typedef struct node
{
int x;
struct node *prior,*next;
}DLNode;
雙向鏈表的空間結(jié)構(gòu)如下圖所示:

雙向鏈表的創(chuàng)建如下:
//創(chuàng)建雙向鏈表
DLNode *create_DList()
{
DLNode *p,*h,*l;
int n,i,x;
h = (DLNode *)malloc(sizeof(DLNode));
h->prior = h; //當(dāng)空的雙向鏈表就像上圖那樣前驅(qū)和后驅(qū)都會(huì)指向自己;
h->next = h;
p = h;
printf("請(qǐng)輸入需要?jiǎng)?chuàng)建雙向鏈表的長(zhǎng)度:");
scanf("%d",&n);
for(i = 0; i < n; i++)
{
printf("請(qǐng)輸入第%d個(gè)數(shù)",i+1);
scanf("%d",&x);
l = (DLNode *)malloc(sizeof(DLNode));
l->x = x;
p->next = l;
l->prior = p;
l->next = h; //注意,l->next鏈接的是頭節(jié)點(diǎn),
h->prior = l; //而頭結(jié)點(diǎn)的前驅(qū)是l。 這樣便構(gòu)成了一個(gè)循環(huán)的雙向鏈表
p = l;
}
return(h); //不要忘記返回鏈表
}
上面綠顏色的字需要注意;
讀取雙向鏈表的代碼如下:
void out_DList(DLNode *l)
{
DLNode *p;
int i;
p = l;
p = p->next;
while(p!=l) //注意條件發(fā)生了變化
{
printf("%5d",p->x);
p = p->next; //不要忘記讓p指向下一個(gè)節(jié)點(diǎn);
}
}
注意:①:由于頭節(jié)點(diǎn)的值為空,所以p = p->next; ②:循環(huán)的條件發(fā)生了變化,因?yàn)檫@是一個(gè)循環(huán)鏈表,鏈表的尾部指向頭部,所以條件是p!=l;
全部代碼如下:
#include<stdio.h>
#include <stdlib.h>
typedef struct node
{
int x;
struct node *prior,*next;
}DLNode;
//函數(shù)聲明
DLNode *create_DList();
void out_DList(DLNode *l);
main()
{
DLNode *l;
l = create_DList();
printf("創(chuàng)建成功!");
out_DList(l);
}
//讀取雙向鏈表
void out_DList(DLNode *l)
{
DLNode *p;
int i;
p = l;
p = p->next;
while(p!=l)
{
printf("%5d",p->x);
p = p->next;
}
}
//創(chuàng)建雙向鏈表
DLNode *create_DList()
{
DLNode *p,*h,*l;
int n,i,x;
h = (DLNode *)malloc(sizeof(DLNode));
h->prior = h;
h->next = h;
p = h;
printf("請(qǐng)輸入需要?jiǎng)?chuàng)建雙向鏈表的長(zhǎng)度:");
scanf("%d",&n);
for(i = 0; i < n; i++)
{
printf("請(qǐng)輸入第%d個(gè)數(shù)",i+1);
scanf("%d",&x);
l = (DLNode *)malloc(sizeof(DLNode));
l->x = x;
p->next = l;
l->prior = p;
l->next = h;
h->prior = l;
p = l;
}
return(h);
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
C++使struct對(duì)象擁有可變大小的數(shù)組(詳解)
下面小編就為大家?guī)硪黄狢++使struct對(duì)象擁有可變大小的數(shù)組(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
Matlab利用遺傳算法GA求解非連續(xù)函數(shù)問題詳解
遺傳算法起源于對(duì)生物系統(tǒng)所進(jìn)行的計(jì)算機(jī)模擬研究。其本質(zhì)是一種高效、并行、全局搜索的方法,能在搜索過程中自動(dòng)獲取和積累有關(guān)搜索空間的知識(shí),并自適應(yīng)地控制搜索過程以求得最佳解。本文將利用其求解非連續(xù)函數(shù)問題,需要的可以參考一下2022-09-09
為什么要學(xué)習(xí)C語(yǔ)言 C語(yǔ)言優(yōu)勢(shì)分析
不止一個(gè)學(xué)生問到我:“老師,為什么我們的應(yīng)用程序設(shè)計(jì)要學(xué)C語(yǔ)言而不是別的?C語(yǔ)言不是已經(jīng)過時(shí)了嗎?如果現(xiàn)在要寫一個(gè)Windows程序,用VB或Dephi開發(fā)多快呀,用C行嗎?退一萬(wàn)步,為什么選擇C而不是C++呢?”2013-07-07
Opencv實(shí)現(xiàn)讀取攝像頭和視頻數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)讀取攝像頭和視頻數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
C語(yǔ)言實(shí)現(xiàn)切片數(shù)組的示例詳解
由于c語(yǔ)言沒有集合類的標(biāo)準(zhǔn)庫(kù),需要用時(shí)只能自己實(shí)現(xiàn),所以本文參考了go語(yǔ)言的slice,找到了一種非常簡(jiǎn)化的動(dòng)態(tài)數(shù)組接口,下面我們就來看看如何在C語(yǔ)言中實(shí)現(xiàn)切片吧2024-03-03
C語(yǔ)言枚舉(enum)和聯(lián)合(union)實(shí)例分享
在本篇文章里小編給大家整理了關(guān)于C語(yǔ)言枚舉(enum)和聯(lián)合(union)實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-03-03

