簡體   English   中英

我應該怎么做才能使鏈表中的最后一個節點參與冒泡排序?

[英]What should I do so that the last node in the linked list participates in bubble sort?

我已經寫了一個鏈表程序,我應該編寫一個冒泡排序功能,但是最后一個節點似乎不參與冒泡排序。 我猜這是因為指針移到NULL並拒絕了最后一個節點數據。 您能否建議我以其他任何方式對鏈表進行排序的方式,這也將有所幫助。

我的代碼是:

#include<stdio.h>
#include<stdlib.h>
typedef struct node_type{
   int data;
   struct node_type *next;
}node;

typedef node *list;
list head;

void traverse()
{
   list temp;
   temp=head;
   printf("\nThe Data is: \n");
   while(temp!=NULL)
   {
      printf("%d\n",temp->data);
      temp=temp->next;
   }
   printf("\n\n");
}

void sort_list()
{
   list new,ptr;
   int temp;
   for(new=head;new->next!=NULL;new=new->next)
   {
       for(ptr=new->next;ptr->next!=NULL;ptr=ptr->next)
       {
           if(new->data > ptr->data)
              {
                  temp=new->data;
                  new->data=ptr->data;
                  ptr->data=temp;
              }  
        }
   }
   traverse();
   }

void main()
      {
         list temp,new;
         head=NULL;
         int n;
         char ch;
         temp=(list) malloc(sizeof(node));
         printf("\nGive data: ");
         scanf("%d",&temp->data);
         head=temp;
         printf("\n");
         printf("Enter more data(y/n): ");
         scanf("\n%c",&ch);
         while(ch=='y')
            {
               new=(list) malloc(sizeof(node));
               printf("Give data: ");
               scanf("%d",&new->data);
               temp->next=new;
               temp=new;
               printf("\nEnter more data(y/n): ");
               scanf("\n%c",&ch);
            }
       temp->next=NULL;
       traverse(head);
       printf("\n\nDo you want to sort the Link-List(y/n): ");
       scanf("\n%c",&ch);
       if(ch=='y')
          { 
             sort_list();
          }
    }

輸入:2 3 1 5 4

輸出:1 2 3 5 4

由於for循環中的條件ptr->next!=NULLsort_list()的內部循環在排序過程中未考慮最后一個節點。 您應該使用NULL檢查它ptr

for(ptr = new->next; ptr != NULL; ptr = ptr->next)
                     ^^^^

有幾件事需要修復。

  • main函數需要具有int not void的返回值。
  • traverse調用,該traversehead作為參數傳遞,這將產生錯誤。 traverse函數更新為list參數以外的任何一種,或者修復這些調用。
  • ptr == NULLsort_list函數的內部for循環條件應結束

     for(ptr=new->next; ptr != NULL; ptr=ptr->next) 

該函數可能更具防御性,如果head恰好是NULL ,則當評估new->next != NULL時,第一個for循環將導致分段錯誤。 您可以在函數的開頭使用if語句來防止這種情況。

  • 最后一件事是因為正在使用malloc ,請確保釋放了內存。 您將需要遍歷列表並釋放每個節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM