我在理解这个问题的整个概念时遇到了问题。令我困惑的主要问题是结构内部结构中的指针......基本上我理解的是我想创建一个节点链。
当我运行此程序时,它会在两秒钟后崩溃。我相信我的结构在 main.c 中有问题,因为我自己创建了它,你可以看到我真的是在这里的冰上Bambi ......
的main.c
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include "list.h"
// I guess my struct is not correct
static struct {
LIST node;
int item;
} node;
int main() {
list_create();
list_append(node.node, node.item);
}
list.h
typedef struct node* LIST;
LIST list_create (void);
void list_append (LIST l, int item);
list.c
struct node* list_create() {
struct node* head = (struct node*) malloc(sizeof (struct node));
head->next = NULL;
return head;
}
void list_append(struct node* n, int item)
{
/* Create new node */
struct node* new_node = (struct node*) malloc (sizeof (struct node));
new_node->item = item;
/* Find last link */
while (n->next) {
n = n->next;
}
/* Joint the new node */
new_node->next = NULL;
n->next = new_node;
}
答案 0 :(得分:1)
首先,node用于创建带有 data 的结构,而在此 data 中,你有一个指向另一个struct的指针。
static struct {
LIST node;
int item;
} node;
实际上你的结构不正确。
您必须在开始时使用您的数据创建一个结构,例如:
static struct node{
int item;
};
然后将指针指向类似的结构,但不会有相同的数据=&gt;
static struct node{
struct node *next;
int item;
};
您可以使用此指针操纵其他&amp;其他结构。
我发现你的主要问题是另一个问题:
你调用函数“list_create()”,它返回一个指向结构的指针,但你什么都没有。
你必须创建一个指向struct的指针然后像这样分配它:
int main() {
struct node *list;
list = list_create();
}
答案 1 :(得分:1)
此代码完全有效(您可以将其全部放在一个C文件中;代码中的注释):
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
/* I removed the "static", because what we want is a type,
not a global static variable */
/* This "node" is our list-element. It has a pointer to a next element, and
some data, in this case, an int. */
typedef struct node {
struct node *next;
int item;
} node;
/* For convenience, another type, a pointer to a node. */
typedef node *LIST;
/* Creating a list is as simple as creating a node, and make the "next"
pointer NULL, you got this correct. */
struct node* list_create() {
struct node* head = (struct node*) malloc(sizeof (struct node));
head->next = NULL;
return head;
}
/* Nothing wrong in this append code. */
void list_append(struct node* n, int item)
{
/* Create new node */
struct node* new_node = (struct node*) malloc (sizeof (struct node));
new_node->item = item;
/* Find last link */
while (n->next) {
n = n->next;
}
/* Joint the new node */
new_node->next = NULL;
n->next = new_node;
}
/* I added this to make sure it works :) */
void print_list(LIST l) {
LIST tmp = l;
while (tmp) {
printf("%d\n", tmp->item);
tmp = tmp->next;
}
/* Here are some changes. I create a local LIST (which is basically a pointer
to a node, remember?) and use list_create to initialise it. Then, I call
list_append two times to put some extra data into it.
Works perfectly! */
int main() {
LIST myList = list_create();
list_append(myList, 10);
list_append(myList, 13);
print_list(myList);
}
答案 2 :(得分:0)
您正在调用list_create,但未使用其结果。