我的代码有麻烦。如您在下面看到的,我必须使用链接列表技术来创建列表。我的问题是,执行该命令后,当在 add()函数外部打印 s-> item 时,程序崩溃。 当我在 add()函数中打印 s-> item 时,它确实会打印正确的数据。为什么 Statistician s 即使它的初始化不在while循环中,也再次变为null?
请不要介意typedef,它们是由我们的讲师提供的,我们必须将其用作基础,因此我们不必更改typedef和struct。
typedef struct node *nodePtr;
struct node {
int item;
nodePtr next;
};
typedef nodePtr Statistician;
Statistician newStatistician(){
Statistician s = (Statistician)malloc(sizeof(Statistician));
s = NULL;
return s;
}
void add(Statistician s, int x){
Statistician newNode = (Statistician)malloc(sizeof(Statistician));
if(s == NULL){ // first node
printf("first");
newNode->next = NULL;
newNode->item = x;
s = newNode;
main(){
int menuChoice, clearDataChoice, x, outputInt, exitChoice, check;
float outputFloat;
Statistician s = newStatistician();
while (TRUE){
printf("\t\t*** STATISTICIAN PROGRAM v1 ***\n\n\n");
printf("Please enter data to be added : ");
x = inputNum();
add(s, x);
printf("%d", s->item);
//... bunch of other code
if(exitChoice==TRUE)
return 0;
else{
printf("\n\nPress any key to continue...");
getch();
system("cls");
fflush(stdin);
continue;
}
}
编辑:添加和主要是2个不同的功能
void add(Statistician s, int x){}
main(){}
答案 0 :(得分:1)
与您的讲师交谈,并请他/她向您解释变量的范围。
此问题的根本原因是Statistician
是node *
。因此,您将指向Statistician
的指针传递给add()
,但是add()
收到了指针本身的私有副本:其变量s
。您正在修改s
的私有副本,但是该修改不会影响s
中的main()
。因此,您在add()
中对私有副本所做的所有更改都会在返回时丢失。
解决此问题的最常用方法(这是C语言中的一种相当常见的模式)是从s
返回add()
的可能已修改的私有副本。因此,您可以将其声明更改为:
Statistician add(Statistician s, int x)
,然后在最底部添加以下内容:
return s;
然后当您在main()
中实际调用它时,将行更改为:
s = add(s, x);
试一试,看看它如何工作。