2013-10-08 2 views
1

Я создал простой связанный список, используя c, где мы можем вставлять и удалять элементы в любом месте списка. Код работал правильно, пока я не попытался удалить первый узел, используя следующий код.Почему я не могу удалить первый узел (головной узел) напрямую?

typedef struct l_list 
{ 
    int data,index; 
    struct l_list *next_node; 
}node; 
static int total_node=0; 
node *search(node *,int,node **); 

int main() 
{ 
int choice,key; 
char ans; 
node *new_node,*head, *p_node,*index_change,*cur; 
node *get_node(); 
head=NULL; 


printf("Program for Linked List.\n"); 
do 
{ 
    printf("\n1. Create Node"); 
    printf("\n2. Delete Node"); 
    printf("\n3. Traverse the List"); 
    printf("\n4. Exit"); 
    printf("\nEnter your choice: "); 
    scanf("%d",&choice); 

    switch(choice) 
    { 
     case 1: 
      do 
      { 
       total_node++; 
       new_node=get_node(); 
       printf("\nEnter the data you want to insert: "); 
       scanf("%d",&new_node->data); 

       if(head==NULL) 
       { 
        head=new_node; 
        head->index=1; 
       } 
       else 
       { 
       printf("\nWhich node you want to insert it as:\n"); 
       for(int i=1;i<=total_node;i++) 
       { 
        printf("%d ",i); 
       } 
       printf("==) "); 
       scanf("%d",&key); 
       //printf("\b\b-|-"); 
       if(key==1) 
       { 
        new_node->next_node=head; 
        head=new_node; 
       } 
       else 
       { 
        p_node=search(head,key,&cur); 
        new_node->next_node=p_node->next_node; 
        p_node->next_node=new_node; 
       //p_node=NULL; 
       } 
       new_node->index=key; 
       index_change=new_node->next_node; 
       while(index_change!=NULL) 
       { 
        index_change->index=++key; 
        index_change=index_change->next_node; 
       } 

       } 

       printf("\nDo you want to insert more node in the linked list: [y/n]"); 
       //ans=getch(); 
      }while((ans=getch())=='y'); 

      break; 

//Deletion code. 
case 2: 
      do 
      { 
       if(head==NULL)//head is first node of the list 
       { 
        printf("\nUNDERFLOW!\nThe linked list is already empty.\n"); 
       } 
       else 
       { 
        printf("Which node you want to delete:\n"); 
        for(inti=1;i<=total_node;i++) 
         printf("%d ",i); //total_node=variable taken 
        printf("==) ");  //to track the total no of node 
        scanf("%d",&key); //key=node index to be deleted 
        //printf("\b\b-|-"); 
        if(key==1) 
        { 
     //If we need to delete the first node when only one node is left     
          if(total_node==1) 
          { 
          //p_node=head; 
          head=NULL; 

          } 
       //If we need to delete the first node when more than one node are there 
         else 
          { 
          //p_node=head; 
          head=head->next_node; 
          } 
         total_node--; 
        } 
        else 
        { 
         p_node=search(head,key,&cur);//returns node just before the node to be deleted 
         p_node->next_node=cur->next_node;//cur gets the value of the node that is to be deleted. 
         total_node--; 
        } 
        index_change=p_node->next_node; 
        while(index_change!=NULL)//to change the index of following nodes. 
        { 
         index_change->index=key++; 
         index_change=index_change->next_node; 
        } 
       } 
       printf("\nDo you want to delete more nodes: [y/n]\n"); 
      }while((ans=getch())=='y'); 
case 3: 
     if(head==NULL) 
      printf("\nThe linked list is empty.\n"); 
     else 
     { 
      printf("\nThe elements of linked lists are as follows:\n\n"); 
      p_node=head; 
      while(p_node!=NULL) 
      { 
       printf("[%d]->%d ",p_node->index,p_node->data); 
       p_node=p_node->next_node; 
      } 
     } 
     break; 


    } 
}while(choice!=4); 



return 0; 
} 

    node *get_node() 
    { 
     node *temp1; 
     temp1= new node; 
     temp1->next_node=NULL; 
     return temp1; 
    } 

    node *search(node *head,int key,node **cur) 
    { 
     node *current,*prev; 
     current=head; 
     while(current!=NULL) 
     {     
      if(current->index==key) 
      { 
       return prev; 
      } 
      prev=current; 
      current=current->next_node; 
      *cur=current; 
     } 
     return prev; 
    } 

используя этот код, если я пытаюсь удалить первый узел, программа получает сбой. И когда я использую временную переменную, такую ​​как

if(key==1) 
        { 
         if(total_node==1) 
          { 
          p_node=head; 
          head=NULL; 
          } 
         else 
          { 
          p_node=head; 
          head=p_node->next_node; 
          } 
         total_node--; 
        } 

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

+0

«программа разбивается» -> авария как? пожалуйста, используйте отладчик, чтобы увидеть точную проблему. Кроме того, вы, скорее всего, теряете память - вы не показываете код, в котором создается список, но, скорее всего, вы «новые» некоторые узлы. но в коде, показанном выше, вы никогда не делаете 'delete' для узлов, которые вы удаляете из списка. – codeling

+0

Возможно, вы разделили' head' после назначения 'head = NULL'. –

+0

Должен ли я опубликовать полную программу? – APan

ответ

2

В этой строке:

index_change=p_node->next_node; 

вы разыменования p_node. Но в тех случаях, когда вы удаляете первый узел, вы не устанавливаете значение для p_node. Наблюдение за сбоем, вероятно, связано с тем, что p_node не имеет допустимого адреса памяти.

+0

oops, я пропустил это.Ты прав. – APan

0

В этой строке:

p_node=search(head,key,&cur);//returns node just before the node to be deleted

вы передаете head указатель, который уже установлен в NULL, если вы пытаетесь удалить 1-й узел.

Таким образом, вы не можете разыменовать указатель head внутри функции search, которую ваш код должен делать (как я считаю), так как у вас нет другого способа добраться до начала связанного списка.

+0

, но строка p_node = search (head, key, & cur) не будет доступна, когда голова будет нулевой. Если список имеет по крайней мере одно значение или когда head! = NULL, тогда будет доступна только эта строка. – APan

+0

@AdarshPanicker: Верно, я пропустил это! –

1

Трудно сказать, что происходит без точной ошибки, которую вы получаете, и полной программы.

Одна вещь, которая сразу же выглядит неправильно, заключается в том, что вы присваиваете узлам (ваш struct Linked_List), который включает в себя данные. Это не то, что вы хотите со связанным списком. В связанном списке вы просто хотите изменить указатели, а предотвратить копирование данных.

Кроме того, программа очень плохо структурирована. Рассмотрите возможность перемещения конкретных операций в отдельные функции и записи тестов для каждого из них. Это также позволит вам опубликовать краткий, полный образец кода с вашим вопросом.

Чтобы закрыть ошибку, вы можете использовать отладчик или добавить в свой код инструкции печати, которые расскажут вам, что происходит.

+0

@Pollex Теперь я опубликовал полный код. – APan

+0

Обнаружили ошибку. Да, возможно, если бы я сделал более структурированную программу, я бы сам понял ошибку. Thanx – APan

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