Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的随机队列_C_Data Structures - Fatal编程技术网

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年代开始就是这样)。