2014-01-28 83 views
1

我對理解這個整體概念有困難。混淆了我的主要問題是結構體內部的指針......基本上我所理解的是我想創建一個節點鏈。在C中新增節點,如何修復結構?

當我運行這個程序時,它在兩秒鐘後崩潰。我相信有什麼毛病我的結構main.c中,因爲我已經被自己創造了它,你可以看到我真是小鹿斑比如履薄冰看過來......

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

您正在調用list_create,但未使用其結果。

+0

我應該輸入'node.node = list_create();'?我很迷茫...... – user3241763

1

起初,節點是用於與數據創建一個結構,並在此數據你有一個指向另一個結構。

static struct { 
    LIST node; 
    int item; 
} node; 

其實你的結構是不正確的。

你必須在開始的結構與您的數據,例如創建:

static struct node{ 
    int item; 
}; 

然後把一個指向類似的結構,但不會有相同的數據=>

static struct node{ 
    struct node *next; 
    int item; 
}; 

你將通使用這個指針來操縱其他結構。

我看到你的主要另一個問題:

你調用函數「list_create()」,它返回一個指針結構,但您指定什麼。

,你必須創建一個指向struct然後分配給它這樣的:

int main() { 

struct node *list; 
    list = list_create(); 
} 
+0

好吧,我不完全理解這一點,但爲什麼你不給結構分配一個名稱?我的意思是不應該在這些字符'};'之間存在結構體的名稱,就像這個'}節點;'這樣我可以鍵入'node.item'? – user3241763

+0

有不同的方法來命名一個結構體,第一個是:struct name {};但你可以使用「typedef」。 – Laykker

+0

我見過有人在做這樣的結構'struct node {} head = {0,NULL};'。在我眼中,他們首先創建一個名爲'node'的結構。然後他們將它重命名爲「頭」? :( – user3241763

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); 
} 
+0

哦,事情越來越清晰,但我無法理解在另一個結構內的結構中的指針是如何工作的。我猜那個指針有關於下一個節點的一些信息,不是......? 另外我不知道'typedef struct node * LIST'是什麼。我無法理解它...... – user3241763

+0

「它只是起作用。」這可能是因爲一個指針總是相同的,編譯器並不需要**精確的**類型來指向一個指針。畢竟這只是一個內存地址。 –

+0

'typedef struct node * LIST'分爲三部分:'typedef'告訴編譯器你正在定義一個新類型。 'struct node *'是你定義一個新的新類型的類型,最後'LIST'是typedef的名字。儘管這些都是便利的東西,但是你可以用'struct node *'替換'LIST',代碼運行完全一樣。 –