C 从双链接列表中删除项目

C 从双链接列表中删除项目,c,list,pointers,C,List,Pointers,我正在尝试编写代码,从双链接列表中删除给定位置的元素。但是,我的代码导致元素没有被删除,而是被垃圾数据替换 我测试了列表中的代码4,5,11,12,6,9,并试图删除第三个元素(11)。结果是4,5767133(垃圾),12,6,9 有人能告诉我下面的代码有什么问题吗 struct L2k{ unsigned int count; struct el_L2k *head; struct el_L2k *tail; }; struct L2k* removeFromPosi

我正在尝试编写代码,从双链接列表中删除给定位置的元素。但是,我的代码导致元素没有被删除,而是被垃圾数据替换

我测试了列表中的代码
4,5,11,12,6,9
,并试图删除第三个元素(11)。结果是
4,5767133(垃圾),12,6,9

有人能告诉我下面的代码有什么问题吗

struct L2k{
    unsigned int count;
    struct el_L2k *head;
    struct el_L2k *tail;
};
struct L2k* removeFromPosition(struct L2k *L2k,int position)
{
    if(position > L2k->count || position < 1)
    {
        printf("No such position\n");
        return L2k;
    }

    int i;
    struct el_L2k *temp = L2k->head;

    for(i=1;i<position;i++)
        temp=temp->next;

    printf("Deleting %d",temp->data);

    if(temp->prev!=NULL)
        temp->prev->next=temp->next;
    else
        L2k->head=temp->next;

    if(temp->next!=NULL)
        temp->next->prev=temp->prev;
    else
        L2k->tail=temp->prev;

    L2k->count--;
    free(temp);
    return L2k;
};
结构L2k{ 无符号整数计数; 结构el_L2k*头部; 结构el_L2k*尾部; }; 结构L2k*removeFromPosition(结构L2k*L2k,内部位置) { 如果(位置>L2k->计数| |位置<1) { printf(“无此类职位”); 返回L2k; } int i; 结构el_L2k*temp=L2k->head; 对于(i=1;不精确; printf(“删除%d”,临时->数据); 如果(临时->上一个!=NULL) 临时->上一个->下一个=临时->下一个; 其他的 L2k->head=temp->next; 如果(临时->下一步!=NULL) 临时->下一步->上一步=临时->上一步; 其他的 L2k->tail=temp->prev; L2k->计数--; 免费(临时); 返回L2k; };
在尝试删除元素之前,列表可能有问题


在删除之前向我们显示格式良好的列表。向我们显示生成列表的代码。向我们显示struct el_L2k的声明。

请尝试使您的签名
void removeFromPosition(struct L2k**,int)

当您在代码中传递第一个参数时,head作为局部变量(具有局部作用域)被复制函数。当函数返回时,作用域结束,默认情况下,变量被转储。这就是为什么您会得到一个值的垃圾,并且指针是完整的。使用指向头部的指针作为第一个参数,并相应地修改代码。您将得到正确的删除


祝你好运!

已经多年没有使用C语言了,也没有很好地遵循你的代码(使用大括号!即使只有一行,它也会在将来节省你的时间).总之,一般的概念是:如果列表中有3个项目,而您想删除第二个项目,请将#1的向下指针设置为#3。将#3的向上指针设置为#1。为#2@mortsahl我想如果我的代码中的其他部分完全按照你说的做,那么你的代码(对我来说)就不清楚了您需要使用意图显示变量名。无论如何,从我之前的3项场景中,一->下一个=下一个->下一个;三->上一个=下一个->上一个。仅此而已。a)垃圾可能被释放了
temp
bit内存b)看起来代码可以正常工作这两件事意味着显示代码可能没有真正遍历列表(而是显示一个旧数组或其他东西)el_L2k是什么?上一个和下一个是什么?这实际上是一个评论,而不是一个答案…@noelicus:我同意,但我不允许发表评论,因为我没有足够的声誉。你是对的,删除前列表有问题。