【问题标题】:Sorted insert program in a linked list链表中的排序插入程序
【发布时间】:2019-09-27 07:14:13
【问题描述】:

我是数据结构的初学者,现在正在学习链表。 我遇到了一个关于排序插入的程序,其中我有一个 add() 函数来按排序顺序添加节点

         /*Linked List program to add ascending order sorted nodes in     

         the list */
 #include <stdio.h>
  #include <stdlib.h>
enter code here
 struct node {
   int data ;
   struct node link;

 };

 void add(struct node **q,int num){
    struct node *r,*temp = *q;
    r = malloc(sizeof(struct node )); //Data Allocated
    r->data = num;

    if(*q==NULL ||(*q)->data >num){
     *q = r;
     (*q)->link = temp;

    }else{
      while(temp !=NULL){
         if(temp->data <=num &&(temp->link->data >num                    
                                             ||temp->link==NULL)){
             r->link = temp->link;
             temp->link=r;
             return;
         }
          temp = temp->link;
      }

    }

 }

 void main(){
 struct node *p;
 p = NULL;

 }

我希望按升序添加节点,但是当我输入数据时会显示错误。我正在使用代码块在 C 中运行程序

我认为它必须与结束条件 temp->link == null 相关,但我无法确定该部分代码的确切条件。请帮助!

【问题讨论】:

  • '用C'运行程序'——那为什么是C++标签呢?
  • 您正在检查temp !=NULL,但您正在访问temp-&gt;linktemp-&gt;link 可以是 NULL 在这种情况下你有未定义的行为。
  • 另外结构定义错误。也许你想要。 struct node *link;

标签: c linked-list singly-linked-list


【解决方案1】:
  1. 结构struct node 的定义不正确。我认为这是一个错字。应该是struct node *link;

  2. 您遍历循环的条件不正确。如 cmets 中所述,您正在访问 temp-&gt;link,以防它可能是 NULL

  3. 您没有检查要添加的数字大于所有数字并且要添加到列表末尾的条件。

修改后的功能如下。

 void add(struct node **q,int num){
    struct node *r,*temp = *q;
    r = malloc(sizeof(struct node )); //Data Allocated
    r->data = num;
    r->link = NULL;

    if(*q==NULL ||(*q)->data >num){
     *q = r;
     (*q)->link = temp;

    }else{
      while(temp->link !=NULL){
         if(temp->data <=num &&(temp->link->data >num)){
             r->link = temp->link;
             temp->link=r;
             return;
         }
         temp = temp->link;
      }
      temp ->link = r; // add at the end as not added at any other location.
    }
}

【讨论】:

  • 感谢您的帮助!但是除了任何输入错误之外,我想知道我可以在链接列表末尾指定数字的确切逻辑,其中 temp->link 为空,并且必须在列表末尾插入更大的数字
  • 如您所见,没有明确的条件
  • 在上面的代码中,如果退出 while 循环,您将处于列表的末尾,并且该数字大于列表中的所有数字。末尾添加temp -&gt;link = r;
【解决方案2】:

除了Rishikesh Rajeanswer(你需要在struct里面使用一个指针:struct node* link;;你需要检查首先link是否为空,然后访问@ 987654325@),循环可以简化不少:

// advance only, if we need to insert (at least) after temp->link:
while(temp->link && temp->link->data <= num)
{
    temp = temp->link;
}
// once the loop is done, temp points to the last element smaller than num, so:
r->link = temp->link;
temp->link = r;

在while里面,我们不需要检查temp-&gt;data &gt; num;如果之前满足循环条件,我们只重新进入循环,它已经准确地检查了这个条件;仍然是第一个循环运行;但是,在这种情况下,您的 if 在循环之前已经覆盖了条件。

旁注:是否需要在现有元素之后插入新元素?如果没有,在 前面插入 会快一些,你只需将 &lt;= 替换为 &lt; 并将 &gt; 替换为 &gt;=...

【讨论】:

    【解决方案3】:

    你应该使用

    ( temp->link == NULL || temp->link->data > num )
    

    而不是

    ( temp->link->data > num || temp->link == NULL )
    

    因为如果 temp->link 为 NULL,第一个代码会在检查第一个条件后立即返回 true,不会检查第二个条件,因此不会出错。 但是当你像在第二个表达式中那样使用它时,如果 temp->link 为 NULL,你会得到一个错误,因为你试图用代码到达一个 NULL 对象的名为“data”的字段

    temp->link->data
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2014-03-15
      • 2017-10-23
      • 2013-04-04
      相关资源
      最近更新 更多