[问题] 炼结串行

楼主: WBTs (加权平衡树)   2016-03-21 02:07:25
开发平台(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
作者: suwako   2016-03-21 07:57:00
你的newPtr是怎么做的?
楼主: WBTs (加权平衡树)   2016-03-21 08:22:00
struct xxx{}; main{xxx *newPtr;}就是每次都把newPtr接到linklist
作者: suwako   2016-03-21 08:27:00
你可以把包含malloc在内的程式码都放上来吗?你上面的程式码写了currentPtr=startPtr这样每次current都会重新指到头,而没办法继续接下去
楼主: WBTs (加权平衡树)   2016-03-21 09:09:00
我有再用WHILE让current到尾巴阿
作者: suwako   2016-03-21 09:33:00
while(currentPtr!=NULL) 当current变成NULL的时候就已经没有意义了对不起 我眼残 上面那个没有问题 我想问题是在你没指定newPtr的nextPtr 他不一定是NULL
楼主: WBTs (加权平衡树)   2016-03-21 09:46:00
没指定不是null吗? 可是if (currentPtr->nextPtr == NULL)在null前时就会跳出吧是 https://goo.gl/HKZang 说的吗?
作者: suwako   2016-03-21 10:57:00
while那边是我看错 那边没有问题 然后你有确定你的compiler有到C99吗我自己会尽量避开这种不确定因素 以免不同编译器会出问题
作者: tuyutd0505 (Huang Jason)   2016-03-21 15:37:00
你 newPtr 创建出来之后它的 nextPtr 有没有设为 NULL如果没有的话在 if curPtr->nextPtr 那边可能会读写到非 NULL 的内存位址 程式自然就挂了
楼主: WBTs (加权平衡树)   2016-03-21 16:14:00
我把struct那改初始值为NULL,一样当掉
作者: suwako   2016-03-21 17:17:00
你初始值是用建构子给的?
楼主: WBTs (加权平衡树)   2016-03-21 19:19:00
我把struct linkedListNode的nextptr=NULL一样没变
作者: tuyutd0505 (Huang Jason)   2016-03-21 20:01:00
有试过 newPtr 初始化完后再做一行 newPtr->next = NULL; 吗?手机回文NULL被切掉了sorry
楼主: WBTs (加权平衡树)   2016-03-21 23:08:00
WOW这样就可以了耶,是因为没指定所以初始值不一定为NULL吗?
作者: tuyutd0505 (Huang Jason)   2016-03-22 00:17:00
没错 如果想要避开这个问题的话除了多写一行 = NULL也可以写建构子 让它new的时候自动把nextPtr设为NULL

Links booklink

Contact Us: admin [ a t ] ucptt.com