我一直在编写一个C程序来处理双向链接列表。但它不适用于Dev Cpp。任何人都可以指出任何错误吗?它一直工作,直到我添加新记录然后崩溃的部分。我猜测scanf()函数存在问题。
//C double-linked list program
struct stu {
int roll,ph,ch,ma;
stu *plink,*nlink;
};
void addstu(stu *p,stu *n) { //add
stu *s;
int roll,ph,ch,ma;
printf("HELLO STUDENT!\nYour roll no.? ");
scanf("%d",&roll);
printf("\nPhysics score? ");
scanf("%d",&ph);
printf("\nChemistry? ");
scanf("%d",&ch);
printf("\nMath? ");
scanf("%d",&ma);
s->roll=roll;
s->ph=ph;
s->ch=ch;
s->ma=ma;
s->plink=p;
s->nlink=n;
}
void remstu(stu *s) { //remove
stu *next;
next->plink=s->nlink;
free(s);
}
// Main function
int main() {
stu *s;
int choice=0, ct=0;
while(choice!=4) {
printf("\n\t\tWELCOME TO RECORDS\n\n1. ADD\n2. REMOVE\n3. SEE\n4. EXIT\nEnter your choice(1-4): ");
scanf("%d",&choice);
switch(choice) {
case 1:
stu *t;
addstu(s,t);
s=t;
free(t);
++ct;
break;
case 2:
remstu(s);
break;
case 3:
for(int i=0;i<ct;++i) {
printf("\n\nRoll no. %d\nPhysics %d\nChemistry %d\nMath %d",s->roll,s->ch,s->ph,s->ma);
s=s->plink;
}
break;
case 4:
exit(0);
break;
default:
printf("Please enter correct choice(1-4)!");
}
}
return 0;
}
答案 0 :(得分:3)
s->roll=roll;
函数s
中的指针addstu()
永远不会被初始化,并且取消引用它会导致未定义的行为,从而导致崩溃。
待办事项
s = malloc(sizeof(struct stu)); /* Allocate memory */
我希望你有
typedef struct stu stu;
答案 1 :(得分:1)
在阅读完代码后,您将看到很多未定义的行为。
以case 1
为例:
stu *t;
addstu(s,t);
s=t;
free(t);
++ct;
第一个问题是,当您致电addstu
时,变量s
未初始化。未初始化(非静态)局部变量具有不确定值,并且实际上似乎是随机的。变量t
也是如此。因此,当在addstu
中时,您将节点链接设置为未初始化的指针。
您调用应创建新节点的addstu
,然后添加到列表中。但是你应该创建的节点会发生什么?没有,它没有从addstu
函数传递,函数甚至没有正确地将它链接到列表中(暂时忽略未初始化的变量),因此不会添加新节点。
然后,您将t
分配给s
,从而初始化s
,但使用不确定的值,因此没有任何真正的更改。
然后,您继续为t
释放内存(即使您没有分配任何内存),并且当时s == t
为s
,这与释放{{1}}。指针的赋值仅复制指针而不是它指向的内存。
代码可能还有很多其他问题,但我只能做到这一点。我建议你重新开始,并用更简单的东西来学习指针和动态内存分配是如何工作的。然后回到这个问题,但在编写任何代码之前,尝试在纸上绘制操作。例如,空列表应该是什么样的?添加第一个节点后会如何?在第二个和第三个节点之后?如果将节点添加到列表末尾,它会如何?到列表的开头?一旦你清楚了解,你就可以开始编写代码了。