【问题标题】:Insertion Sort functions doesn't list all the elements after sorting插入排序函数在排序后不会列出所有元素
【发布时间】:2015-04-27 22:58:24
【问题描述】:

这是我的插入排序函数:

Student *sort(Student* node) 
{ 
    if (node == NULL || !node->next)
        return node;
    Student *sorted = NULL; 
    while (node != NULL) 
    { 
        Student  *head = node; 
        Student **tail = &sorted; 

        node = node->next;

        while (!(*tail == NULL || head->id < (*tail)->id))
        { 
            tail = &(*tail)->next; 
        }
        head->next = *tail;
        *tail      = head;
    }
    return sorted;
}

因此,如果这应该对 3.3、3.1 和 3.8 进行排序,它会将它们排序为:

3.3 3.8

我不知道第一个元素会发生什么。如果我给它更大的文本集进行排序,它几乎会漏掉一半的文本。

一直在试图弄清楚它为什么这样做。我很确定这是我的排序功能的问题。

写函数。这个函数应该简单地将排序结果写入文件:

 void write(Student* node) { 

  Student * curr = NULL; 
  curr = node;
  FILE *ptr = fopen("student_out.txt", "w");
  if (curr == NULL) 
    { 
      printf("Nothing to list. \n");
      exit(1);
    } 
  int i=0;
  while(curr !=NULL) { 
     fprintf(ptr,"%d, %s, %s, %s, %.2f\n", curr->id, curr->firstname,     curr->lastname, curr->major, curr->gpa);
      curr = curr -> next;   
 } 
return;
}

【问题讨论】:

  • 注意:风格不一致。 (以及,不太重要的缩进)
  • 请向我们展示您的所有代码。您可能认为它在排序中,但很可能在其他地方(例如您的遍历和/或打印代码)。我试过了,但它适用于我尝试过的测试用例。但是我必须弥补Student 结构和测试用例,因为您没有提供这些。如果您仍需要帮助,请发帖 Minimal, Complete, and Verifiable example
  • 在第二个 while 循环之后,您将丢失 head-next ... tail 的跳过部分,head-&gt;next = *tail; BTW:这是插入排序(残缺)。对 LL 进行排序的自然方法是合并排序(需要以某种方式递归)
  • @wildplasser - 如果使用自下而上的合并算法,列表(或数组)的合并排序不需要递归。对于列表,自下而上的归并排序将比自上而下的归并排序更快。

标签: c sorting linked-list insertion-sort


【解决方案1】:

似乎工作正常,问题可能出在打印输出上。用于测试上述案例的示例代码,转换为与 C89 兼容(因为我使用的是 Visual Studio)。我会交换名称头和节点,但我保留它们以匹配原始示例。我还将比较更改为在 (*tail)->id > head->id 时停止(在比较中使用

#include <stdio.h>

typedef struct Student_{
struct Student_ *next;
double id;
}Student;

Student *sort(Student* node) 
{ 
Student *sorted = NULL; 
Student **tail;
Student *head;
    if (node == NULL || !node->next)
        return node;
    while (node != NULL) 
    { 
        head = node; 
        node = node->next;
        tail = &sorted; 
        while (*tail != NULL && (*tail)->id <= head->id)
            tail = &(*tail)->next; 
        head->next = *tail;
        *tail      = head;
    }
    return sorted;
}

int main()
{
Student a[3] = {{&a[1],3.3},{&a[2],3.1},{NULL,3.8}};
Student *b;

    b = sort(a);
    while(b){
        printf("%3.1lf ", b->id);
        b = b->next;
    }
    printf("\n");
    return 0;
}

【讨论】:

  • 测试了我的打印功能。当我不使用我的排序功能时它可以工作。所以它打印出所有的输入。我更改了排序函数的顺序以匹配您的排序,但排序后它仍然没有给我所有元素。我将在原帖中添加我的“写入文件”功能。
  • @tyrell_c - 查看调用排序函数和写入函数的代码会有所帮助。
  • 我主要有它。我调用 sort(node),然后以同样的方式调用 write 函数。
  • @tyrell_c - 所以你有相当于 |写(排序(列表)); |或 |节点 * 排序 = 排序(列表); |写(排序); | ?您可以从我的代码开始,然后一次更改一个部分以匹配您的代码,看看有什么不同。
  • 我将写入函数更改为精确的打印函数,并使用您在 main 中的 while 循环,但它仍然会丢失输入。很有意思。我的问题可能不是排序问题,而是我如何从文件中读取、如何在结构中存储等问题......如果我无法修复它,我可能不得不发布我的所有代码。
猜你喜欢
  • 2012-11-26
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多