>我在单个链表中的给定位置插入元素时遇到问题。实际上问题仅在插入中间部分,这是我的插入功能;
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++;
}
}
我的测试代码的输出是;
插入空列表后:应为 3434 开头插入后:应为 45、3445 34 中间插入后:应为45、72、56、3445 34 56 72 在末尾插入后:应为 45、72、56、34、6745 34 56 72 67
我该如何解决这个问题?谢谢大家的帮助。
我想你的问题是家庭作业问题。 我将使用家庭作业回答指南来回答:
https://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions
您的 while 循环取决于 2 件事。
- 链表的长度,用于设置 prev/curr 的值
- 位置参数值
之后的 if-elseif-else 语句取决于设置 prev/curr 值和位置参数值的 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 循环不迭代,程序执行else
。 prev=NULL
,因此prev->next
会导致分割错误。
当 length=2, position=1 时,while 循环迭代一次,程序执行if(position==1)
. 生成的链表具有位于原始第一个节点之前的新节点。
当 length=2, position=2 时,while 循环迭代一次,程序执行else if(curr->next == NULL)
. 生成的链表将新节点放在原始第二个节点之后。
上述情况显示了 while 循环和以下 if-elseif-else 语句导致链表可能不正确的情况。
为了解决这个问题,请考虑如何设计 while 循环和 if-elseif-else 语句,以便对于链表长度和位置参数值的所有组合,程序将在正确的位置插入新节点。
我不太确定在开头插入、在中间插入和在结尾插入的位置参数值。 在查看我的答案后,您可能需要自己验证链表状态。
while 循环和 if-elseif-else 语句中的代码针对链表长度和位置参数值的所有组合运行。 设计代码时,请确保代码适用于所有组合。