我应该怎么做才能使链表中的最后一个节点参与冒泡排序?

时间:2018-07-22 04:18:10

标签: c pointers data-structures linked-list

我已经写了一个链表程序,我应该编写一个冒泡排序功能,但是最后一个节点似乎不参与冒泡排序。我猜这是因为指针移到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

2 个答案:

答案 0 :(得分:1)

由于sort_list()循环中的条件ptr->next!=NULLfor的内部循环未考虑排序期间的最后一个节点。您应该使用ptr对其进行检查NULL

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

答案 1 :(得分:1)

有几件事需要修复。

  • 主函数的返回值必须为int而不是void
  • 有些对traverse的调用将head作为参数传递,这将导致错误。将traverse函数更新为list参数除外,或者修复这些调用。
  • sort_list函数的内部for循环条件应在ptr == NULL

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

该函数可能更具防御性,如果head恰好是NULL,则在评估new->next != NULL时,第一个for循环将导致分段错误。您可以在函数的开头使用if语句来防止这种情况。

  • 最后一件事是因为正在使用malloc,请确保释放了内存。您将需要遍历列表并释放每个节点。