我一直在尝试,但我得到这个消息'警告:不兼容的指针到整数转换分配给'int'源自'void *' [- int-conversion]node2->data = NULL;
我从讲座中得到了这段代码,所以我确信一些(或大多数)编译器或计算机可以编译这段代码,但我的不起作用。我使用mac os和visual studio代码,似乎NULL导致分割错误:11在我的情况下。我该怎么解决这个问题?
#include <stdio.h>
#include <stdlib.h> // malloc
typedef struct Node
{
struct Node *next;
int data;
} Node;
Node *head;
void freeAll(Node *root)
{
Node *cur = head->next;
while(cur != NULL)
{
Node *next = cur->next;
free(cur);
cur = next;
}
}
int main(void)
{
head = (Node *)malloc(sizeof(Node));
Node *node1 = (Node *)malloc(sizeof(Node));
node1->data = 1;
Node *node2 = (Node *)malloc(sizeof(Node));
node2->data = 2;
head->next = node1;
node1->next = node2;
node2->data = NULL;
Node *cur = head->next;
while (cur != NULL)
{
printf("%d ", cur->data);
cur = cur->next;
}
return 0;
}
这是因为您在node2->data=NULL
处将NULL
赋值为int
的指针值。
警告不是问题所在。问题是链表的最后一个元素并不终止链表。它的next
成员没有赋值,保持未确定的值。
node1->next = node2;
node2->data = NULL; <<==== Error is here
Node *cur = head->next;
while (cur != NULL)
{
printf("%d ", cur->data);
cur = cur->next;
}
return 0;
}
不能用NULL终止链表。可能是打错了应该是
node1->next = node2;
node2->next = NULL;
Node *cur = head->next;
while (cur != NULL)
{
printf("%d ", cur->data);
cur = cur->next;
}
return 0;
}
https://godbolt.org/z/coYbG6
在此语句中
node2->data = NULL;
有一个错别字。必须有
node2->next = NULL;
您还忘记初始化head
节点的数据成员data
。
head = (Node *)malloc(sizeof(Node));
//...
head->next = node1;
定义一个虚拟头节点不是一个好方法。
最好编写一个函数,在列表中插入新节点,而不是"手动"插入。创建节点
注意函数freeAll
可以调用未定义的行为,因为一般情况下,指针head
可以等于NULL
。在这种情况下,在此语句中尝试使用空指针访问内存。
Node *cur = head->next;
函数中也没有使用参数root
。如果您的列表基于全局变量head
(这是一个坏主意),那么可以按照以下方式声明和定义函数
void freeAll( void )
{
while( head != NULL )
{
Node *tmp = head;
head = head->next;
free( tmp );
}
}
不依赖于全局变量的更一般的函数可以这样定义
void freeAll( Node **head )
{
while( *head != NULL )
{
Node *tmp = *head;
*head = ( *head )->next;
free( tmp );
}
}
并被称为
freeAll( &head );
下面是一个示范程序,演示如何定义列表。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
struct Node *next;
int data;
} Node;
int push_back( Node **head, int data )
{
Node *new_node = malloc( sizeof( Node ) );
int success = new_node != NULL;
if ( success )
{
new_node->next = NULL;
new_node->data = data;
while ( *head ) head = &( *head )->next;
*head = new_node;
}
return success;
}
void freeAll( Node **head )
{
while ( *head )
{
Node *tmp = *head;
*head = ( *head )->next;
free( tmp );
}
}
void display( const Node *head )
{
for ( ; head != NULL; head = head->next )
{
printf( "%d -> ", head->data );
}
puts( "null" );
}
int main(void)
{
Node *head = NULL;
const int N = 10;
for ( int i = 0; i < N; i++ )
{
push_back( &head, i + 1 );
}
display( head );
freeAll( &head );
return 0;
}
程序输出为
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> null