【问题标题】:Inserting a node in the given position c++在给定位置插入节点c ++
【发布时间】:2016-02-28 23:31:56
【问题描述】:

我在将元素插入单个链表中的给定位置时遇到问题。其实问题只是插入到中间部分, 这是我的插入函数;

void SimpleList::insert (const ItemType & item, int position){        
    Node* prev = NULL;
    Node* curr = NULL;
    Node* newNode = new Node();
    newNode->data = item;

    int tempPos = 0;

    curr = head;

    if(head != NULL){
        while(curr->next != NULL && tempPos != position)
        {
            prev = curr;
            curr = curr->next;
            tempPos++;
        }
        if(position==1)
        {
            newNode->next=head;
            head=newNode;
            size++;

        }
        else if(curr->next == NULL)
        {

            curr->next = newNode;
            last = newNode;
            newNode->next= NULL;
            size++;
        }
        else
        {
            prev->next = newNode;
            newNode->next = curr;
            size++;
        }
    }
    else  {
        last = head = newNode;
        last->next = NULL;
        size++;
    }
}

我的测试代码的输出是;

插入空列表后:应该是 34 34 在开头插入之后:应该是 45, 34 45 34 在中间插入之后:应该是 45, 72, 56, 34 45 34 56 72 在末尾插入后:应为 45、72、56、34、67 45 34 56 72 67

我该如何解决这个问题? 谢谢大家的帮助。

【问题讨论】:

  • 首先尝试先在纸上弄清楚,然后尝试使用您在纸上提出的算法重新实现该功能。然后,如果您遇到问题,请学习如何使用调试器,并逐行浏览代码以查看它的作用。
  • 另外,请尝试创建一个Minimal, Complete, and Verifiable Example,您可以向我们展示,其中包括您如何调用该函数以及使用什么值。
  • 您是否始终如一地使用索引库?从外观上看,位置 0 和位置 1 都会插入到列表的头部,这是一个奇怪的设计决定。

标签: c++ insert linked-list


【解决方案1】:

我猜你的问题是一个家庭作业问题。我将使用作业回答指南来回答:

https://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions

您的 while 循环取决于两件事。

  • 链表的长度,设置prev/curr的值
  • 位置参数值

之后的 if-elseif-else 语句取决于设置 prev/curr 的值和 position 参数值的 while 循环结果。

你必须确保while循环是正确的,然后if-elseif-else语句是正确的。

要确保 while 循环和以下 if-elseif-else 语句正确,请考虑它们在所有组合中是否正确

  • 链表的长度,设置prev/curr的值
  • 位置参数值

链表的长度可以是 0, 1, ... 位置参数值可以是 0, 1, ...

当length=1,position=0时,while循环不迭代,程序执行else if(curr->next == NULL),结果链表有新节点原来的第一个节点之后。

当length=1,position=1时,while循环不迭代,程序执行if(position==1),结果链表有新节点原来的第一个节点。

当length=2,position=0时,while循环不迭代,程序执行elseprev=NULL,所以prev->next 导致分段错误。

当length=2,position=1时,while循环迭代一次,程序执行if(position==1)。结果链表的新节点是 before 原始 first 节点。

当length=2,position=2时,while循环迭代一次,程序执行else if(curr->next == NULL)。结果链表的新节点是 after 原始 second 节点。

以上案例展示了 while 循环和以下 if-elseif-else 语句导致的链表可能不是正确链表的情况。

要解决这个问题,请考虑如何设计 while 循环和 if-elseif-else 语句,以便对于链表长度和位置参数值的所有组合,程序将插入新的节点在正确的位置。

我不太确定在开头插入、在中间插入和在结尾插入的位置参数值。看我的回答后,您可能需要自己验证链表状态。

while 循环和 if-elseif-else 语句中的代码针对链表长度和位置参数值的所有组合运行。设计代码时,请确保代码适用于所有组合。

【讨论】:

    猜你喜欢
    • 2021-02-08
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    相关资源
    最近更新 更多