我想删除第一个节点并返回已删除节点的值。但是我得到这个警告:
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;
}