在C中创建多分支树

时间:2014-09-21 00:23:14

标签: c tree add procedure

我是C的新手,我需要创建一个N分支树,但我无法掌握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));

4 个答案:

答案 0 :(得分: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 :(得分: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”和“NODE”。
  • 使用函数<stdlib.h>
  • 时,应包括malloc()
  • 离开作用域后,不会保留局部变量的数据,因此不应返回指向局部变量的指针。

答案 2 :(得分:0)

您显示的功能有多个问题。一个主要是人为问题的问题是,您已将nodo未完整翻译为node(以及NODONODE);这很容易修复,并留给你:

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

问题1正在被编译器大声报道;你不能通过复制像new_Node.name之类的指针来初始化像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&#39;复合字面值&#39; (那是(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

如果省略了强制转换,则无法编译。但是,我并没有假装代码是 good C ++;它不是 - 它只是用C和C ++的公共子集编写的。

答案 3 :(得分:-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()