日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

关于链表的简单创建和遍历

發(fā)布時(shí)間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于链表的简单创建和遍历 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


這是網(wǎng)上的的源碼:

#include <stdio.h> #include <stdlib.h> #include <malloc.h>// 定義鏈表中的節(jié)點(diǎn) typedef struct node {int member; // 節(jié)點(diǎn)中的成員struct node *pNext; // 指向下一個(gè)節(jié)點(diǎn)的指針 }Node,*pNode;// 函數(shù)聲明 pNode CreateList(); // 創(chuàng)建鏈表函數(shù) void TraverseList(pNode ); // 遍歷鏈表函數(shù)int main() {pNode pHead = NULL; // 定義初始化頭節(jié)點(diǎn),等價(jià)于 struct Node *pHead == NULLpHead = CreateList(); // 創(chuàng)建一個(gè)非循環(huán)單鏈表,并將該鏈表的頭結(jié)點(diǎn)的地址付給pHeadTraverseList(pHead); // 調(diào)用遍歷鏈表函數(shù)return 0; }// 創(chuàng)建鏈表函數(shù) pNode CreateList() {int i; // 用于下面循環(huán)int len; // 用來(lái)存放有效節(jié)點(diǎn)的字?jǐn)?shù)int val; // 用于臨時(shí)存放用戶輸入的數(shù)據(jù)pNode pHead = (pNode)malloc(sizeof(Node)); // 分配一個(gè)不存放有效數(shù)據(jù)的頭結(jié)點(diǎn)pNode pTail = pHead; // 鏈表的最后一個(gè)節(jié)點(diǎn)pTail->pNext = NULL; // 最后一個(gè)節(jié)點(diǎn)的指針置為空printf("請(qǐng)輸入節(jié)點(diǎn)個(gè)數(shù):");scanf("%d",&len);for(i = 0; i < len; i++){printf("第 %d 個(gè)節(jié)點(diǎn)的數(shù)值:",i+1);scanf("%d",&val);pNode pNew = (pNode)malloc(sizeof(Node)); // 為節(jié)點(diǎn)分配空間pNew->member = val; //將用戶輸入的數(shù)據(jù)賦給節(jié)點(diǎn)的成員pTail->pNext = pNew; //將最后一個(gè)節(jié)點(diǎn)的指針指向下一個(gè)新的節(jié)點(diǎn)pNew->pNext = NULL; //將新節(jié)點(diǎn)中的指針置為空pTail = pNew; //將新節(jié)點(diǎn)賦給最后的一個(gè)節(jié)點(diǎn)}return pHead; //返回頭節(jié)點(diǎn)}// 遍歷鏈表函數(shù) void TraverseList(pNode pHead) {pNode p = pHead->pNext; //將頭節(jié)點(diǎn)的指針給予臨時(shí)節(jié)點(diǎn)pwhile(NULL != p) //節(jié)點(diǎn)p不為空,循環(huán){printf("%d ",p->member); p = p->pNext; }printf("\n");return ;}

自己照著視頻敲了一遍,結(jié)果卡在一個(gè)點(diǎn)上

#include<stdio.h> //創(chuàng)建非循環(huán)鏈表 #include<stdlib.h> #include<malloc.h> typedef struct Node { int data; struct Node *pNext; }NODE,*PNODE;//相當(dāng)于直接給了個(gè)*號(hào) struct Node *int main(void) {PNODE pHead =NULL;//相當(dāng)于 struct Node *pHead =Null;先定義清空指針 pHead = create_list();traverse_list(pHead);return 0; }PNODE create_list(void); {int len,i,val;PNODE pHead=(PNODE)malloc(sizeof(Node));//分配pHead pintf("請(qǐng)輸入你要生成幾個(gè)節(jié)點(diǎn)");scanf("%d",&len);PNODE pTail=pHead;pTail->pNext=NULL;for(i=0;i<len;i++){printf("請(qǐng)輸入第%d個(gè)數(shù)",i+1);scanf("%d",&val);PNODE pNew =(PNODE)malloc(sizeof(Node));//分配pNew pNew->data= val;pTail->pNext=pNew;pNew->pNext=NULL;pTail=pNew; }return pHead; }void traverse_list(PNODE pHead) {PNODE p = pHead->pNext; //將頭節(jié)點(diǎn)的指針給予臨時(shí)節(jié)點(diǎn)pwhile(NULL != p) //節(jié)點(diǎn)p不為空,循環(huán){printf("%d ",p->data); p = p->pNext; }printf("\n");return;}


老是說(shuō)定義的函數(shù)類型沖突,哪有沖突啊,不是返回地址型嘛,都是用PNODE的啊,咋就錯(cuò)了呢,比較了一下上面的代碼感覺都一樣就是不知道哪里出了bug,改天再看看。

