C++ 在单链表中添加节点(支持前、后、中添加)
我正在尝试编写一个“add”函数,该函数接受节点中保存的值(表示为“n”),以及节点要添加到linkedlist中的位置(表示为“pos”) 我见过有3个独立的add函数的代码——addatstart、addAtMiddle、addAtEnd,但我想要一个add函数来完成所有这些 我已经为add(intn,intpos)编写了代码,但它没有给出我的预期输出 例如,在我的主要观点中,我有: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
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
节点*插入(节点*头部,整数数据,整数位置)
{
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);
}