C双重挂钩列表计划

时间:2015-06-04 10:58:07

标签: c linked-list

我一直在编写一个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;
}

2 个答案:

答案 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 == ts,这与释放{{1}}。指针的赋值仅复制指针而不是它指向的内存。

代码可能还有很多其他问题,但我只能做到这一点。我建议你重新开始,并用更简单的东西来学习指针和动态内存分配是如何工作的。然后回到这个问题,但在编写任何代码之前,尝试在纸上绘制操作。例如,空列表应该是什么样的?添加第一个节点后会如何?在第二个和第三个节点之后?如果将节点添加到列表末尾,它会如何?到列表的开头?一旦你清楚了解,你就可以开始编写代码了。