[問題] 鍊結串列

看板C_and_CPP作者 (加權平衡樹)時間8年前 (2016/03/21 02:07), 8年前編輯推噓3(3026)
留言29則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev-c++ 問題(Question): 讀檔放到linklist ,剛開始參考 http://goo.gl/ow34WW 的寫法 用fopen開檔和fgets一行一行取資料,要求記憶體空間用malloc 用dev-c++ 建置和按執行的f10都可以執行也正確,但後來作其他 的做完按exe才發現會當掉,而且是在做第2個節點就出問題 原本: if (startPtr == NULL) { startPtr = newPtr; } else { currentPtr = startPtr; while (currentPtr != NULL) { if (currentPtr->nextPtr == NULL) { currentPtr->nextPtr = newPtr; break; } currentPtr = currentPtr->nextPtr; } } 看起來沒問題雖然每一次都從頭再抓尾巴一次,但都是在第2個節點也就是進else的那個 while當掉 後來改: if(startPtr==NULL){ startPtr=newPtr; currentPtr=newPtr; } else{ currentPtr->nextPtr=newPtr; currentPtr=currentPtr->nextPtr; } 就沒問題了 想不到差在哪,參考的linklist寫法範例也試過沒問題 不過dev-c++在建置和執行沒問題,結果點exe才出問題是為什麼... 補充說明(Supplement): 部分程式碼 struct filemenber{ int number; char school[40]; char major[40]; char day[40]; char level[40]; int howmany; }; struct linkedListNode { struct filemenber data; struct linkedListNode *nextPtr; }; typedef struct linkedListNode LinkedListNode; int main(){ char readline[180]; FILE *openfile; LinkedListNode *startPtr, *newPtr, *currentPtr, *previousPtr; openfile=fopen("example.txt","r"); startPtr=NULL; while(fgets(readline,180,openfile)!=NULL){ newPtr =(LinkedListNode*) malloc(sizeof(LinkedListNode)); 這裡用上面的程式碼 } } 實測放第一個出問題的圖: 點dec-C++內的F10 http://i.imgur.com/UKQ6qN9.jpg
點EXE檔 http://i.imgur.com/ZsWOWN6.jpg
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.57.88.116 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1458497247.A.5AF.html

03/21 07:57, , 1F
你的newPtr是怎麼做的?
03/21 07:57, 1F

03/21 08:22, , 2F
struct xxx{}; main{xxx *newPtr;}
03/21 08:22, 2F

03/21 08:24, , 3F
就是每次都把newPtr接到linklist
03/21 08:24, 3F

03/21 08:27, , 4F
你可以把包含malloc在內的程式碼都放上來嗎?
03/21 08:27, 4F
※ 編輯: WBTs (61.57.88.116), 03/21/2016 09:02:15

03/21 09:06, , 5F
你上面的程式碼寫了currentPtr=startPtr這樣每次current
03/21 09:06, 5F

03/21 09:07, , 6F
都會重新指到頭,而沒辦法繼續接下去
03/21 09:07, 6F

03/21 09:09, , 7F
我有再用WHILE讓current到尾巴阿
03/21 09:09, 7F

03/21 09:33, , 8F
while(currentPtr!=NULL) 當current變成NULL的時候就已經
03/21 09:33, 8F

03/21 09:34, , 9F
沒有意義了
03/21 09:34, 9F

03/21 09:36, , 10F
對不起 我眼殘 上面那個沒有問題 我想問題是在你沒指定
03/21 09:36, 10F

03/21 09:37, , 11F
newPtr的nextPtr 他不一定是NULL
03/21 09:37, 11F

03/21 09:46, , 12F
沒指定不是null嗎? 可是if (currentPtr->nextPtr == NULL)在
03/21 09:46, 12F

03/21 09:47, , 13F
null前時就會跳出吧
03/21 09:47, 13F

03/21 09:51, , 14F
https://goo.gl/HKZang 說的嗎?
03/21 09:51, 14F

03/21 10:57, , 15F
while那邊是我看錯 那邊沒有問題 然後你有確定你的compile
03/21 10:57, 15F

03/21 10:57, , 16F
r有到C99嗎
03/21 10:57, 16F

03/21 11:06, , 17F
我自己會盡量避開這種不確定因素 以免不同編譯器會出問題
03/21 11:06, 17F

03/21 15:37, , 18F
你 newPtr 創建出來之後它的 nextPtr 有沒有設為 NULL
03/21 15:37, 18F

03/21 15:38, , 19F
如果沒有的話在 if curPtr->nextPtr 那邊可能會讀寫到
03/21 15:38, 19F

03/21 15:40, , 20F
非 NULL 的記憶體位址 程式自然就掛了
03/21 15:40, 20F

03/21 16:14, , 21F
我把struct那改初始值為NULL,一樣當掉
03/21 16:14, 21F
※ 編輯: WBTs (61.57.88.116), 03/21/2016 16:23:42

03/21 17:17, , 22F
你初始值是用建構子給的?
03/21 17:17, 22F

03/21 19:19, , 23F
我把struct linkedListNode的nextptr=NULL一樣沒變
03/21 19:19, 23F

03/21 20:01, , 24F
有試過 newPtr 初始化完後再做一行 newPtr->next = NU
03/21 20:01, 24F

03/21 20:01, , 25F
LL; 嗎?
03/21 20:01, 25F

03/21 20:02, , 26F
手機回文NULL被切掉了sorry
03/21 20:02, 26F

03/21 23:08, , 27F
WOW這樣就可以了耶,是因為沒指定所以初始值不一定為NULL嗎?
03/21 23:08, 27F

03/22 00:17, , 28F
沒錯 如果想要避開這個問題的話除了多寫一行 = NULL
03/22 00:17, 28F

03/22 00:18, , 29F
也可以寫建構子 讓它new的時候自動把nextPtr設為NULL
03/22 00:18, 29F
文章代碼(AID): #1MxkRVMl (C_and_CPP)