关于typedef和struct使用过程中的一些思考(2020/12/23更新)

关于typedef和struct使用过程中的一些思考

以下内容所记录的内容是自己在编写ADT工具类时遇到的问题,做出一些记录,好记性不如烂笔头

以下内容如有错误的地方还望不吝赐教


1、C与C++中关于typedefstruct的使用辨析:

题目案例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 QNodeQNode 都是是一种单独的数据结构

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”的结点
    
}
上一篇:cf1076d 贪心最短路


下一篇:【Beautiful JUC Part.1】建立起Java并发体系的大厦