C语言自定义结构体返回,不允许使用类型名


#define m 3  //b-tree的阶,暂设为3
#include "00_state.h"

typedef int KeyType;
typedef KeyType Record;

typedef struct BTNode{
    int keynum;  //结点中关键字个数 
    struct BTNode *parent;  // 指向双亲结点 
    KeyType key[m+1];  //关键字向量,0号单元未使用 
    struct BTNode *ptr[m+1];  // 子树指针向量 
    Record * recptr[m+1]; //记录指针向量,0号单元未使用 
} BTNode,*BTree; //B-树结点和B-树类型 

typedef struct{
    BTNode * pt;
    int i;
    int tag;
}Result;






#include "04_b-tree.h"
Result search_btree(BTree T,KeyType K);

int main(){
    printf("xiba");
}

Result * search_btree(BTree T,KeyType K){
    BTree p = T, q = NULL;
    int flag = 0,i = 0;
    int found = 0;
    while(p && !found){
        int i = 0;
        KeyType *keys = p->key;
        for(int j = 1;j <= p->keynum ; j++){    
            if(keys[j]>=K){
                i = j;
                break;
            }
        }
        if(keys[i] == K){
            found = TRUE;
        }else{
            q = p;
            p = p->ptr[i-1];
        }    
    }
    Result *r =(Result *) malloc(sizeof(Result));
    if(found){
        
        return *r;
    }else{
        return  *r;
    }    
}

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/531583625786159.png "#left")

在你原本的代码中,你定义了一个结构体类型 Result,并尝试在函数 search_btree 中使用它作为返回类型。
然而,根据 C 语言的规则,你不能将类型名用作返回类型。

为了解决这个问题,你可以使用 typedef 将结构体类型定义为别名,然后在函数声明和定义中使用该别名。

下面是修改后的代码示例:

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

typedef int KeyType;
#define TRUE 1

typedef struct BTreeNode {
    KeyType *key;
    struct BTreeNode **ptr;
    int keynum;
} * BTree;

typedef struct Result {
    // 定义 Result 结构体的成员
} Result;

Result search_btree(BTree T, KeyType K);

int main() {
    printf("xiba\n");
    return 0;
}

Result search_btree(BTree T, KeyType K) {
    BTree p = T, q = NULL;
    int flag = 0, i = 0;
    int found = 0;
    while (p && !found) {
        int i = 0;
        KeyType *keys = p->key;
        for (int j = 1; j <= p->keynum; j++) {
            if (keys[j] >= K) {
                i = j;
                break;
            }
        }
        if (keys[i] == K) {
            found = TRUE;
        } else {
            q = p;
            p = p->ptr[i - 1];
        }
    }
    Result r;
    if (found) {
        // 对 r 进行赋值
    } else {
        // 对 r 进行赋值
    }
    return r;
}

在这个修正后的代码中,我使用了 typedef 来将 struct Result 定义为 Result 的别名。这样你就可以在函数声明和定义中使用 Result 数组作为返回类型。

来自GPT的回答:


在您的代码中,函数search_btree的返回类型是Result*,但是在函数定义和返回语句中,您使用了Result而不是Result*。这是导致编译错误的原因。

您需要将函数定义中的返回类型和返回语句中的返回值类型都改为Result*,而不是Result。请修改以下部分代码:

c++
Copy code
Result* search_btree(BTree T, KeyType K) {
    // ...
    Result* r = (Result*)malloc(sizeof(Result));
    if (found) {
        return r;
    } else {
        return r;
    }
}
此外,记得在使用完动态分配的内存后,使用free函数释放内存,以避免内存泄漏。

另外,您的问题中提到使用了C++标签,但是您的代码是C语言的代码,并不是C++。如果您确实在使用C++环境,建议将文件扩展名改为.cpp,并适当修改代码以符合C++语法要求。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7616763
  • 这篇博客你也可以参考下:c语言中结构体类型变量类型,结构体变量名赋值
  • 你还可以看下c语言参考手册中的 c语言-未定义行为
  • 除此之外, 这篇博客: C语言数据结构之树超全详解中的 双亲表示法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    假设一组连续空间存储树的结点,同时在每一个结点中附设一个指示器指示其双亲结点在链表中的位置,

    #define MAX_TREE_SIZE 100
    //结点结构
    typedef struct PTNode{
    	TElemType data;//数据域
    	int parent;  //双亲位置域
    }PTNode;
    //树结构
    typedef struct {
    	PTNode nodes[MAX_TREE_SIZE];
    	int r,n;//树的位置和节点数
    }PTree;
    

    这种存储结构利用了除了根节点外每个结点只有一个双亲的性质,PARENT(T,x)操作可以在常量时间内实现,反复调用PARENT 操作,直到遇见无双亲的结点时,便找到了树的根,这就是ROOT(x)操作的执行方法,但是在这种表示法中,求结点的孩子时需要遍历整个结构。
    在这里插入图片描述

  • 您还可以看一下 贺利坚老师的C语言及程序设计初步课程中的 数值数据类型及表示小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    如果不想使用类型名,可以使用typedef来定义结构体类型别名,然后使用类型别名来定义结构体变量并返回该结构体。例如:

    typedef struct { int id; char name[20]; float score; } Student;

    Student create_student(int id, char* name, float score) { Student s; s.id = id; strcpy(s.name, name); s.score = score; return s; }

    在上述代码中,首先使用typedef定义了一个名为Student的结构体类型别名,该结构体包含id、name和score三个成员变量。然后在create_student函数中,可以直接使用Student作为返回类型,即返回一个结构体类型的值。在函数内部,可以像正常使用结构体一样初始化并设置结构体成员变量。最后返回该结构体变量即可。

    需要注意的是,在使用strcpy函数时需要注意防止缓冲区溢出的问题。同时,在定义结构体类型别名时,也需要注意给该新类型起一个有意义的名称,方便后续的使用和维护。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^