从头开始删除链表中的节点

时间:2020-05-22 09:07:40

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

我要删除第一个节点并返回已删除节点的值。但是我得到了这个警告:

warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
 example=(**example).next;

因此,我的代码无法正常工作。谁能帮我解决这个问题?谢谢。

struct myStruct {
    int data;
    struct myStruct next;
}

int deleteNode(struct myStruct **example) {
    struct myStruct *temporary;
    if (temporary == NULL) { 
        emptyNode(temporary);   // this function only returns NULL
    }
    temporary = *example;
    example = (**example).next;
    free(temporary);

    return (**example).data;
}

1 个答案:

答案 0 :(得分:1)

此结构声明至少包含两个错字。

cache:
  key: $CI_PROJECT_PATH_SLUG
  untracked: true
  paths:
    - project/node_modules/
  policy: pull

第一个是在大括号后面没有分号。第二个是下一个数据成员必须具有指针类型。

看来你的意思

struct myStruct 
{
  int data;
  struct myStruct next;
}

关于错误消息,然后在此作业中

struct myStruct 
{
  int data;
  struct myStruct *next;
};

左侧操作数的类型为example=(**example).next; ,而右侧操作数的类型为struct myStruct **,并且这些指针类型不兼容。因此,编译器会发出错误消息。

尽管如此,该功能在任何情况下都是无效的,因为您使用的是未初始化的变量,例如

struct myStruct *

该函数的接口是错误的,因为不清楚在调用空列表时该函数返回什么。

可以通过以下方式声明和定义函数。

struct myStruct *temporary;
if(temporary==NULL) 
//...

它可以被调用,如下图所示

int deleteNode( struct myStruct  **example, int *data )
{
    int success = *example != NULL;

    if ( success )
    {
        struct myStruct *temporary = *example;
        *example = ( *example )->next;
        *data = temporary->data;
        free( temporary );
    }

    return success;
}