Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在单链表中添加节点(支持前、后、中添加)_C++_Linked List_Nodes_Singly Linked List - Fatal编程技术网

C++ 在单链表中添加节点(支持前、后、中添加)

C++ 在单链表中添加节点(支持前、后、中添加),c++,linked-list,nodes,singly-linked-list,C++,Linked List,Nodes,Singly Linked List,我正在尝试编写一个“add”函数,该函数接受节点中保存的值(表示为“n”),以及节点要添加到linkedlist中的位置(表示为“pos”) 我见过有3个独立的add函数的代码——addatstart、addAtMiddle、addAtEnd,但我想要一个add函数来完成所有这些 我已经为add(intn,intpos)编写了代码,但它没有给出我的预期输出 例如,在我的主要观点中,我有: LinkedList num; num.add(5,1); num.add(6,2); num.add

我正在尝试编写一个“add”函数,该函数接受节点中保存的值(表示为“n”),以及节点要添加到linkedlist中的位置(表示为“pos”)

我见过有3个独立的add函数的代码——addatstart、addAtMiddle、addAtEnd,但我想要一个add函数来完成所有这些

我已经为add(intn,intpos)编写了代码,但它没有给出我的预期输出

例如,在我的主要观点中,我有:

LinkedList num;
num.add(5,1);


num.add(6,2);

num.add(7,2);
num.printList();
我期望的结果是:576,(因为7将被移到第二个位置,然后6将移到第三个位置),除了我得到的结果:567,其中7被添加到第三个位置

另外,我已经编写了Node类和LinkedList类。我一直在这些类中以较小的增量测试我的函数,除add函数外,其他一切似乎都很好

Node * newNode = new Node();

newNode->setValue(n); //Node gets value n

int i=1; //ie. first position is 1, not 0

Node * current = head;

if (current == nullptr) //ie. then new node IS the head
{
    head = newNode;
    head->next=nullptr;
    return;
}

if (current->next==nullptr) //adding to end of list
{

    current->next = newNode;
    newNode->next = nullptr;

}
else //if inserting Node at middle, (neither at beginning or end)
{


    while ( i<pos && current->next != nullptr) //traverse thru list
    {
        current=current->next;
        i = i+1;
    }

    Node * oldNext = current->next; 

    current -> next = newNode;

    newNode -> next = oldNext;



}
Node*newNode=newNode();
新建节点->设置值(n)//节点获取值n
int i=1//第一个位置是1,不是0
节点*电流=头部;
如果(current==nullptr)//ie,那么新节点就是头部
{
头=新节点;
head->next=nullptr;
返回;
}
if(current->next==nullptr)//添加到列表末尾
{
当前->下一步=新节点;
newNode->next=nullptr;
}
else//如果在中间插入节点(不在开头或结尾)
{
while(inxt!=nullptr)//遍历列表
{
当前=当前->下一步;
i=i+1;
}
节点*oldNext=当前->下一步;
当前->下一步=新节点;
newNode->next=oldNext;
}

编译时没有错误消息。

您的while条件有一个小问题,如下所述:

i=1;
while ( i<pos && current->next != nullptr) //traverse thru list
{
    current=current->next;
    i = i+1;
}
这里发生的是旧的下一个节点指向第三个节点,因为当前节点是第二个节点


您需要通过更改循环条件来修复它,以便循环在需要更改的上一个节点的i处停止。

您不需要在末尾写入单独的插入条件。你需要做的就是

  • 首先,检查它是否为头部节点(通过检查位置是否=1)
  • 否则,只需转到比要插入的位置少一个的位置,如插入位置在第5位,则转到第4位,然后执行以下操作。 假设我们通过temp2遍历列表,并且要插入的节点是node temp1。现在temp2位于第4位。所以在temp1->next中放入temp2->next。此时,两者都指向所需的第5个位置。现在只需在temp2->next中通过强temp1断开temp2和position之间的链接。下面是实现
  • 节点*插入(节点*头部,整数数据,整数位置)
    {
    int i;
    NODE*temp1=(NODE*)malloc(sizeof(NODE));
    temp1->data=数据;
    temp1->next=NULL;
    如果(位置==1)
    {
    temp1->next=头部;
    头部=temp1;
    回流头;
    }
    节点*temp2=头部;
    对于(i=0;不精确;
    }
    temp1->next=temp2->next;
    temp2->next=temp1;
    返回(头);
    }
    
    如果用户要求在位置6插入一个节点,并且节点少于五个,那么您应该在哪里插入节点?您应该插入节点吗?如果(当前->下一步==nullptr),如何执行
    If(当前->下一步==nullptr)//添加到列表末尾
    工作?
    当前->下一步
    仅检查节点2。如果列表末尾是节点3怎么办?建议:绘制图片。从空列表开始。绘制未连接的节点。绘制将此节点添加到列表中所需的所有连接。然后在将节点添加到末尾时逐步重新绘制列表,然后在开始时插入一个节点。然后在列表中间插入一个节点。这些图形应该描述所有情况。然后查看您必须执行的步骤中是否存在重复,您可以利用这些重复来减少必须覆盖的不同情况的数量。或者简单地使用指向点的指针呃,将节点存储在列表中的当前地址,并设置下一个指向当前地址的指针是的,即使这样也可以,但我试图指出他可能出错的地方,并让他明白没有丁,你有一个很好的答案,我只是在传递其他信息。(这是一个关于艺术品的杀手级工作——一张8.5x11的纸和一支铅笔是学习列表的最佳方式)下面是一个简短的例子
    current -> next = newNode;
    
    newNode -> next = oldNext;
    
    NODE* insert_n(NODE* head,int data,int position)
    {
        int i;
        NODE* temp1 = (NODE*)malloc(sizeof(NODE));
        temp1->data=data;
        temp1->next = NULL;
        if(position==1)
        {
            temp1->next = head;
    
            head = temp1;
            return head;
        }
        NODE* temp2 = head;
        for(i=0;i<position-2;i++)
        {
            temp2= temp2->next;
        }
        temp1->next =temp2->next;
        temp2->next = temp1;
        return (head);
    }