我是C的新手,并尝试使用这两个结构编写一个在列表开头插入节点的函数:
typedef struct singly_linked_list_node {
char *data;
struct singly_linked_list_node *next;
} node;
typedef struct singly_linked_list_head {
struct node *first;
struct node *last;
int size;
} sin_list;
我的功能是
void insert_at_start(sin_list* list, char *str)
{
int length;
node *newnode;
newnode = malloc(sizeof(node));
length = strlen(str) + 1;
newnode->data = malloc(sizeof(length));
strcpy(newnode->data, str);
newnode->next = list->first;
list->first = newnode;
if (list->last == NULL) list->last = newnode;
}
当我编译时,我收到警告"从不兼容的指针类型[默认启用]"对于最后3行显而易见的是我缺少的东西。
答案 0 :(得分:1)
使用struct singly_linked_list_head
的定义,您对struct
类型使用两个隐式前向声明。这些是
struct node *first;
struct node *last;
此外,您有node
的typedef。类型struct node
永远不会被解析,但只要您只使用指向它的指针,编译器就可以了。在语言C
中,结构名称和typedef有两个不同的名称空间。
使用使用你的typedef修复你的代码:
typedef struct singly_linked_list_head {
node *first;
node *last;
int size;
} sin_list;
编辑分配内存时,应使用str
的长度而不是变量length
的大小来为data
分配内存:
length = strlen(str) + 1;
newnode->data = malloc(sizeof(length));
更改为:
length = strlen(str) + 1;
newnode->data = malloc(length);