将一个数字插入到已排序的链表中,为什么每次都将数字插入到第二个位置?

Yizhi Hu

我正在做一个关于链表的项目,我在将一个数字插入到一个排序的链表中时遇到了麻烦。每次插入到第二个位置的数字,我都想不通问题出在哪里。这是我的代码:

void insertSort(struct linkedList *n,int num,int *length){                   //insert number to a sort linked list
    node *new = (node *) malloc(sizeof(node));          //create a new node
    new->next=NULL;
    new->data = num;
    while(n!=NULL&&n->data > new->data){             // find which position     num should insert in sorted list
            n = n->next;
    }
    new->next = n->next;          
    n->next= new;       
    length += 1;

}

n 是链表的头部。我初始化 head 指向第一个节点并且没有值。这是我调用此函数的方式:

insertSort(head->next,num,&length);

每次插入到第二个位置的数字。就像我想将 45 插入到已排序的链表 <16,32,72,81,97> 中,插入后,列表将是 <16,45,32,72,81,97>。45 出于某种原因插入到第二个位置。

HS

问题 :

每次插入到第二个位置的数字...

正在发生是因为在这部分代码中:

while(n!=NULL&&n->data > new->data){             // find which position     num should insert in sorted list
        n = n->next;
}
new->next = n->next;          
n->next= new;

您在n->next.

假设你的链表的第一个节点有数据16,现在你想45在链表中插入带有数据的新节点while循环条件将失败,16 > 45评估结果为false

并且while循环之后的语句new->next = n->next;会将新节点的下一个设置为第一个节点的下一个,并将在第一个n->next= new;节点之后插入新节点。因此,新节点每次都插入到第二个位置。

您的功能还有一些问题,insertSort()例如:

  • head向链表中插入节点时,它不跟踪链表的 ,并且,
  • 如果插入的节点是链表的第一个节点会发生什么?在这种情况下,nwillNULL并且在insertSort()afterwhile循环中访问的nextn- new->next = n->next;

查看您给出的示例 - <16,32,72,81,97>,您想按升序插入。你可以做:

struct linkedList *insertSort(struct linkedList *n, int num, int *length) {
    struct linkedList *first_node = n;

    struct linkedList *new_node = malloc(sizeof(struct linkedList));  //create a new node
    new_node->next=NULL;
    new_node->data = num;

    if (first_node == NULL || first_node->data >= new_node->data) {
            new_node->next = first_node;
            first_node = new_node;
    } else {
            struct linkedList *temp = first_node;

            while (temp->next != NULL && temp->next->data < new_node->data) {
                    temp = temp->next;
            }
            new_node->next = temp->next;
            temp->next = new_node;
    }
    *length += 1;

    return first_node;
}

在这里,您可以看到我已将返回类型更改void为,struct linkedList *以便在将新节点插入链表中的适当位置insertSort()后将返回head链表的 。这样你就可以head在每次插入后跟踪链表。你只需要做:

head = insertSort(head, num, &length);

无论您在哪里打电话insertSort()

或者,您可以将head指针的地址传入insertSort()并跟踪它,如果您不想更改 的返回类型insertSort(),如下所示:

void insertSort(struct linkedList **head, int num, int *length) {
    struct linkedList *new_node = malloc(sizeof(struct linkedList));  //create a new node
    new_node->next=NULL;
    new_node->data = num;

    if (*head == NULL || (*head)->data >= new_node->data) {
        new_node->next = *head;
        *head = new_node;
    } else {
        struct linkedList *temp = *head;

        while (temp->next != NULL && temp->next->data < new_node->data) {
                temp = temp->next;
        }
        new_node->next = temp->next;
        temp->next = new_node;
    }
    *length += 1;
}

你可以这样调用insertSort()

insertSort(&head, 32, &length);

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我的插入 python 排序总是将第二个数字放在开头

来自分类Dev

Bash脚本将每行的第一个位置回显到文件中,并显示第二个的名称

来自分类Dev

AngularJS:无法将属性从第一个指令插入到第二个指令。(带示例)

来自分类Dev

jQuery UI可排序的已连接列表项对齐到倒数第二个位置

来自分类Dev

连接两个表,将值插入到第二个表中

来自分类Dev

当第二个表引用第一个表中的主键时,如何将记录插入到两个表中?

来自分类Dev

第一个数字是第二个数字的倍数吗

来自分类Dev

找到匹配项后提取第一个和第二个数字到变量中

