C语言中的随机队列
我已经用所有正确的理解编写了这段代码。请检查我的问题C语言中的随机队列,c,data-structures,C,Data Structures,我已经用所有正确的理解编写了这段代码。请检查我的问题 #include<stdio.h> #include<stdlib.h> 根据我认为正确的情况,这也可以 typedef struct RandQ_{ int size; struct RanElmt *head; struct RanElmt *tail; }RandQ; RandQ * RandomizedQueue(void (*destroy)(void *data)){
#include<stdio.h>
#include<stdlib.h>
根据我认为正确的情况,这也可以
typedef struct RandQ_{
int size;
struct RanElmt *head;
struct RanElmt *tail;
}RandQ;
RandQ * RandomizedQueue(void (*destroy)(void *data)){
RandQ *relmt = (RandQ*)malloc(sizeof(RandQ));
} // construct an empty randomized queue
int isREmpty(RandQ *rQ){
if ( rQ->size == 0)
return 1;
return 0;
} // is the queue empty?
int rsize(RandQ *rQ){
return rQ->size;
}
// return the number of items on the queue
实际上,这只是一个函数,(排队)我将得到这个想法,并编写其他函数(出列、示例等)
此程序将给出以下错误:
在C结构中,标记和类型名位于不同的名称空间中。也就是说,
struct-RanElmt
和RanElmt
是两种不同的类型,另外,struct-RanElmt
没有完全定义
您的RandQ
应该定义如下
typedef struct RandQ_{
int size;
struct RanElmt_ *head; // or RanElmt* head;
struct RanElmt_ *tail; // or RanElmt* tail;
}RandQ;
此外,你的RanElmt
可能不是你想要的,也许你的意思是:
typedef struct RanElmt_ {
void *data;
struct RanElmt_ *prev; // pointer to a struct of the same type
struct RanElmt_ *next; // pointer to a struct of the same type
void (*destroy)(void *data);
// You cannot put code here in C (or even a function definition AFAIK).
} RanElmt;
在C结构中,标记和类型名位于不同的名称空间中。也就是说,
struct-RanElmt
和RanElmt
是两种不同的类型,另外,struct-RanElmt
没有完全定义
您的RandQ
应该定义如下
typedef struct RandQ_{
int size;
struct RanElmt_ *head; // or RanElmt* head;
struct RanElmt_ *tail; // or RanElmt* tail;
}RandQ;
此外,你的RanElmt
可能不是你想要的,也许你的意思是:
typedef struct RanElmt_ {
void *data;
struct RanElmt_ *prev; // pointer to a struct of the same type
struct RanElmt_ *next; // pointer to a struct of the same type
void (*destroy)(void *data);
// You cannot put code here in C (or even a function definition AFAIK).
} RanElmt;
您混淆了队列定义中队列元素的struct标记和typedeffed别名:
typedef struct RandQ_{
int size;
struct RanElmt *head;
struct RanElmt *tail;
} RandQ;
这里,头部和尾部的类型为struct RanElmt
。您的程序中不存在此结构。您有一个struct-RanElmt\uuu
(带尾随下划线),您也可以在不使用struct关键字的情况下调用` RanElmt,因为您将结构定义与
typedef`组合在一起
编译器仍然会生成代码,因为指向未知结构的指针是可以的,除非您尝试获取它们的数据。显然,如果编译器不知道struct字段,它将无法访问这些字段
不需要下划线。结构的名称在一个单独的名称空间中,因此您可以同时拥有一个名为RandQ
的结构和一个名为RanQ
的类型(在全局名称空间中)。我建议对结构标记和别名类型使用相同的名称
如果将结构定义中的typedef
与结构定义分开,也可以避免在结构定义中使用struct
关键字:
typedef struct RanElmt RanElmt; // use just RanElmt from now on
struct RanElmt {
void *data;
RanElmt *prev;
RanElmt *next;
} RanElmt;
您的代码还有几个其他问题,但我认为该程序处于早期状态,因此我在这里不讨论这些问题。您混淆了队列定义中队列元素的struct标记和typedeffed别名:
typedef struct RandQ_{
int size;
struct RanElmt *head;
struct RanElmt *tail;
} RandQ;
这里,头部和尾部的类型为struct RanElmt
。您的程序中不存在此结构。您有一个struct-RanElmt\uuu
(带尾随下划线),您也可以在不使用
struct关键字的情况下调用` RanElmt,因为您将结构定义与
typedef`组合在一起
编译器仍然会生成代码,因为指向未知结构的指针是可以的,除非您尝试获取它们的数据。显然,如果编译器不知道struct字段,它将无法访问这些字段
不需要下划线。结构的名称在一个单独的名称空间中,因此您可以同时拥有一个名为RandQ
的结构和一个名为RanQ
的类型(在全局名称空间中)。我建议对结构标记和别名类型使用相同的名称
如果将结构定义中的typedef
与结构定义分开,也可以避免在结构定义中使用struct
关键字:
typedef struct RanElmt RanElmt; // use just RanElmt from now on
struct RanElmt {
void *data;
RanElmt *prev;
RanElmt *next;
} RanElmt;
您的代码还有其他几个问题,但我认为程序处于早期状态,因此我不在这里讨论这些问题。尝试更改(rQ->head)->prev=relmt代码>至rQ->head->prev=relmt
@Maraboc:arrow运算符是左关联的,因此这两个变量是相同的。struct RanElmt
未定义。在您显示的代码中只有struct RanElmt
和RanElmt
。那又怎样?OT:至少是intmain(void)
,顺便说一句,试着改变(rQ->head)->prev=relmt代码>至rQ->head->prev=relmt
@Maraboc:arrow运算符是左关联的,因此这两个变量是相同的。struct RanElmt
未定义。在您显示的代码中只有struct RanElmt
和RanElmt
。那又怎样?OT:至少是intmain(void)
,顺便说一句,谢谢。我们可以使用struct的无下划线名称吗?可以。使用typedef struct X
可以为类型struct X
创建别名X
。谢谢。我们可以使用struct的无下划线名称吗?可以。使用typedef struct X
可以为类型struct X
创建别名X
。谢谢,收到了。这件事令人困惑。它的目的是什么?我同意。我认为最好的方法是使用与标记和类型名相同的名称(即typedef struct RanElmt{…}RanElmt
),因为语言允许这样做。我不知道这样做的理由,但你可能需要深入挖掘历史记录才能发现这一点(至少从80年代开始就是这样)。谢谢,明白了。这件事令人困惑。它的目的是什么?我同意。我认为最好的方法是使用与标记和类型名相同的名称(即typedef struct RanElmt{…}RanElmt
),因为语言允许这样做。我不知道这样做的理由,但你可能必须深入挖掘历史记录才能找到答案(至少从80年代开始就是这样)。