我遇到了一个问题,我无法删除具有给定位置的链表的元素。我需要删除一个具有不均匀值的元素(我的列表包括 1 到 100 的数字)。
这是我的两个功能:
void Delete_Node(Queue *queue,int position)
{
Node *oldNode;
Node *NEXT;
Node *prev;
int i;
int deleted_number;
if (position == 1)
{
oldNode = queue->head;
deleted_number = queue->head->value;
queue->head = queue->head->next;
free(oldNode);
queue->size--;
}
else
{
prev = queue->head;
for(i = 1 ; i < position - 1 ; i++)
prev = prev->next;
oldNode = prev->next;
NEXT = prev->next->next;
oldNode = NULL;
prev->next = NEXT;
queue->size--;
}
printf("\nDeleted: %d",deleted_number);
}
void DeleteUneven(Queue *queue)
{
int pos = 1;
Node* temp;
temp = queue->head;
while(1)
{
if (temp!=NULL)
{
if(pos == 1)
{
if(temp->value%2==1)
{
Delete_Node(queue,pos);
temp = queue->head;
pos--;
}
else
temp = temp->next;
pos++;
}
else
{
if(temp->value%2 == 1)
{
Delete_Node(queue,pos);
pos--;
}
else
temp = temp->next;
pos++;
}
}
else
break;
}
}
使用函数后的输出
DeleteUneven(list_of_numbers_form_1_to_100);
是
已删除 1 个 已删除 1 已删除 1 ...
当我尝试将 temp->next 设为 temp->next->next 时,我认为问题出在函数 Delete_Node 中。但我不知道......我仍在学习,这个概念对我来说是新的。
DeleteUneven()
功能存在问题。当 pos != 1
和奇数节点被删除时,代码需要移至队列中的下一个节点,以继续 while 循环的下一次迭代。当偶数节点未被删除时,您正在处理 pos != 1
条件的 else 部分移动到下一个节点的操作。
建议更改:
if (temp!=NULL)
{
if(pos == 1)
{
if(temp->value%2==1)
{
Delete_Node(queue,pos);
temp = queue->head;
pos--;
}
else
temp = temp->next;
pos++;
}
else
{
if(temp->value%2 == 1)
{
temp=temp->next; //save the next node's adress before deleting current node
Delete_Node(queue,pos);
pos--;
}
else
temp = temp->next;
pos++;
}
}