在C中为单链表声明主函数中的变量

时间:2015-03-17 17:09:23

标签: c singly-linked-list

我正在做这个单链表程序。我的问题是当我显示列表时,它什么也没显示。我查看了我的代码并发现没有错。当变量是全局变量时,我可以毫无问题地执行此程序。现在我正在尝试使用我的变量是本地的,在主函数中。

  • 是因为我的本地变量吗?
  • 我是否必须返回我在函数中使用的变量?

以下是代码:

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和读取文件工作正常。

3 个答案:

答案 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()中,rlast始终指向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;

行中的某些内容