2014-09-21 88 views
0

我是C新手,需要創建一個N分支樹,但我無法掌握C的工作方式。在C中創建多分支樹C

到目前爲止,我有這樣的:

#include <stdio.h> 
#include <string.h> 

typedef struct node { 
    char name[50]; 
    char type[50]; // There are two kinds of files: directory and archive 
    int number_archives; 
    struct nodo *next; 
    struct nodo *son; 
}NODE; 

void create_Archive (NODO *ptr,char name[50]){ // ptr points to the node where I'll add the son 
    NODE new_Node = {name,"Archive",0,NULL,NULL}; 
    ptr->son = &new_Node; 
} 

當我嘗試編譯我得到這些警告

filetree.c:15:3: warning: initialization makes integer from pointer without a cast [enabled by default] 
NODE new_node = {name,"Archive",0,NULL,NULL}; 

filetree.c:15:3: warning: (near initialization for ‘new_node.name[0]’) [enabled by default] 
filetree.c:15:3: warning: initialization makes integer from pointer without a cast [enabled by default] 
filetree.c:15:3: warning: (near initialization for ‘new_node.name[1]’) [enabled by default] 
filetree.c:15:3: warning: initialization makes integer from pointer without a cast [enabled by default] 

如何使程序命名歸檔它在參數給出的同樣的方式的程序?

說我總是遇到另一個錯誤是,當我嘗試使用功能malloc, 例如:

number = (int*)malloc(sizeof(int)); 

我得到警告:

filetree.c:18:21: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default] 
    number = (int*) malloc (sizeof(int)); 
+0

首先得到一個新的鍵盤或學會校對。其次,您需要了解一個值和一個指向某個值的指針之間的差異,這就是所有錯誤的來源。 – stark 2014-09-21 00:44:40

回答

0

在顯示的函數中有多個問題。一個主要是人爲的問題是,您不完全翻譯nodonode(和NODONODE);這很容易修復,並且給你留下了:

void create_Archive(NODE *ptr, char name[50]) 
{ 
    NODE new_Node = { name, "Archive", 0, NULL, NULL }; 
    ptr->son = &new_Node; 
} 

問題1正在被編譯器大聲報告;你不能通過複製像name這樣的指針來初始化像new_Node.name這樣的數組。您需要使用strcpy()

的第二個問題是,你創建一個局部變量,然後指向它的指針存儲在ptr->son,但是當函數退出時,指針變爲無效,用於new_Node空間將很快被用於其他目的。這只是未定義的行爲。

您確實需要使用動態內存分配來解決此問題。無論何時您使用malloc()或其親屬之一,您必須包括<stdlib.h> - 這是一個必要條件。這將解決您報告的其他問題。把這個在一起,你結束了:

#include <stdlib.h> 

void create_Archive(NODE *ptr, char name[50]) 
{ 
    NODE *new_Node = (NODE *)malloc(sizeof(*new_Node)); 
    if (new_Node != NULL) 
    { 
     *new_Node = (NODE){ "", "Archive", 0, NULL, NULL }; 
     strcpy(new_Node.name, name); 
    } 
    ptr->son = new_Node; 
} 

本採用了C99「複合文字」(這是(NODE){ … }符號)。如果你不想使用,那麼你就需要使用更多的東西一樣:

void create_Archive(NODE *ptr, char name[50]) 
{ 
    NODE *new_Node = (NODE *)malloc(sizeof(*new_Node)); 
    if (new_Node != NULL) 
    { 
     strcpy(new_Node->name, name); 
     strcpy(new_Node->type, "Archive"); 
     new_Node->number_archives = 0 
     new_Node->next = NULL; 
     new_Node->sone = NULL; 
    } 
    ptr->son = new_Node; 
} 

當使用malloc()或相關的功能,重要的是要檢查返回值,也不要取消引用指針如果它是NULL。

我注意到,在下面的單詞中用下劃線分隔單詞和首字母大寫的符號是一種不尋常的混合符號。名稱createArchivecreate_archive是正常的約定。除了通常不被使用外,它沒有任何危害。

有些人會爲casting the result of malloc()排除我(和你),如圖所示。鑑於您在代碼中不可靠包含<stdlib.h>,您應該聽從這些人的意見,直到您使用選項編譯代碼,以避免編寫代碼。我可以使用它,因爲我總是選項,如編譯:

gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \ 
    -Wold-style-definition -Werror -c node.c 

,如果我省略<stdlib.h>,有會是一個編譯錯誤。直到你可以自信地說你總是用相同的選項進行編譯,那麼你不應該從malloc()得出結果 - 也許你不會去學習ANSI C(C89)之前那些必要的舊式習語,或者如果您的代碼旨在由C++編譯器編譯,則仍然是必需的。該文件重命名爲node.cpp,並與G ++編譯產生任何錯誤或警告之一:

g++ -O3 -g -std=c++11 -Wall -Wextra -Werror -c node.cpp 

如果轉換被省略這不會編譯。然而,我並沒有假設代碼是好的 C++;它不是 - 它只是寫在C和C++的通用子集中。

-1

另一個錯誤我總是遇到的是,當我嘗試使用 功能malloc()時,例如:

number = (int*)malloc(sizeof(int)); 

我得到警告:

filetree.c:18:21: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default] 
    number = (int*) malloc (sizeof(int)); 

您應該包括<stdlib.h>當您使用功能malloc()

+1

雖然最後的評論是真實的,但這不是一個完整的答案,是嗎? – 2014-09-21 01:03:05

0

沒有在數組中的平等例如

new_Node.name = name; 

使用的strcpy

NODE *new_Node = malloc(sizeof(NODE)); //get memory for new node 
strcpy(new_Node->value, value); //copy value to new_Node.value 
strcpy(new_Node->type, "Archive"); //copy "Archive" to new_Node.type 
new_Node->number_archives = 0; 
new_Node->next = NULL; 
new_Node->son = NULL; 
+1

在使用它之前,還要檢查'malloc()'的返回值。 – 2014-09-21 01:33:25

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

    typedef struct node { 
     char name[50]; 
     char type[50]; // There are two kinds of files: directory and archive 
     int number_archives; 
     struct node *next; 
     struct node *son; 

    }NODE; 


void create_Archive (NODE *ptr,char name[50]){ // ptr points to the node where I'll add the son 
    NODE* new_Node = (NODE*) malloc(sizeof(NODE)); 
    strcpy(new_Node->name, name); 
    strcpy(new_Node->type, "Archive"); 
    new_Node->number_archives = 0; 
    new_Node->next = new_Node->son = NULL; 
    ptr->son = new_Node; 

} 
  • 我認爲 「nodo」 和 「NODO」 應爲 「節點」和「NODE」。
  • 您應該包括<stdlib.h>當您使用功能malloc()
  • 局部變量的數據你離開後的範圍將不保,所以你不應該返回指向局部變量。
+0

在使用它之前,還要檢查'malloc()'的返回值。 – 2014-09-21 01:33:41