【问题标题】:C - Inserting into linked list in ascending orderC - 以升序插入链表
【发布时间】:2014-03-14 08:37:38
【问题描述】:

我正在尝试创建一个以升序将数字插入到链表中的程序。这是我的插入功能。它适用于插入一些数字,但不适用于其他数字。我认为它与最后一部分有关,但我无法弄清楚。

node* insert(node* head, int value) {

    //check if head hasn't been created
    if (head == NULL) {
        head = malloc(sizeof(node));
        if(head == NULL) {
            printf("Failed to create head node");
            return head;
        }
        head->value = value;
        head->next = NULL;
        return head;
    }

    //create a new node
    node *newNode;
    newNode = malloc(sizeof(node));
    if(newNode == NULL) {
        printf("Failed to create node");
        return newNode;
    }
    newNode->value = value;
    newNode->next = NULL;

    //see if new node should be placed before head
    if (value < head->value) {
        newNode->next = head;
        return newNode;
    }

    //search through to find correct spot and insert the node
    node *temp = NULL;
    temp = head;
    while(temp->next != NULL && temp->value < value) {
        temp = temp->next;
    }
    newNode->next = temp->next;
    temp->next = newNode;
    return head;

}

【问题讨论】:

  • 您能否提供表现符合预期以及不符合预期的输入示例?

标签: c linked-list


【解决方案1】:

如果您首先实现(和测试)函数,例如:push_front()insert()(插入之前)和push_back(),(可能是advance (Node* curr, int steps);)然后简单地考虑所有插入的可能性,即:

  • 空列表(当前节点是第一个,所以只是push_front / back()
  • 迭代 (advance()) 从 head 开始的所有元素,直到:
    • 找到值大于新值的元素,insert() 在它之前。
    • 到达的最后一个元素,push_back()

在你的新函数insert_ordered()中。

【讨论】:

    【解决方案2】:
    //This code of mine works perfectly.
    
    void insertInAscOrder(int val) 
    {
        node *new1;
        node *temp;
        node *previous; 
    
        //create new node
        new1 = (node *)malloc(sizeof(node)); 
    
        //check whether node is created or not
        if(new1 == NULL) 
        {
            printf("Insufficient memory.");
            return;
        }   
    
        //Updating different parts of the node
        new1 -> info = val;
        new1 -> next = NULL;    
    
        //checking whether the node created is only node or not
        if (start == NULL) 
        {       
            start = new1;
        } 
        //If value is less than the value of first node
        else if(val < start -> info) 
        {
            new1 -> next = start;
            start = new1;
        } 
        else 
        {   
            previous = start;
            temp = start -> next;
    
    
                //Go to the position where node is to be inserted
                while(temp != NULL && val > temp -> info) 
                {
                    previous = temp;
                    temp = temp -> next;
                }
    
    
                //Insert the node at particular position
               if(temp == NULL) 
               {
                       previous -> next = new1;
               } 
               else 
               {
                       new1 -> next = temp;
                   previous -> next = new1;
               }
        }
    }
    

    【讨论】:

      【解决方案3】:

      以下部分不好

      //search through to find correct spot and insert the node
      node *temp = NULL;
      temp = head;
      while(temp->next != NULL && temp->value < value) {
          temp = temp->next;
      }
      newNode->next = temp->next;
      temp->next = newNode;
      

      例如像这样修复:

      node *temp ,*prev;
      temp = head;
      while(temp != NULL && temp->value <= value) {
          prev = temp;
          temp = temp->next;
      }
      newNode->next = temp;
      prev->next = newNode;
      

      node *temp ,*prev;
      temp = head->next;
      prev = head;
      while(temp != NULL && temp->value < value) {
          prev = temp;
          temp = temp->next;
      }
      newNode->next = temp;
      prev->next = newNode;
      

      【讨论】:

      • 您好,您能解释一下代码的最后一部分吗?看着它,我有点困惑。因此,基本上您将头指针分配为 prev,将头下一个指针分配为 temp。然后对于 while 循环,您将遍历链表并比较值,如果值较小,则插入它并更新指针节点。那么如果值更大,你通过while循环之后的代码添加它?
      • 是的。例如 list:{1,2,2,3,3,4}, value:3 (case 1) {1,2,2,3,3,, 4} (case 2) {1,2 ,2,, 3,3,4}。
      【解决方案4】:

      您需要在最后一个 while 循环中检查 temp-&gt;next-&gt;value

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-26
        • 2018-03-11
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多