C 中删除链表中所需元素的问题

问题描述 投票:0回答:1

我遇到了一个问题,我无法删除具有给定位置的链表的元素。我需要删除一个具有不均匀值的元素(我的列表包括 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 中。但我不知道......我仍在学习,这个概念对我来说是新的。

c linked-list
1个回答
0
投票

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++;
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.