作者WBTs (加權平衡樹)
看板C_and_CPP
標題[問題] 鍊結串列
時間Mon Mar 21 02:07:25 2016
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1458497247.A.5AF.html
1F:推 suwako: 你的newPtr是怎麼做的? 03/21 07:57
2F:→ WBTs: struct xxx{}; main{xxx *newPtr;} 03/21 08:22
3F:→ WBTs: 就是每次都把newPtr接到linklist 03/21 08:24
4F:→ suwako: 你可以把包含malloc在內的程式碼都放上來嗎? 03/21 08:27
※ 編輯: WBTs (61.57.88.116), 03/21/2016 09:02:15
5F:→ suwako: 你上面的程式碼寫了currentPtr=startPtr這樣每次current 03/21 09:06
6F:→ suwako: 都會重新指到頭,而沒辦法繼續接下去 03/21 09:07
7F:→ WBTs: 我有再用WHILE讓current到尾巴阿 03/21 09:09
8F:→ suwako: while(currentPtr!=NULL) 當current變成NULL的時候就已經 03/21 09:33
9F:→ suwako: 沒有意義了 03/21 09:34
10F:→ suwako: 對不起 我眼殘 上面那個沒有問題 我想問題是在你沒指定 03/21 09:36
11F:→ suwako: newPtr的nextPtr 他不一定是NULL 03/21 09:37
12F:→ WBTs: 沒指定不是null嗎? 可是if (currentPtr->nextPtr == NULL)在 03/21 09:46
13F:→ WBTs: null前時就會跳出吧 03/21 09:47
15F:→ suwako: while那邊是我看錯 那邊沒有問題 然後你有確定你的compile 03/21 10:57
16F:→ suwako: r有到C99嗎 03/21 10:57
17F:→ suwako: 我自己會盡量避開這種不確定因素 以免不同編譯器會出問題 03/21 11:06
18F:推 tuyutd0505: 你 newPtr 創建出來之後它的 nextPtr 有沒有設為 NULL 03/21 15:37
19F:→ tuyutd0505: 如果沒有的話在 if curPtr->nextPtr 那邊可能會讀寫到 03/21 15:38
20F:→ tuyutd0505: 非 NULL 的記憶體位址 程式自然就掛了 03/21 15:40
21F:→ WBTs: 我把struct那改初始值為NULL,一樣當掉 03/21 16:14
※ 編輯: WBTs (61.57.88.116), 03/21/2016 16:23:42
22F:→ suwako: 你初始值是用建構子給的? 03/21 17:17
23F:→ WBTs: 我把struct linkedListNode的nextptr=NULL一樣沒變 03/21 19:19
24F:→ tuyutd0505: 有試過 newPtr 初始化完後再做一行 newPtr->next = NU 03/21 20:01
25F:→ tuyutd0505: LL; 嗎? 03/21 20:01
26F:→ tuyutd0505: 手機回文NULL被切掉了sorry 03/21 20:02
27F:→ WBTs: WOW這樣就可以了耶,是因為沒指定所以初始值不一定為NULL嗎? 03/21 23:08
28F:推 tuyutd0505: 沒錯 如果想要避開這個問題的話除了多寫一行 = NULL 03/22 00:17
29F:→ tuyutd0505: 也可以寫建構子 讓它new的時候自動把nextPtr設為NULL 03/22 00:18