在循环单链表的开头插入节点的函数产生错误:[Warning] assignment from incompatible pointer type
在第21行。
这是什么意思,我该如何修复它?
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int info;
struct node *next;
};
typedef struct Node node;
node *head = NULL;
node *tail = NULL;
void insertAtBeginning()
{
int i;
node *temp = head;
node *NewPtr = NULL;
NewPtr = (node *)malloc(sizeof(node));
printf("\nEnter a value\n");
scanf("%d", &i);
NewPtr -> info = i;
NewPtr -> next = NewPtr; //Line 21
if(head == NULL)
{
head = NewPtr;
NewPtr-> next = NewPtr;
}
else
{
while(temp -> next != head)
{
temp = temp->next;
}
NewPtr -> next = head;
temp -> next = NewPtr;
head = NewPtr;
}
}
字符串
4条答案
按热度按时间fkaflof61#
您混合了类型和
typedef
。struct node
不存在,但您尝试在struct Node
定义中使用它。要解决这个问题,您可以将
node
的typedef
* 放在struct Node
的实际定义 * 之前,并在任何地方使用node
(而不是struct node
,因为它不存在)。字符串
pbpqsu0x2#
您在结构声明中有一个拼写错误
字符串
结构的标记名称为
Node
。所以在这个结构中你要写型
代替了
型
否则这条线
型
引入了一个新的不完整类型说明符
struct node
。但是在任何情况下,函数
insertAtBeginning
的定义都是无效的。该函数完全忘记了在文件作用域中声明的指针tail
和指针head
。型
该函数可以如下所示
型
请注意,除了使用文件作用域指针
head
和tail
之外,还可以声明一个结构,如型
并在main中声明一个结构类型的对象,如
型
因为当函数依赖于全局变量时,这是一种糟糕的方法,而这是可以避免的。
同样,函数的调用者应该传递一个将被添加到列表中的值。
在这种情况下,函数将如下所示
型
在main中调用函数
型
ahy6op9u3#
字符串
这是错误的。尚未定义
struct node
。只有struct Node
。这样就可以了:
型
因为
struct Node
是已知的,所以可以将next
声明为struct Node*
也可以:
型
这里的
node
是struct Node
,因此可以将next
声明为node*
。注意事项
有点跑题了,但是考虑到你正在创建一个链表。列表是节点的列表。节点不是列表。如果你把节点当作一个列表来写代码,你会有额外的工作,代码的意义也会减少。
示例
型
这样我们就不需要全局变量
head
和tail
,代码可以管理任何列表。每个节点都包含一个
Info
对象,它可以是任何对象,因此在声明Node
之前的typedef
可以将Info
转换为任何对象,如型
所以我们有一个
int
列表。而且
insert
接收一个指向元素的指针和一个指向List
的指针,所以很容易在同一段代码中管理多个列表。C示例
型
上面的代码创建了一个列表,并在其中插入了1001个元素。并且每次调用时都不等待用户输入值。
gopyfrb34#
嘿试试这个代码是优化。
字符串
}