創(chuàng)造鏈表:先分配內(nèi)存,給數(shù)據(jù)域賦值,將尾結(jié)點(diǎn)指向臨時(shí)節(jié)點(diǎn),再將臨時(shí)節(jié)點(diǎn)指向空,最后將臨時(shí)節(jié)點(diǎn)賦給尾結(jié)點(diǎn)。
就像一條蛇一樣,先創(chuàng)造一個(gè)東西,然后將它吞并,再創(chuàng)造下一個(gè)東西,再吞并。

¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
#######################################################################################

今天我又重新檢查了一遍上面的代碼,一個(gè)一個(gè)比對(duì)終于發(fā)現(xiàn)了問題

首先函數(shù)后面能加分號(hào)嘛?昨天檢查了那么多遍還是沒搞出來(lái),的確是狀態(tài)不好。這么低級(jí)的錯(cuò)誤都沒發(fā)現(xiàn),這個(gè)函數(shù)又不是放在主函數(shù)里的。需要加什么分號(hào)。


其次結(jié)構(gòu)體和主函數(shù)之間是需要添加函數(shù)聲明的,我一直以為這只是個(gè)形式,我以前從來(lái)沒遇到過(guò)函數(shù)還要聲明的情況,函數(shù)不是只能調(diào)用嗎…也只有變量需要聲明吧(手動(dòng)滑稽)!

第三個(gè)錯(cuò)誤就是我把printf給寫漏了一個(gè)字母,這看上去讓人崩潰,幾十行幾百行的代碼,一個(gè)單詞少寫一個(gè)字母也是在所難免的啊,可程序就是不放過(guò)你的這個(gè)錯(cuò)誤,行吧,我認(rèn)了。

可以看到吧,這就是純手打代碼的弊端,錯(cuò)誤率居高不下,找bug找到讓人崩潰。
但還是有點(diǎn)收獲的,自己寫的能讓自己對(duì)這個(gè)程序更加的了解、熟知,對(duì)以前不知道,不注意的地方進(jìn)行補(bǔ)充。
同時(shí)也讓我掌握了一種學(xué)習(xí)方法,就是想不明白的,不要著急,現(xiàn)在不明白,可以存疑留到明天,明天甚至可以再存到后天,只要每天有點(diǎn)感悟就好了。

總結(jié)一下吧

  • 先構(gòu)造結(jié)構(gòu)體
  • 聲明函數(shù)
  • 主函數(shù)
  • 創(chuàng)造鏈表
  • 遍歷鏈表
  • 最難的就是構(gòu)造鏈表了,想明白了,就算你鏈表入門了

    附上我改好后的鏈表(純手打)

    #include<stdio.h> //創(chuàng)建非循環(huán)鏈表 #include<stdlib.h> #include<malloc.h> typedef struct Node { int data; struct Node *pNext; }NODE,*PNODE;//相當(dāng)于直接給了個(gè)*號(hào) struct Node *// 函數(shù)聲明 PNODE create_list(); // 創(chuàng)建鏈表函數(shù) void traverse_list(PNODE); // 遍歷鏈表函數(shù)int main(void) {PNODE pHead =NULL;//相當(dāng)于 struct Node *pHead =Null;先定義清空指針 pHead = create_list();traverse_list(pHead);return 0; }PNODE create_list(void) {int len,i,val;PNODE pHead=(PNODE)malloc(sizeof(NODE));//分配pHead printf("請(qǐng)輸入你要生成幾個(gè)節(jié)點(diǎn)");scanf("%d",&len);PNODE pTail=pHead;pTail->pNext=NULL;for(i=0;i<len;i++){printf("請(qǐng)輸入第%d個(gè)數(shù)",i+1);scanf("%d",&val);PNODE pNew =(PNODE)malloc(sizeof(NODE));//分配pNew pNew->data= val;pTail->pNext=pNew;pNew->pNext=NULL;pTail=pNew; }return pHead; }void traverse_list(PNODE pHead) {PNODE p = pHead->pNext; //將頭節(jié)點(diǎn)的指針給予臨時(shí)節(jié)點(diǎn)pwhile(NULL != p) //節(jié)點(diǎn)p不為空,循環(huán){printf("%d ",p->data); p = p->pNext; }printf("\n");return;}

    至于鏈表的刪除,插入,修改之類的,放到以后學(xué)了,有時(shí)間有心情就會(huì)來(lái)看看,慢慢來(lái)!!!
    試試如何改變字體的顏色
    試試如何改變字體的顏色

    總結(jié)

    以上是生活随笔為你收集整理的关于链表的简单创建和遍历的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。