当前位置: 首页 > 知识库问答 >
问题:

插入排序双链表

谷梁裕
2023-03-14

我试图在C中的双向链表上做插入排序。在这种状态下,我的代码让我陷入了一个没有结束的循环,吐出了8和9。

有人能好心解释一下“插入排序”方法是如何设计的吗?

我的链表是设计包含头,上一个,下一个和一些数据。

到目前为止这是我的代码

我的希望破灭了。请帮忙。

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {

int data;
struct Node* next;
struct Node* previous;

}Node;

struct Node* head = NULL;
struct Node* current = NULL;
struct Node* headsorted = NULL;
int l = 0;
int empty = 1;
int length = 0;
int change = 0;

void InsertSort(){

Node* temp = (Node*)malloc(sizeof(struct Node));

temp = head;
current = head->next;

printf("\nInsert Sort begins...\n");

if (head != NULL && head->next != NULL)
{
   for (int i = 1; i < length; i++)
   {
        while(current->data > current->next->data && current->next != NULL && current != NULL)
        {
            temp = current;
            current = current->next;
            current->next = temp;
        }
   }
}
else
{
printf("\nList Error!\n");
}

temp = NULL;

}

void Insert(int x)
{
    Node* temp = (Node*)malloc(sizeof(struct Node));

    temp->data = x;
    temp->next = head;
    temp->previous = NULL;

   if (head != NULL)
   {
       head->previous = temp;
   }
    head = temp;
}

void Print(){

    struct Node* temp = head;
    printf("List is: ");
    while(temp != NULL)
    {
        printf(" %d", temp->data);
        temp = temp->next;
    }
}

int main()
{
    head = NULL;
    FILE * file = fopen("List.txt", "r");

    fscanf(file, "%d", &l);
    while (!feof (file))
    {
        Insert(l);
        fscanf(file, "%d", &l);
        length++;
    }
    fclose(file);

    Print();

    printf("\n\n\n");

    printf("data: %d next: %d   " , head->data, head->next->data);

    InsertSort();

    Print();

    return 0;
}

共有1个答案

龚志
2023-03-14

有人能好心解释一下“插入排序”方法是如何设计的吗?

首先,我建议去掉长度变量,或者至少不要在排序例程中使用它。它是不需要的,依赖它可能会将您的想法过多地转移到数组风格的实现上。当您发现下一个指针为NULL的节点时,您知道您已经到达了列表的末尾。

其次,我重申我的意见,即您没有正确地为双链接列表执行节点交换。任何链表上的节点交换,无论是单链还是双链,都相当于从列表中提取第二个节点,然后在第一个节点之前重新插入。在通常影响三个节点的单链表中:除了交换的两个节点外,第一个节点的前一个节点。在双链表中,它还影响第二个链表的后续链表。在双链接的情况下,这已经够麻烦的了,我建议将其明确地构造为先切除,然后插入。

但我也建议你退一步,从高层次看算法。它的工作原理是依次考虑每个节点,从第二个节点开始,如果有必要,将其删除并重新插入其前面(排序的)子列表中的正确位置。那么,成对交换与此有什么关系呢?没什么。在数组上实现这种排序时,这是一个方便的细节,但是在排序链表时,它会带来不必要的工作。

对于链表,尤其是双链表,我建议实现更直接地分割算法的抽象描述:

  • 维护一个指针,S,指向排序的前导子列表的最后一个节点。最初,这将指向列表头。
  • 如果S指向最后一个节点(可以通过S-判断

实际的代码保留为它想要的练习。

 类似资料:
  • 给我一个指向排序双向链表的头节点的指针和一个插入到列表中的整数。我被告知创建一个节点并将其插入到列表中的适当位置,以保持其排序顺序。头节点可能是NULL。 样本输入 空,数据=2 NULL 样本输出 NULL NULL 我试过上面的问题。但我的程序因超时而终止。在下面的代码中,我做错了什么。假设节点类和主函数已经存在。非常感谢!!

  • 我有一个带有前哨节点的双向链表,我需要用O(n^2)复杂度的插入排序来排序。我已经写了这段代码,但它并没有像它应该的那样工作。 对于插入排序,特别是代码,有什么帮助吗? 大小是我的列表中有多少个元素。我的哨兵有var=-1,所以当我处于头部时我想停止,这就是为什么我使用这个。 和只要我们处于某个位置,它就是真的!=哨兵节点。 在具体的例子中,我的列表中有35个整数: 5 9 1 1 1 1 1 1

  • 因此,我对数据结构很陌生,我在对数组进行排序时,在尝试了几天之后,我偶然发现了双链表的插入排序。我仍然无法理解排序有什么问题,是的,我已经在线检查过,我不能只插入排序,我需要对函数参数中传递的列表进行排序,它的名称是internationSort(Dlinkedlist-arr)。 ` ` 我尝试实现它,但我被困住了,因为处理数组的逻辑有点不同,因为我们正在使用 next 和 prev 指针,这使

  • 本文向大家介绍javascript数据结构之双链表插入排序实例详解,包括了javascript数据结构之双链表插入排序实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript数据结构之双链表插入排序实现方法。分享给大家供大家参考,具体如下: 数组存储前提下,插入排序算法,在最坏情况下,前面的元素需要不断向后移,以便在插入点留出空位,让目标元素插入。 换成链表时,显然无需

  • 我第一次使用链表,必须创建一个可以在双链表末尾插入节点的函数。到目前为止我 Node类按顺序接受要存储的值、要指向的下一个指针的值和上一个指针的值。每当我试图在这里插入节点时,我都会得到一个错误,说有一个未处理的异常,并且在写入位置0x00000008时有访问冲突。 我不完全确定这里出了什么问题,但我认为这与根据错误消息取消引用空指针有关。我真的很感激有人帮忙解决这个问题。

  • 我正在尝试为一个项目创建一个双链接列表容器。我不能使用任何std容器。必须对双链接列表进行排序。以下是我目前的代码: 我遇到的问题是在我的插入函数中。我正在使用调试器,并在以下行插入代码:list.insert(10);。 它正确地进入第一种情况,即head==nullptr并创建节点。当我进入下一行代码(list.insert(20))时,它会用这一行创建一个节点:node*node=newno