[問題] Linked list 想法是否正確

看板C_and_CPP作者 (小朱)時間8年前 (2016/04/11 22:44), 8年前編輯推噓15(15013)
留言28則, 5人參與, 最新討論串1/1
各位前輩大家好 小弟最近自學C語言到資料結構的部分 今天在練習單向的單向鏈結 我用的是 Dev C++來寫 電腦是win7 因為剛進入這個章節所以只是先簡單的 創造節點 連結節點 刪除節點 我預期的動作流程如 http://imgur.com/qYbrYgG
程式碼如下 #include<stdio.h> #include <stdlib.h> struct listNode { char data; struct listNode *nextPtr; }; typedef struct listNode *ListNodePtr; int main(void){ ListNodePtr startptr=NULL;//把startptr指向NULL ListNodePtr ONE_node;//創立第一個節點 ONE_node=(ListNodePtr)malloc(sizeof(listNode));//給定實體空間 startptr=ONE_node;//把startptr指向第一個節點 ONE_node->data=10; ONE_node->nextPtr=NULL;//把第一個節點指向NULL ListNodePtr TWO_node;//創立第二個節點希望把第一個節點指向第二個節點 TWO_node=(ListNodePtr)malloc(sizeof(listNode));//給定實體空間 TWO_node->data=11; TWO_node->nextPtr=NULL;//把第二個節點指向NULL ONE_node->nextPtr=TWO_node;//把第一個節點指向第二個節點 ListNodePtr THREE_node;//創立第三個節點希望第二個節點指向第三個節點 THREE_node=(ListNodePtr)malloc(sizeof(listNode));//給定實體空間 THREE_node->data=13; THREE_node->nextPtr=NULL;//把第三個節點指向NULL TWO_node->nextPtr=THREE_node;//把第二個節點指向地三個節點 ListNodePtr FOUR_node;//創立第四個節點 //希望插在第二個節點和第三個節點中間 FOUR_node=(ListNodePtr)malloc(sizeof(listNode));//給定實體空間 FOUR_node->data=12; TWO_node->nextPtr=FOUR_node;//把第二個節點指向第四個節點 FOUR_node->nextPtr=THREE_node;//把第四個節點只向第三個節點 printf("\n%s",THREE_node->nextPtr); printf("\n%d",THREE_node); printf("\n%d",FOUR_node->nextPtr); ///////////////////////////////////////////////////// //刪除節點 //我希望能刪除第一個節點 startptr=TWO_node;//先把起始位置改成第二個節點 free(ONE_node);//釋放第一個節點 printf("\n%d",ONE_node->data); //這裡輸出的值是-112不知道是否正確 //////////////////////////////////////////////////// //希望能刪除第四個節點 //把第二個節點指向第三個節點 TWO_node->nextPtr=THREE_node; free(FOUR_node);//釋放第四個節點 printf("\n%d",TWO_node->nextPtr); printf("\n%d",THREE_node); printf("\n%d",FOUR_node->nextPtr); } 因為自己練習的所以不太知道這樣做是否正確,想請前輩們幫小弟看一下 感覺這個章節有點困難似懂非懂的,而且這個做法好像有點蠢 再麻煩各位前輩了 萬分感謝!!感激不盡!!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.169.89.201 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1460385882.A.255.html ※ 編輯: sbk8027 (1.169.89.201), 04/11/2016 22:53:00

04/11 22:59, , 1F
typedef struct listNode *ListNodePtr; -> 這行是怎樣?
04/11 22:59, 1F

04/11 23:00, , 2F
typedef應該沒有把struct定義成pointer的能力吧
04/11 23:00, 2F

04/11 23:01, , 3F
樓上漏看 * 了
04/11 23:01, 3F

04/11 23:02, , 4F
04/11 23:02, 4F

04/11 23:15, , 5F
typedef 可不用,重點在宣告指向結構的指標
04/11 23:15, 5F

04/11 23:25, , 6F
你的printf是要prinf節點的值?
04/11 23:25, 6F

04/11 23:43, , 7F
別 free 掉後又再去取值,移到 free 前 @@
04/11 23:43, 7F

04/11 23:47, , 8F
其他感覺還好,會覺得有點蠢會不會是因為你額外又用
04/11 23:47, 8F

04/11 23:47, , 9F
了四個指標去指個別的node?XD
04/11 23:47, 9F

04/11 23:53, , 10F
https://ideone.com/3upCpN 我照你的要求寫的,參考1下
04/11 23:53, 10F

04/11 23:56, , 11F
typedef A B 是把type A取個別名叫B
04/11 23:56, 11F

04/11 23:56, , 12F
可我沒看過typedef A B*的用法,是我太孤陋寡聞?
04/11 23:56, 12F

04/11 23:58, , 13F
少掉typedef我就能理解了....
04/11 23:58, 13F

04/12 00:02, , 14F
typedef A B* 好像函數指標
04/12 00:02, 14F

04/12 00:05, , 15F
typedef A* B
04/12 00:05, 15F

04/12 00:07, , 16F
如果是 typedef A B* 應該會錯吧…
04/12 00:07, 16F

04/12 00:07, , 17F
串列應該最少2個START和NEW,只是要像我第1個連結一樣從頭找
04/12 00:07, 17F

04/12 00:13, , 18F
另外若不要看起來那麼多就寫在函數,傳要加入or刪除的節點
04/12 00:13, 18F

04/12 00:14, , 19F
typedef 的解釋法最簡單的正是把 typedef 去掉
04/12 00:14, 19F

04/12 00:14, , 20F
去掉之後若變成宣告某名為某型態的變數
04/12 00:14, 20F

04/12 00:15, , 21F
這 typedef 即是定此名為此型態的別名
04/12 00:15, 21F

04/12 00:23, , 22F
所以typedef struct listNode *ListNodePtr;
04/12 00:23, 22F

04/12 00:23, , 23F
這裡的*ListNodePtr會是指標還是整個struct?
04/12 00:23, 23F

04/12 00:26, , 24F
A=struct listNode *, B=ListNodePtr
04/12 00:26, 24F

04/12 00:26, , 25F
如果你堅持要說*B的話那它是那個結構無誤XD
04/12 00:26, 25F

04/12 00:27, , 26F
指標吧
04/12 00:27, 26F

04/12 00:32, , 27F
看來我腦殘了,這樣我了了 XD
04/12 00:32, 27F

04/12 23:12, , 28F
感謝各位大大指點迷津!!
04/12 23:12, 28F
文章代碼(AID): #1N2xXQ9L (C_and_CPP)