我正在做这个单链表程序。我的问题是当我显示列表时,它什么也没显示。我查看了我的代码并发现没有错。当变量是全局变量时,我可以毫无问题地执行此程序。现在我正在尝试使用我的变量是本地的,在主函数中。
以下是代码:
typedef struct room
{
int roomNumber;
struct room *nextRoom;
}room;
room *create_room(int val)
{
room *temp;
temp=(room *)malloc(sizeof(room));
if(temp==NULL)
{
printf("create_room error");
return 0;
}
else
{
temp->roomNumber=val;
temp->nextRoom=NULL;
return temp;
}
}
void room_insert(room *r,room *last)
{
room *temp;
FILE *fp;
int m,f,i;
fp=fopen("room.txt","r");
if(fp==NULL)
{
printf("room_insert error");
}
else
{
fscanf(fp,"%d %d",&m,&f);
for(i=1;i<=m;i++)
{
temp=create_room(i);
if(r==last && r==NULL)
{
r=last=temp;
r->nextRoom=NULL;
last->nextRoom=NULL;
}
else
{
last->nextRoom=temp;
last=temp;
last->nextRoom=NULL;
}
}
}
fclose(fp);
}
void indisp(room *r)
{
room *temp;
if(r==NULL)
{
printf("no node");
}
else
{
/*
for(temp=r;temp!=NULL;temp=temp->nextRoom)
{
printf("%d\t",temp->roomNumber);
}*/
temp=r;
while(temp!=NULL)
{
printf("%d\t",temp->roomNumber);
temp=temp->nextRoom;
}
}
}
void main()
{
room *r=NULL,*last=NULL;
clrscr();
room_insert(r,last);
indisp(r);
getch();
}
list.txt和读取文件工作正常。
答案 0 :(得分:2)
如果我将变量传递给函数,通常我会期望调用函数中的变量不会改变:
void edit(int x) {
x = 1;
}
int main() {
int x = 5;
edit(x);
assert(x == 5);
}
指针也是如此:
void edit(int *x) {
x = malloc(sizeof(int));
}
int main() {
int *x = NULL;
edit(x);
assert(x == NULL);
}
如果我想修改变量,我需要传递一个指向该变量的指针:
void edit(int *x) {
*x = 1;
}
int main() {
int x;
edit(&x);
assert(x == 1);
}
同样,如果我想修改指针,我需要将指针传递给指针:
void edit(int **x) {
*x = malloc(sizeof(int));
**x = 1;
}
int main() {
int *x = NULL;
edit(&x);
assert(x);
assert(*x == 1);
}
您的代码不会这样做。因此,在main()
中,r
和last
始终指向NULL
。
答案 1 :(得分:1)
您正在修改r
中变量room_insert
的副本。这不会改变调用函数main
中的值。更改room_insert
以将列表的头部返回main
。
room* room_insert()
{
room* r = NULL;
room* last = NULL;
// Keep the rest of your code
// ....
return r;
}
将main
中的来电更改为:
r = room_insert();
答案 2 :(得分:1)
C中的所有变量都使用所谓的pass by value
传递给函数。当您将指针作为参数传递给函数时,指针的值(即它指向的地址)将被复制到函数的参数中,这是一个新变量。如果修改此变量,则它不会影响调用函数中传递的指针,因为它们是每个函数堆栈中存在的不同变量。
由于您要在此处修改指针,请将指针传递给指针(&r
)。然后在被调用的函数中,为其解除引用的状态赋值,这是*r = last;