2015-03-17 2 views
0

Я делаю эту программу с одиночным соединением. Моя проблема в том, когда я показываю список, он ничего не отображает. Я просмотрел свой код и не нашел ничего плохого. Я могу сделать эту программу без проблем, когда переменные глобальны. Теперь я стараюсь, чтобы мои переменные были локальными, в основной функции.Объявление переменных в основной функции для односвязного списка в C

  • Это из-за моих локальных переменных?
  • Должен ли я возвращать переменные, которые я использовал в функциях?

Вот код:

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 и чтение файла прекрасно работает.

+4

'Я просмотрел свой код и не нашел ничего плохого'. Если вы пройдете через него в отладчике, ваши шансы найти то, что неправильно значительно улучшены. –

+2

Подробнее об отправке аргументов по ссылке, –

+1

Как получить отладчик? –

ответ

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

Вы изменяете копию переменной 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(); 
1

Все переменные в C передаются функции, используя то, что известно как pass by value. Когда вы передаете указатель в качестве аргумента функции, значение указателя (то есть адрес, на который оно указывает) копируется в параметр функции, новую переменную. Если вы измените эту переменную, это не повлияет на переданный указатель в функции вызывающего абонента, так как они представляют собой разные переменные, которые существуют в стеке каждой функции.

Поскольку вы хотите изменить указатель здесь, передайте указатель на указатель (&r). Затем в вызываемой функции присвойте новое значение его разыменованному состоянию, что-то в строках *r = last;