關於typedef和struct使用過程中的一些思考(2020/12/23更新)

檀車 俠影發表於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”的結點
    
}

相關文章