C语言 从头删除链表中的节点



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

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

此结构声明至少包含两个拼写错误。

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

它可以如下图所示调用

#include <stdio.h>
#include <stdlib.h>
struct myStruct 
{
int data;
struct myStruct *next;
};
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;
}

int main(void) 
{
struct myStruct *head = 0;
//  fill the list
int data;
if ( deleteNode( &head, &data ) )
{
printf( "The deleted value is %dn", data );
}
else
{
puts( "The list is empty." );
}
return 0;
}

相关内容

  • 没有找到相关文章

最新更新