新的C语言节点,如何修复结构?

时间:2014-01-28 19:41:21

标签: c struct nodes

我在理解这个问题的整个概念时遇到了问题。令我困惑的主要问题是结构内部结构中的指针......基本上我理解的是我想创建一个节点链。

当我运行此程序时,它会在两秒钟后崩溃。我相信我的结构在 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;
}

3 个答案:

答案 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,但未使用其结果。