链表清除节点

时间:2012-12-07 15:50:22

标签: c linked-list

CAR *removing(int *numberofstructures,CAR *first)
{
    char categorytoerase[51];
    CAR *helpnode,*actual;
    int i;
    int number_1=0;
    helpnode=(CAR*)malloc(sizeof(CAR));
    actual=(CAR*)malloc(sizeof(CAR));
    actual=first;
    number_1=*numberofstructures;
    helpnode=NULL;
    scanf("%s",categorytoerase);
    for(i=1;i<=number_1;i++)
    {
        if (actual->znacka==categorytoerase)
        {
            if (helpnode != NULL) {
                helpnode->next=actual->next;
                free((void *)actual);
                actual=helpnode->next;
            }
            else
            {
                first = actual -> next;
                free((void *)actual);
                actual = first;
            }
        }
        else{
            helpnode=actual;
            actual=actual->next;
        }
    }
    return first;
}

我想创建将从链表中删除节点的功能,首先必须输入字符串。它应该擦除那些具有汽车类别名称的节点,如输入的字符串。

2 个答案:

答案 0 :(得分:1)

这看起来很像家庭作业......所以本着那个不为你写答案的鸡巴的精神,我会告诉你删除一个节点的想法。

节点包含其数据和指向下一个节点的地址。

所以既然你知道,你可以创建一个......

的方法

从头开始,并引用当前节点和前一个节点

当您在列表中搜索需要删除的节点时,您经常会这样做 循环当前和以前的节点变量。

当您找到要查找的节点时,请设置前一个节点的下一个地址指针 到您要删除的节点的下一个地址指针。

祝你好运首席!

答案 1 :(得分:0)

AMR是对的。如果您有一个双向链表,那么删除节点会更容易,因此在结构中包含节点的前一个和下一个指针。基本上,这是删除将如何在伪代码中发生(在您找到指向要删除的节点的指针之后):

IF todelete.prev != NULL THEN
   todelete.prev.next = todelete.next
ELSE
   list.head = todelete.next
END IF
IF todelete.next != NULL THEN
   todelete.next.prev = todelete.prev
ELSE
   list.tail = todelete.prev
END IF

FREE todelete

if条件很重要;否则程序会崩溃并且逻辑不起作用 - 你不能很好地替换不存在的东西。