来自分类Dev

Excel从第二个数字中减去每个第一个数字

来自分类Dev

如何从第二个位置索引到最后一个到第一个位置?

来自分类Dev

我的程序生成50个随机数,第一个数字在1到2之间,第二个数字在1-3之间。最后一个在1到50之间

来自分类Dev

当第二个数字大于第一个数字时,为什么Mod运算符会返回第一个数字?

来自分类Dev

有没有一种方法可以将列表中的元素插入第二个列表中的第k个位置?

来自分类Dev

将一个文件中的文本插入特定位置的另一个文件中间,而不会丢失第二个文件的内容

来自分类Dev

为什么使用 NonlinearBlockGS 求解器在耦合组中不直接将第一个组件的输出传递到第二个组件的输入?

来自分类Dev

从两个可能的数字(4或7)中获取一个数字并返回第二个数字的函数

来自分类Dev

如果第一个查询已插入第二个查询的数据,我想插入第二个查询的数据

来自分类Dev

正则表达式需要将字母数字字符串与一个数字的最小值相匹配,向前看仅检查第二个位置

来自分类Dev

消除stata中符号后的第一个和第二个数字

来自分类Dev

如何为第一个数组中的每个位置迭代多个数组迭代第二个数组?

来自分类Dev

为什么第二个数字总是0?

来自分类Dev

如何在Java上将整数的第二个数字与最后一个数字相加?

来自分类Dev

从2个数组中获取唯一的数字,第一个方法不起作用,第二个方法不起作用,为什么?

来自分类Dev

jQuery UI可排序连接列表项对齐到倒数第二个位置

来自分类Dev

MFCCs数组中的第二个数字是什么?

来自分类Dev

正确的记录值没有插入到第二个表中

来自分类Dev

将列表中的第二个数字相乘

来自分类Dev

将python列表中的第二个数字相乘

来自分类Dev

如何只在一行中重复第二个数字?

Related 相关文章

  1. 1

    我的插入 python 排序总是将第二个数字放在开头

  2. 2

    Bash脚本将每行的第一个位置回显到文件中,并显示第二个的名称

  3. 3

    AngularJS:无法将属性从第一个指令插入到第二个指令。(带示例)

  4. 4

    jQuery UI可排序的已连接列表项对齐到倒数第二个位置

  5. 5

    连接两个表,将值插入到第二个表中

  6. 6

    当第二个表引用第一个表中的主键时,如何将记录插入到两个表中?

  7. 7

    第一个数字是第二个数字的倍数吗

  8. 8

    找到匹配项后提取第一个和第二个数字到变量中

  9. 9

    Excel从第二个数字中减去每个第一个数字

  10. 10

    如何从第二个位置索引到最后一个到第一个位置?

  11. 11

    我的程序生成50个随机数,第一个数字在1到2之间,第二个数字在1-3之间。最后一个在1到50之间

  12. 12

    当第二个数字大于第一个数字时,为什么Mod运算符会返回第一个数字?

  13. 13

    有没有一种方法可以将列表中的元素插入第二个列表中的第k个位置?

  14. 14

    将一个文件中的文本插入特定位置的另一个文件中间,而不会丢失第二个文件的内容

  15. 15

    为什么使用 NonlinearBlockGS 求解器在耦合组中不直接将第一个组件的输出传递到第二个组件的输入?

  16. 16

    从两个可能的数字(4或7)中获取一个数字并返回第二个数字的函数

  17. 17

    如果第一个查询已插入第二个查询的数据,我想插入第二个查询的数据

  18. 18

    正则表达式需要将字母数字字符串与一个数字的最小值相匹配,向前看仅检查第二个位置

  19. 19

    消除stata中符号后的第一个和第二个数字

  20. 20

    如何为第一个数组中的每个位置迭代多个数组迭代第二个数组?

  21. 21

    为什么第二个数字总是0?

  22. 22

    如何在Java上将整数的第二个数字与最后一个数字相加?

  23. 23

    从2个数组中获取唯一的数字,第一个方法不起作用,第二个方法不起作用,为什么?

  24. 24

    jQuery UI可排序连接列表项对齐到倒数第二个位置

  25. 25

    MFCCs数组中的第二个数字是什么?

  26. 26

    正确的记录值没有插入到第二个表中

  27. 27

    将列表中的第二个数字相乘

  28. 28

    将python列表中的第二个数字相乘

  29. 29

    如何只在一行中重复第二个数字?

热门标签

归档