国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C > 正文

C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)之鏈表實(shí)現(xiàn)代碼

2020-01-26 14:25:14
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

最近在復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),感覺(jué)在初學(xué)的時(shí)候還是有很多東西沒(méi)有掌握,不過(guò)現(xiàn)在終于算是搞得比較有頭緒了,所以就在寫(xiě)出來(lái)和大家一起分享!

什么是鏈表

簡(jiǎn)單的說(shuō),鏈表就是由多個(gè)結(jié)點(diǎn)離散分配,彼此通過(guò)指針相連,每個(gè)結(jié)點(diǎn)只有一個(gè)前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。首節(jié)點(diǎn)無(wú)前驅(qū)結(jié)點(diǎn),為結(jié)點(diǎn)無(wú)后繼結(jié)點(diǎn)的一種存儲(chǔ)結(jié)構(gòu)。

鏈表的結(jié)構(gòu)


頭結(jié)點(diǎn):鏈表的第一個(gè)有效結(jié)點(diǎn)前面的結(jié)點(diǎn),頭結(jié)點(diǎn)并不存放有效數(shù)據(jù),也就是數(shù)據(jù)域?yàn)榭眨宇^結(jié)點(diǎn)的主要目的是為了方便鏈表的操作。

首節(jié)點(diǎn):鏈表的第一個(gè)有效結(jié)點(diǎn),結(jié)點(diǎn)包含數(shù)據(jù)域和指針域。

尾結(jié)點(diǎn):尾結(jié)點(diǎn)的指針域?yàn)榭铡?br />

頭指針:指向頭結(jié)點(diǎn)的指針變量,它存放了頭結(jié)點(diǎn)的地址(在這里注意一下,指針變量存放的是地址,也就是說(shuō)頭指針存放的是

頭結(jié)點(diǎn)的地址,一般通過(guò)頭指針對(duì)鏈表進(jìn)行操作)。

具體實(shí)現(xiàn)

