2
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;
}

我想创建一个从链表中删除节点的函数,首先你必须输入字符串。它应该删除具有汽车类别名称的节点,如输入的字符串。

4

2 回答 2

1

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

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

因此,既然您知道这一点,您就可以创建一个方法...

从头部开始,并具有对当前节点和前一个节点的引用

当您在列表中搜索需要删除的节点时,您会不断地循环当前和以前的节点变量。

当您找到您正在寻找的节点时,您将前一个节点的下一个地址指针设置为您尝试删除的节点的下一个地址指针。

祝楼主好运!

于 2013-02-08T03:04:40.643 回答
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 条件很重要;否则程序将崩溃并且逻辑不会真正起作用——你不能很好地替换不存在的东西。

于 2013-10-28T09:25:35.743 回答