C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和雙向鏈表操作
數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的實(shí)現(xiàn)
雙向鏈表中的每一個(gè)結(jié)點(diǎn)都含有兩個(gè)指針域,一個(gè)指針域存放其后繼結(jié)點(diǎn)的存儲(chǔ)地址,另一個(gè)指針域則存放其前驅(qū)結(jié)點(diǎn)的存儲(chǔ)地址。
雙向鏈表結(jié)點(diǎn)的類型描述:
//雙向鏈表的類型描述 typedef int ElemType; typedef struct node{ ElemType data; struct node *prior,*next; }DuLNode,*DuLinkList;
其中,prior域存放的是其前驅(qū)結(jié)點(diǎn)的存儲(chǔ)地址,next域存放的是其后繼結(jié)點(diǎn)的存儲(chǔ)地址。
雙向鏈表有兩個(gè)特點(diǎn):
一是可以從兩個(gè)方向搜索某個(gè)結(jié)點(diǎn),這使得鏈表的某些操作(如插入和刪除)變得比較簡(jiǎn)單; 二是無(wú)論利用前鏈還是后鏈都可以遍歷整個(gè)雙向鏈表。
雙向鏈表的操作基本和單鏈表的操作相同;
1. 頭插法創(chuàng)建帶頭結(jié)點(diǎn)的雙向鏈表Create_DLinkListF(int n)
//頭插法創(chuàng)建帶頭結(jié)點(diǎn)的雙向鏈表 DuLinkList Create_DLinkListF(int n){ DuLinkList L,p; int i = n - 1; ElemType x; //新建頭結(jié)點(diǎn) L = (DuLinkList)malloc(sizeof(DuLNode)); L->prior = NULL; L->next = NULL; //添加第一個(gè)結(jié)點(diǎn) scanf("%d",&x); p = (DuLinkList)malloc(sizeof(DuLNode)); p->data = x; L->next = p; p->prior = L; p->next = NULL; //加入其他結(jié)點(diǎn) while(i > 0){ scanf("%d",&x); p = (DuLinkList)malloc(sizeof(DuLNode)); p->data = x; p->next = L->next; L->next->prior = p; p->prior = L; L->next = p; i--; } return L; }
2. 尾插法創(chuàng)建帶頭結(jié)點(diǎn)的雙向鏈表Create_DLinkListR(int n)
//尾插法創(chuàng)建帶頭結(jié)點(diǎn)的雙向鏈表 DuLinkList Create_DLinkListR(int n){ DuLinkList L,p,lastNode; int i = n - 1; ElemType x; //新建頭結(jié)點(diǎn) L = (DuLinkList)malloc(sizeof(DuLNode)); L->prior = NULL; L->next = NULL; //添加第一個(gè)結(jié)點(diǎn) scanf("%d",&x); p = (DuLinkList)malloc(sizeof(DuLNode)); p->data = x; L->next = p; p->prior = L; p->next = NULL; lastNode = p; //加入其他結(jié)點(diǎn) while(i > 0){ scanf("%d",&x); p = (DuLinkList)malloc(sizeof(DuLNode)); p->data = x; lastNode->next = p; p->prior = lastNode; p->next = NULL; lastNode = p; i--; } return L; }
3. 在指定結(jié)點(diǎn)之前插入新結(jié)點(diǎn)Insert_DLinkListBefore(DuLinkList p,ElemType x)
//在指定結(jié)點(diǎn)之前插入新結(jié)點(diǎn) void Insert_DLinkListBefore(DuLinkList p,ElemType x){ DuLinkList newNode; //判斷結(jié)點(diǎn)p之前的結(jié)點(diǎn)的合法性: if(p->prior == NULL) printf("結(jié)點(diǎn)不合法,不能在該結(jié)點(diǎn)之前插入結(jié)點(diǎn)\n"); else{ newNode = (DuLinkList)malloc(sizeof(DuLNode)); newNode->data = x; newNode->next = p; p->prior->next = newNode; newNode->prior = p->prior; p->prior = newNode; } }
4. 在指定結(jié)點(diǎn)之后插入新結(jié)點(diǎn)Insert_DLinkListAfter(DuLinkList p,ElemType x)
//在指定結(jié)點(diǎn)之后插入新結(jié)點(diǎn) void Insert_DLinkListAfter(DuLinkList p,ElemType x){ DuLinkList newNode; newNode = (DuLinkList)malloc(sizeof(DuLNode)); newNode->data = x; //當(dāng)插入位置是最后一個(gè)結(jié)點(diǎn)之后時(shí) if(p->next == NULL){ p->next = newNode; newNode->prior = p; newNode->next = NULL; } else{ newNode->next = p->next; p->next->prior = newNode; p->next = newNode; newNode->prior = p; } }
5. 刪除指定結(jié)點(diǎn)Delete_DLinkList(DuLinkList p)
//刪除指定結(jié)點(diǎn) void Delete_DLinkList(DuLinkList p){ //如果刪除的是最后一個(gè)元素 if(p->next == NULL) p->prior->next = NULL; else{ p->prior->next = p->next; p->next->prior = p->prior; } free(p); }
6. 后鏈輸出雙向鏈表Print_DLinkListN(DuLinkList L)
//后鏈輸出雙向鏈表 void Print_DLinkListN(DuLinkList p){ while(p != NULL){ printf("%d\t",p->data); p = p->next; } printf("\n"); }
7.前鏈輸出雙向鏈表Print_DLinkListP(DuLinkList p)
//前鏈輸出雙向鏈表 void Print_DLinkListP(DuLinkList p){ while(p != NULL){ printf("%d\t",p->data); p = p-prior; } printf("\n"); }
至于雙向鏈表的其他操作,如定位,和單鏈表的操作類同,不再贅述。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
上一篇:C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的建立與基本操作
欄 目:C語(yǔ)言
下一篇:使用remalloc的注意事項(xiàng)說(shuō)明(必看篇)
本文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和雙向鏈表操作
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1695.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?