#include<stdio.h>#include<malloc.h>#include<stdlib.h>//定義鏈表節(jié)點(diǎn)typedef struct Node{ int data;  //數(shù)據(jù)域 struct Node * pNext; //指針域}NODE, * PNODE;  //NODE等價(jià)于struct Node, PNODE等價(jià)于struct Node *//函數(shù)聲明PNODE createLinkList(void);    //創(chuàng)建鏈表的函數(shù)void traverseLinkList(PNODE pHead);   //遍歷鏈表的函數(shù)bool isEmpty(PNODE pHead);    //判斷鏈表是否為空的函數(shù)int getLength(PNODE pHead);    //獲取鏈表長(zhǎng)度的函數(shù)bool insertElement(PNODE pHead, int pos, int val); //向鏈表中插入元素的函數(shù),三個(gè)參數(shù)依次為鏈表頭結(jié)點(diǎn)、要插入元素的位置和要插入元素的值bool deleteElement(PNODE pHead, int pos, int * pVal); //從鏈表中刪除元素的函數(shù),三個(gè)參數(shù)依次為鏈表頭結(jié)點(diǎn)、要?jiǎng)h除的元素的位置和刪除的元素的值void sort(PNODE pHead);     //對(duì)鏈表中的元素進(jìn)行排序的函數(shù)(基于冒泡排序)int main(void){ int val;   //用于保存刪除的元素 PNODE pHead = NULL;  //PNODE等價(jià)于struct Node * pHead = createLinkList(); //創(chuàng)建一個(gè)非循環(huán)單鏈表,并將該鏈表的頭結(jié)點(diǎn)地址賦給pHead traverseLinkList(pHead); //調(diào)用遍歷鏈表的函數(shù) if(isEmpty(pHead)) printf("鏈表為空!/n"); else printf("鏈表不為空!/n"); printf("鏈表的長(zhǎng)度為:%d/n", getLength(pHead)); //調(diào)用冒泡排序函數(shù) sort(pHead); //重新遍歷 traverseLinkList(pHead); //向鏈表中指定位置處插入一個(gè)元素 if(insertElement(pHead, 4, 30)) printf("插入成功!插入的元素為:%d/n", 30); else printf("插入失敗!/n"); //重新遍歷鏈表 traverseLinkList(pHead); //刪除元素測(cè)試 if(deleteElement(pHead, 3, &val)) printf("元素刪除成功!刪除的元素是:%d/n", val); else printf("元素刪除失敗!/n"); traverseLinkList(pHead); system("pause"); return 0;}PNODE createLinkList(void){ int length; //有效結(jié)點(diǎn)的長(zhǎng)度 int i; int value; //用來(lái)存放用戶(hù)輸入的結(jié)點(diǎn)的值 //創(chuàng)建了一個(gè)不存放有效數(shù)據(jù)的頭結(jié)點(diǎn) PNODE pHead = (PNODE)malloc(sizeof(NODE)); if(NULL == pHead) { printf("內(nèi)存分配失敗,程序退出!/n"); exit(-1); } PNODE pTail = pHead; //pTail始終指向尾結(jié)點(diǎn) pTail->pNext = NULL; //清空指針域 printf("請(qǐng)輸入您想要?jiǎng)?chuàng)建鏈表結(jié)點(diǎn)的個(gè)數(shù):len = "); scanf("%d", &length); for(i=0;i<length;i++) { printf("請(qǐng)輸入第%d個(gè)結(jié)點(diǎn)的值:", i+1); scanf("%d", &value); PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL == pHead) {  printf("內(nèi)存分配失敗,程序退出!/n");  exit(-1); } pNew->data = value; //向新結(jié)點(diǎn)中放入值 pTail->pNext = pNew; //將尾結(jié)點(diǎn)指向新結(jié)點(diǎn) pNew->pNext = NULL; //將新結(jié)點(diǎn)的指針域清空 pTail = pNew;  //將新結(jié)點(diǎn)賦給pTail,使pTail始終指向?yàn)槲步Y(jié)點(diǎn) } return pHead;}void traverseLinkList(PNODE pHead){ PNODE p = pHead->pNext; while(NULL != p) { printf("%d ", p->data); p = p->pNext; } printf("/n"); return;}bool isEmpty(PNODE pHead){ if(NULL == pHead->pNext) return true; else return false;}int getLength(PNODE pHead){ PNODE p = pHead->pNext;  //指向首節(jié)點(diǎn) int len = 0;   //記錄鏈表長(zhǎng)度的變量 while(NULL != p) { len++; p = p->pNext;  //p指向下一結(jié)點(diǎn) } return len;}void sort(PNODE pHead){ int len = getLength(pHead); //獲取鏈表長(zhǎng)度   int i, j, t;   //用于交換元素值的中間變量 PNODE p, q;   //用于比較的兩個(gè)中間指針變量 for(i=0,p=pHead->pNext ; i<len-1 ; i++,p=p->pNext) { for(j=i+1,q=p->pNext;j<len;j++,q=q->pNext) {  if(p->data > q->data)  {  t = p->data;  p->data = q->data;  q->data = t;  } } } return;}bool insertElement(PNODE pHead, int pos, int val){ int i = 0; PNODE p = pHead; //判斷p是否為空并且使p最終指向pos位置的結(jié)點(diǎn) while(NULL!=p && i<pos-1) { p = p->pNext; i++; } if(NULL==p || i>pos-1) return false; //創(chuàng)建一個(gè)新結(jié)點(diǎn) PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL == pNew) { printf("內(nèi)存分配失敗,程序退出!/n"); exit(-1); } pNew->data = val; //定義一個(gè)臨時(shí)結(jié)點(diǎn),指向當(dāng)前p的下一結(jié)點(diǎn) PNODE q = p->pNext; //將p指向新結(jié)點(diǎn) p->pNext = pNew; //將q指向之前p指向的結(jié)點(diǎn) pNew->pNext = q; return true;}bool deleteElement(PNODE pHead, int pos, int * pVal){ int i = 0; PNODE p = pHead; //判斷p是否為空并且使p最終指向pos結(jié)點(diǎn) while(NULL!=p->pNext && i<pos-1) { p = p->pNext; i++; } if(NULL==p->pNext || i>pos-1) return false; //保存要?jiǎng)h除的結(jié)點(diǎn) * pVal = p->pNext->data; //刪除p后面的結(jié)點(diǎn) PNODE q = p->pNext; p->pNext = p->pNext->pNext; free(q); q = NULL; return true;}

結(jié)尾語(yǔ)

上面實(shí)現(xiàn)的主要是單鏈表,另外還有雙鏈表、循環(huán)鏈表、非循環(huán)鏈表等其他幾種常見(jiàn)鏈表。雙鏈表的特殊性表現(xiàn)在每個(gè)基本結(jié)點(diǎn)有兩個(gè)指針域;循環(huán)鏈表的特性主要表現(xiàn)在,在循環(huán)鏈表中,通過(guò)任何一個(gè)結(jié)點(diǎn)可以找到其他所有結(jié)點(diǎn)。

謝謝大家的閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 嘉荫县| 图木舒克市| 尼勒克县| 鹤峰县| 南木林县| 拜泉县| 明水县| 嘉义县| 卢湾区| 山西省| 海南省| 长兴县| 虞城县| 岑巩县| 明星| 黄龙县| 玛沁县| 南涧| 赤壁市| 西畴县| 诏安县| 社会| 松阳县| 长宁县| 宣威市| 枣强县| 界首市| 景洪市| 宜川县| 涟源市| 越西县| 淳安县| 星子县| 文安县| 南皮县| 廉江市| 林周县| 承德县| 南华县| 广河县| 句容市|