2014-09-21 49 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