2011-05-02 41 views
0

在此代碼我在鏈表刪除元素刪除元素在一個單數鏈表

11-> 12-> 13-> 14-> 15-> 12> 16

如果我想刪除12刪除它僅在第一次發生元件即O/p是無線本地環路

11-> 13-> 14-> 15-> 12> 16

,但我想刪除所有發生12次,該怎麼做?

任何人都可以給我一些輸入?

#include<stdio.h> 
    #include<stdlib.h> 
    void insertbeg(); 
    void delpos(); 
    void display(); 
    struct node 
    { 
      int info; 
      struct node *link; 
    }*first=NULL; 

    struct node *create(); 
    int item,key; 
    main() 
    { 
      int choice; 
      while(1) 
      { 
          printf("\nchoices are:\n"); 
          printf("\n1.Insertbeg\n 2.delpos\n 3.display\n 4.exit\n"); 
          printf("Enter U'r choice: "); 
          scanf("%d",&choice); 
          switch(choice) 

          { 
              case 1: insertbeg(); break; 
              case 2: delpos(); break; 
              case 3: display(); break; 
              case 4: exit(1); 
          default: printf("INVALID CHOICE TRY AGAIN\n"); 
          } 
      } 
    } 
    struct node *create() 
    { 
      struct node *new; 
      new=(struct node*)malloc(sizeof(struct node)); 
      return(new); 
    } 
    void insertbeg() 
    { 
      struct node *new; 
      new=create(); 
      printf("Enter element to be inserted: "); 
      scanf("%d",&item); 
      if(first==NULL) 
      { 
          new->info=item; 
          new->link=NULL; 
          first=new; 
      } 
      else 
      { 
          new->info=item; 
          new->link=first; 
          first=new; 
      } 
    } 


    void delpos() 
    { 
      int key; 
      struct node *temp,*prev; 
      if(first==NULL) 
      { 
      printf("LIST IS EMPTY\n"); 
          return; 
      } 
      else 
      { 
          temp=first; 
          printf("Enter the KEY element which is to be deleted: "); 
          scanf("%d",&key); 
         /*  while(temp->info!=key&&temp->link!=NULL) 
        { 
              prev=temp; 
              temp=temp->link; 
          } 
          if(temp->info==key) 
        { 
              prev->link=temp->link; 
              free(temp); 
          } 
          else 
              printf("key element not found in the list\n"); 
      */ 

       while(temp->link != NULL) 
        { 
         if(temp->info == key) 
         { 
         prev->link = temp->link; 
         free(temp); 
         temp = prev->link; 
         temp = temp->link; 
         } 
         else 
          temp = temp->link; 
        } 
      } 
    } 

    void display() 
    { 
      struct node *temp; 
      temp=first; 
      if(temp==NULL) 
      { 
          printf("LIST IS EMPTY\n"); 
          return; 
      } 
      else 
      { 
          printf("Elements in Linked Lists: ");  

      while(temp!=NULL) 
          { 
              printf("%d->",temp->info); 
              temp=temp->link; 
          } 
      } 
    } 

回答

1

我可以發現你的代碼有兩個問題,但沒有一個會出現你的示例輸入問題。

1-

while(temp->link != NULL) 

應該是

while(temp!=NULL) 

2- temp = temp->link;是多餘的

if(temp->info == key) 
{ 
    prev->link = temp->link; 
    free(temp); 
    temp = prev->link; 
    temp = temp->link; 
} 

並跳過一個元素。

+0

做出你告訴了變化,但有一個問題。我輸入的數據是這樣的15-> 13-> 14-> 13-> 12-> 11->這裏我刪除了13,所以O/P我得到的是這樣的15-> 12-> 11-> – raj 2011-05-02 12:03:07

+0

@raj讓我有一個快速檢查 – 2011-05-02 15:10:46

+0

我將它作爲一個新的答案發布,因爲它是完全不同的。 – 2011-05-02 16:49:43

0

從文件中刪除檢查temp->info!=key並使用if在內部執行,同時主體將作爲啓動器。

0

最後,

不要prev需要分配?

我可以看到它分配在註釋掉的部分,但沒有其他地方。如果第一個元素與鍵匹配,顯然需要對其進行空檢查。

0

刪除代碼的主要問題是,第一個元素需要被視爲特例,因爲第一個元素可能是即將被刪除的節點,所以首先可能需要使用新節點進行更新。這個可能可以通過使用像struct node ** temp = &first;這樣的雙指針來解決。不過,我試圖接近您的原始帖子。

// special condition if first should be removed. 
    temp = first; 
    while (temp != NULL && temp->info == key){ 
     first = temp->link; 
     free(temp); 
     temp = first; 
    } 

    // Here temp->info should not be removed(or it is NULL) 
    // lets look at temp->link->info and remove temp->link 
    while (temp!=NULL && temp->link != NULL) { 
     if (temp->link->info == key) { 

      struct node *to_free = temp->link; 
      // temp checks the next node. 
      temp->link = temp->link->link; 
      free(to_free); 
     } else { 
      // next link 
      temp = temp->link; 
     } 
    } 

請注意,prev是不必要的。

1

如果刪除第一個元素,那麼你永遠不會在這裏輸入while(temp->info!=key&&temp->link!=NULL)prev未初始化和prev->link會導致段錯誤(因爲取消引用未初始化的指針)。

所以,你可能會得到在這裏:prev->link=temp->link;

1

我覺得這裏prev->link=temp->link prev是上晃來晃去。 如果它的第一個節點,只需移動鼠標指針以及免費

1

的問題是在delpos:

prev->link=temp->link; 

當你在列表(即11)的第一個元素,前值未設定任何事情。 while循環

while(temp->info!=key&&temp->link!=NULL) 

在這種情況下永遠不會執行,因此prev保持未設置狀態。

另一個問題是,當您刪除列表的第一個元素時,變量首先仍然會指向列表的原始第一個元素,而不是第二個元素。

一個解決辦法是像

... 

temp=first; 
prev=NULL;     /* Added */ 
printf("Enter the KEY element which is to be deleted: "); 
scanf("%d",&key); 
while(temp->info!=key&&temp->link!=NULL) 
{ 
    prev=temp; 
    temp=temp->link; 
} 
if(temp->info==key) 
{ 
    if (prev==NULL)   /* Added */  
     first=temp->link; /* Added */ 
    else     /* Added */ 
     prev->link=temp->link; 
    free(temp); 
} 

... 
+0

用於提出解決方案,但是,我會寫'if(NULL == prev)'並且通常 - 首先是常量,以避免錯誤分配('if(prev = NULL)') – MByD 2011-05-05 06:55:43

+0

當然,我會做一些不同的事情(比如'='周圍留下空格),但我試圖匹配原始代碼的樣式。 – lonerook 2011-05-05 08:15:08