链表 - 编译错误含义

时间:2017-01-01 05:31:01

标签: c struct binary-search-tree

我是使用麻省理工学院开放课件的自学数据结构。我正在做 6.S096- C / C ++课程简介并尝试第四次作业。

它基于二叉搜索树,我尝试了一下。但是下面的代码有错误,我不知道如何解决。我关注的是左侧和右侧节点的未知类型

我可以得到一些指示吗?(没有双关语意)

错误:

bintreesubete.c:7:2: error: unknown type name ‘node’
  node* left;
  ^
bintreesubete.c:8:2: error: unknown type name ‘node’
  node* right;
  ^

P.S。忽略函数find_node_data。我还没有完成它。

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

typedef struct node{
    int node_id;
    int data; 
    node* left;
    node* right;
}node;



///*** DO NOT CHANGE ANY FUNCTION DEFINITIONS ***///
// Declare the tree modification functions below...
node* newNode(int data,int node_id){
    node* new_node = (node*) malloc(sizeof(node)); 
    new_node->data = data; 
    new_node->node_id= node_id; 
    new_node->right= new_node->left=NULL;  
    return new_node;
}

node* insert_node(node* root, int node_id, int data) {
    if(root==NULL)
        return newNode(data,node_id);
    else{
        node* cur;
        if(node_id<root->node_id){
            cur=insert_node(root->left,data,node_id);
            root->left=cur;                
        }
        else if(node_id>root->node_id){
            cur=insert_node(root->right,data,node_id);
            root->right=cur;
        } 
    }
    return root;
}

// Find the node with node_id, and return its data
int find_node_data(node* root, int node_id) {
    node* current; 
    for( current = root->; current->next!=NULL; 
        current= current->next){ 
    if(current->data == data) return current; 
} 
return NULL; 
}

int main() {
    /*
    Insert your test code here. Try inserting nodes then searching for them.

    When we grade, we will overwrite your main function with our own sequence of
    insertions and deletions to test your implementation. If you change the
    argument or return types of the binary tree functions, our grading code
    won't work!
    */
    int T,data,node_id;
    scanf("%d", &T);
    node* root = NULL;
    while(T-->0){
        scanf("%d %d\n",&data,&node_id);
        root=insert(root,data,node_id);
    }
    node *lol;
    node *king;
    for(lol=root;lol->left!=NULL;lol=lol->left){
        for(king=root;king->right!=NULL;king=king->right){
            printf("%d %d",lol->node_id, king->node_id);
        }
    }       
    return 0;
}

2 个答案:

答案 0 :(得分:1)

之前只需输入typedef。

typedef struct node node;

struct node
{
  ...
  node* ..;
};

或者

typedef struct node
{
  ...
  struct node* ..;
} node;

答案 1 :(得分:1)

typedef ed标识符的范围在定义之后立即开始,因此您无法在该定义中使用它。与结构标签形成对比,结构标签甚至可以在它们出现的第一个声明中引用:

struct node {
    int node_id;
    int data; 
    struct node *left;
    struct node *right;
};

我更喜欢这种样式来声明自引用结构类型,因为声明是独立的。如果你还需要typedef,那么我发现在单独的声明中更清楚:

typedef struct node node;

...但如果您愿意,可以在一个声明中完成:

typedef struct node {
    int node_id;
    int data; 
    struct node *left;
    struct node *right;
} node;

然而,typedef本身并不是必需的;可以直接在任何地方使用struct node。事实上,很多人都喜欢这样。