【问题标题】:Delete specific element linked list删除特定元素链表
【发布时间】:2020-08-22 20:49:22
【问题描述】:

你能帮我理解为什么这个函数不会删除链表中的特定元素吗?我做错了什么?

typedef struct str_node{
    int data;
    struct str_node *next;
}node;

...
node *head;
head = malloc(sizeof(node));
...

void delete_spec(node *a){
    int num;
    node *tmp;

    tmp = a;
    printf("Insert number to eliminate: ");
    scanf("%d",&num);
    while(tmp!=NULL){
        if(tmp->data == num){
            tmp = tmp->next->next;
        }
        tmp = tmp->next;
    }
}

【问题讨论】:

  • 请说明您是否尝试删除特殊情况,例如列表中的第一个或最后一个。
  • 试试这个方法分析指针问题stackoverflow.com/questions/59097696/…
  • @Boninissimo 提供的除结构定义外的代码没有意义。
  • @Boninissimo 不要编辑代码,因为它会使原始问题无效。此外,它仍然在您编辑的行之后的行上使用tmp->next->next

标签: c struct linked-list singly-linked-list function-definition


【解决方案1】:

delete_spec 无论如何都不会修改输入列表。另外:它不会释放任何内存。

为了真正删除一个节点,你必须: 1.释放它的内存。 2. 修改列表以便更新“下一个”指针。为了更新列表,您必须为删除函数提供头部的地址,以便它也可以修改头部。

类似这样的:

void delete_spec(node **a){
    int num;
    node *tmp;

    if (a == NULL || *a == NULL) return;

    tmp = *a;

    printf("Insert number to eliminate: ");
    scanf("%d",&num);

    if (tmp->data == num)
    {
        *a = (*a)->next;
        free(tmp);
        return;
    }


    while(tmp->next!=NULL){
        if(tmp->next->data == num){
            node* tmp2 = tmp->next;
            tmp->next = tmp->next->next;
            free(tmp2);
        }
        tmp = tmp->next;
    }
}

【讨论】:

  • tmp->next->nextfree(tmp->next); 之后无效。
  • 另外,while 条件应该是while(tmp->next!=NULL)
  • 另外,*a = *a->next; 应该是 *a = (*a)->next;*a = tmp->next;
  • @Boninissimo 因为如果要删除的数字在头部,你将无法修改头部指针,除非你有一个指向它的指针,它是一个指向指针的指针。跨度>
  • @nivpeled 唯一的另一个小问题是如果*aNULL(对于一个空列表),函数将会崩溃。
【解决方案2】:

对于初学者来说,不清楚这里的分配是做什么的

node *head;
head = malloc(sizeof(node));

指针头应初始设置为NULL

node *head = NULL;

并且新节点应由在列表中插入新值的函数插入到列表中。

从列表中删除节点的函数不会发出任何提示。函数的调用者将要求用户指定将从列表中删除的值,然后调用传递指定值的函数。所以函数应该有两个参数:指向头节点的指针和应该从列表中删除的整数值。

函数可以通过以下方式定义

void delete_spec( node **head, int data )
{
    while ( *head != NULL )
    {
        if ( ( *head )->data == data )
        {
            node *tmp = *head;
            *head = ( *head )->next;
            free( tmp );
        }
        else
        {
            head = &( *head )->next;
        }
    }
}     

这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>

typedef struct str_node
{
    int data;
    struct str_node *next;
} node;

int push_front( node **head, int data )
{
    node *new_node = malloc( sizeof( node ) );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->data = data;
        new_node->next = *head;
        *head = new_node;
    }

    return success;
}

void delete_spec( node **head, int data )
{
    while ( *head != NULL )
    {
        if ( ( *head )->data == data )
        {
            node *tmp = *head;
            *head = ( *head )->next;
            free( tmp );
        }
        else
        {
            head = &( *head )->next;
        }
    }
}

void display( node *head )
{
    for ( ; head != NULL; head = head->next )
    {
        printf( "%d -> ", head->data );
    }

    puts( "null" );
}

int main(void) 
{
    node *head = NULL;
    int a[] = { 1, 3, 5, 7, 1, 2, 3, 1 };
    const size_t N = sizeof( a ) / sizeof( *a );

    for ( size_t i = 0; i < N; i++ )
    {
        push_front( &head, a[i] );
    }

    display( head );

    delete_spec( &head, 1 );

    display( head );

    return 0;
}

它的输出是

1 -> 3 -> 2 -> 1 -> 7 -> 5 -> 3 -> 1 -> null
3 -> 2 -> 7 -> 5 -> 3 -> null

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 2022-11-14
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多