关于typedef和struct使用过程中的一些思考
以下内容所记录的内容是自己在编写ADT工具类时遇到的问题,做出一些记录,好记性不如烂笔头
以下内容如有错误的地方还望不吝赐教
1、C与C++中关于typedef
和struct
的使用辨析:
题目案例1:C中定义结构体类型(简洁版 少写了类名)
typedef struct {
···
}Sqlist, Linklist, SqStack;
注意:
需要说明的是 在此处
Sqlist, Linklist, SqStack
都是同一种数据类型,声明变量用其中任何一个都可以 在C++中也可以使用上述案例1中的方法来定义结构体类型 (使用案例1的方法更多的是为了与C语言同步,因为案例2中C++可以用更简便的方法来定义结构体类型)
题目案例2: C++中的struct可以单独定义一个结构体类型
struct Box {
···
};
//Box是一个结构体类型
C++ 中可以直接使用struct {···} box1;
来定义一个结构体变量,通过struct Box {```} ;
来定义一个结构体类型
C中则必须借用 typedef
才可以直接使用struct
来定义结构体类型 (正如题目案例1所表示的那样),但是这样也会存在问题(少写了一个类名当然会存在问题,“大约记得好像是最多只能在函数中定义一个结构体变量,定义多个结构体变量会导致报错”,有错误的地方希望有名大佬能点拨一下,十分感激)呃 扯远了 标准格式见题目案例3
题目案例3: C中定义结构体类型(完整版 )
typedef struct Box {
······
}Box;//Box此时可以单独作为一个结构体类型
经验总结:
直接对struct起别名 说明这个节点在这个函数中只会被定义一次例如顺序结构
对struct LNode起别名 说明相同类型的结点可以被定义很多个 例如链式结构的结点
typedef struct {
QElemType *Data;
Position Front;
Position Rear;
QElemType QueueSize;
}QNode;
// 直接对struct起别名 说明这个节点在这个函数中只会被定义一次
typedef struct LNode {
ElemType Data;
···
ElemType Maxsize;
}LNode, *PtrToLNode;
// 对struct LNode起别名 说明相同类型的结点可以被定义很多个
2、编写 Queue ADT时 的随笔
typedef QNode * PtrToQNode;
这种写法一般只用于链式结构,因为只有链式结构才会用到这如此类的Ptr···
的指针名
这一步操作其实常在链式结构的存储结构定义中出现 当然在顺式结构中使用不规范
线性链式结构的定义:
typedef struct LNode {
···
···
}LNode, *LinkList;
完成了以下几步操作:
typedef struct LNode LNode
;
typedef struct LNode * LinkList
;
terminal:10~22
在malloc开辟空间时 第一种QNode
是一种单独的数据结构 struct QNode
则不是 ,第二种 Struct QNode
和QNode
都是是一种单独的数据结构
typedef int Position;
typedef int QElemType;
typedef int Status;
-----------------------------------------------------------------
typedef struct QNode * Queue;
// 以下两种写法 在malloc开辟空间时 第一种QNode是一种单独的数据结构 struct QNode则不是
// 第二种 Struct QNode 和QNode 都是是一种单独的数据结构
typedef struct {
QElemType *Data;
Position Front;
Position Rear;
QElemType QueueSize;
}QNode;
typedef struct QNode {
QElemType *Data;
Position Front;
Position Rear;
QElemType QueueSize;
}QNode;
-----------------------------------------------------------------
// 以下两种数据结构类型的定义
// 直接对struct起别名 说明这个节点在这个函数中只会被定义一次
typedef struct LNode {
QElemType *Data;
Position Front;
Position Rear;
QElemType QueueSize;
}LNode, *PtrToLNode;
// 对struct LNode起别名 说明相同类型的结点可以被定义很多个
Queue InitQueue(int MaxSize) ;
int GetQueueLength(Queue Q);
bool EnQueue(Queue Q, QElemType X);
QElemType DeQueue(Queue Q);
void TravelQueue(Queue Q);
-----------------------------------------------------------------
开辟malloc
时遇到的问题
Queue InitQueue(int MaxSize) {
++MaxSize;
Queue newNode = (struct QNode *)malloc(sizeof( QNode));
// 此处报错不允许使用不完整的数据类型····(struct QNode)不可以???
// 这个地方对LNode起了别名了 ··但之前的按理说应该也可用呀
//经分析可知这里的这里的原因是typedef <Nonname> QNode
// struct在此处既是关键字又是QNode的隐式别名(不可以被引用) 出现歧义在此处就不可以出现了 只可以使用QNode作为这个结构体唯一的名字
// 与此同时造成的其他影响是 这个隐式别名为`struct`的QNode结点只可以程序的执行过程中执行一次 只可以出现一个名为“QNode”的结点
}