2014-02-10 5 views
0

Я уверен, реализации очереди с помощью связанных списков в C. Вот моя структура -Ошибка реализации очереди с использованием связанного списка в C

typedef struct llist node; 
struct llist 
{ 
    int data; 
    node *next; 
}; 

Я перед проблемой при выполнении push(). Вот мое push() определение -

void push(node *head,int n) 
{ 
    if (head==NULL) 
    { 
     head=(node *)(malloc((sizeof(node)))); 
     head->data=n; 
     head->next=NULL; 
     printf("=>%d\n",head->data); 
    } 
    else 
    { 
     node *ptr; 
     ptr=head; 
     while(ptr->next!=NULL) 
     { 
      ptr=ptr->next; 
     } 
     ptr->next=(node *)(malloc((sizeof(node)))); 
     ptr=ptr->next; 
     ptr->data=n; 
     ptr->next=NULL; 
    } 
    return; 
} 

и вот моя main() функция -

int main() 
{ 
    int choice,n; 
    node *head; 
    head=NULL; 
    while(1) 
    { 
     printf("Enter your choice -\n1. Push\n2. Pop\n3. Exit\n"); 
     scanf("%d",&choice); 
     switch(choice) 
     { 
      case 1: 
       printf("Enter element to push: "); 
       scanf("%d",&n); 
       push(head,n); 
       if (head==NULL)//To check if head is NULL after returning from push() 
       { 
        printf("Caught here!\n"); 
       } 
       break; 
      case 2: 
       pop(head); 
       break; 
      case 3: 
       return 0; 
     } 
    } 
} 

Теперь проблема заключается в том, что после того, как push() выходов в case 1, head снова становится NULL, т.е. Оказавшись здесь! Заявление выполняется. Как это возможно?

+3

Вы изменяете локальную копию списка в 'push()'. Чтобы изменить значение в 'main()', вам нужен двойной указатель. 'push()' должен быть 'void push (node ​​** head, int n)', и везде, где вы используете 'head' в' push() 'вместо этого вы должны использовать' * head', и вы должны передать 'push (& head, n) ', когда вы его вызываете. – leif

+0

'head' в функции' main' и 'head' в' pop' - это две разные переменные. – ajay

ответ

5

Поскольку вы вызываете по значению и вы изменяете значение (в данном случае node * head), значение не сохраняется в main(). Так как указатель

  1. Pass к узлу * головной

    push(&head,n); в main()

    и изменить

    void push(node **head,int n)

  2. Вернуться голова

    node* push(node *head,int n)

    и main():

    head=push(head,n);

0

Просто добавив к принятому ответу, другой вариант был бы объявить переменную голову как глобальные. Затем вам не нужно передавать голову в качестве параметра, чтобы нажать или поп.

+0

Да, я сохранил его как резервный вариант. Но я хотел знать, почему приведенный выше код не работает. Любые способы хорошего предложения. – nsane

Смежные вопросы