开始这是一个家庭作业问题:
该项目的目标是为void *数据类型实现双链表。
我获得了一个带有以下结构定义的.h文件:
//dlList.h
#ifndef _DLLIST_ADT_H_
#define _DLLIST_ADT_H_
#include <stdbool.h>
#ifndef _DLL_IMPL_
/// DlList_T points to a representation of a double-linked list
/// of void pointers (to abstract data objects).
typedef struct { } * DlList_T;
#endif
//Function declarations below
#endif
在我的dlList.c文件中,我试图做这样的事情:
//dlList.c
typedef struct _dlNode{
struct _dlNode *prev;
struct _dlNode *next;
void * data; //pointer to a memory address
} dlNode;
struct _DlList_T{
struct _dlNode *start; //the first item in the list
struct _dlNode *cursor; //the current item the list is pointing to
int curIndex; //index of current item
int maxIndex; //number of items in list
} * DlList_T;
//Rest of .c file
我的所有错误都与
的变体有关&lt; DlList_T&#39;
的冲突类型
我在.c文件中尝试了几种结构变体,但我想我错过了一些非常明显的结构...
我是否应该在我的.c文件中使用我的DlList_T结构,将其重命名为其他内容,然后在需要时将其强制转换......?
另外请注意,我不允许以任何方式更改.h文件。当我提交项目时,try将使用.h文件的本地副本。
我很失落,任何帮助都会受到赞赏,谢谢!
编辑:#ifndef和#endif&#39; s包含头文件
编辑2:使用-std = c99标志使用gcc编译。
答案 0 :(得分:1)
您的第一个错误是{。1}}是.h文件中的类型,而.c文件中是变量。这无效。
其次,你不应该
DlList_T
<。>在.h文件中,但
typedef struct { } * DlList_T;
或类似的东西。这称为前向声明(针对两个不同的名称,typedef struct DlList * DlList_T;
和struct DList
)
然后在.c文件中使用Dlist_T
的{{1}}声明。这就是隐藏C类型工作细节的方法。如果你的教师确实在头文件中给你一个版本{}
,那么他或她应该在教导他人之前先修改基本的C. (空struct Dlist
是C中的约束违规,但可能被gcc接受为扩展名。)
答案 1 :(得分:0)
您从这句话开始
typedef struct { } * DlList_T;
typedef
的{{1}}和空结构到DlList_T
的标识符。
然后,稍后会出现
struct _DlList_T{
struct _dlNode *start; //the first item in the list
struct _dlNode *cursor; //the current item the list is pointing to
int curIndex; //index of current item
int maxIndex; //number of items in list
} * DlList_T;
同样typedef
使用相同的标识符DlList_T
。这是非法的。
答案 2 :(得分:0)
我建议在头文件中包含列表节点的结构定义,但是你不能修改它,你必须将它放在.c
源文件中。
您的错误表明您对类型DlList_T
有多个定义:您不能说DlList_T
是空结构的类型别名(您在标题中执行此操作)和在同一类型上指向struct _DlList_T
的指针(在源文件中执行)。
所以,第一步:首先为列表变量选择另一个名称,例如dbl_list
:
struct _DlList_T {
struct _dlNode *start; //the first item in the list
struct _dlNode *cursor; //the current item the list is pointing to
int curIndex; //index of current item
int maxIndex; //number of items in list
} *dbl_list;
定义具有前导_
的结构也是一个坏主意,因为这些是为实现保留的 - 考虑选择其他名称。
头文件应改为:
typedef struct DlList *DlList_T;
或类似的东西(可能有不同的结构标签)。你展示的代码不是标准的C(空结构不是标准的),没有任何意义。如果这是您的指示,我认为您应该将其报告为错误。或者,确保完成课程练习 - 也许您应该使用具有启用此类构造的扩展的特定编译器。但要预先警告它不便携。
答案 3 :(得分:0)
根据您的最新更新,请考虑按以下方式进行操作:
...
#define _DLL_IMPL_
// This is to prevent dlList.h from making that illegal thing
typedef struct _dlNode {
struct _dlNode *prev;
struct _dlNode *next;
void * data; //pointer to a memory address
} dlNode;
typedef struct _DlList_T {
struct _dlNode *start; //the first item in the list
struct _dlNode *cursor; //the current item the list is pointing to
int curIndex; //index of current item
int maxIndex; //number of items in list
} * DlList_T;
#include "dlList.h"
...
或者那些东西。在DlList_T
或.h
文件中使用之前,请确保.c
已被类型定义为有效结构。由于您不能违反.h
文件,因此您应该在包含它之前立即执行此操作。
通过使用适当的预处理程序指令(在这种情况下为#define _DLL_IMPL_
答案 4 :(得分:0)
#include <dlList.h>
typedef struct _dlNode
{
struct _dlNode *prev;
struct _dlNode *next;
void * data; //pointer to a memory address
} dlNode;
struct _MyList_T
{
struct _dlNode *start; //the first item in the list
struct _dlNode *cursor; //the current item the list is pointing to
int curIndex; //index of current item
int maxIndex; //number of items in list
} * MyList_T;
void dll_clear(DlList_T lst)
{
MyList_T list = (MyList_T)lst;
list->cursor...
return;
}