关于链表中结构体typedef相关疑惑的解释

本文将以单链表和静态链表的初始化代码(c++)为例,具体分析了结构体中 typedef struct LNode{....} LNode, *LinkList, SLinkList[MaxSize];的相关问题,并补充了C++中 引用类型的一点知识。

首先给出单链表的初始化代码:

typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;

bool InitList(LinkList &L) {
    L = (LNode *) malloc(sizeof(LNode));
    if (L == NULL) {
        return false;
    }
    L -> next = NULL;
    return true;
}

int main() {
    LinkList L;
    InitList(L);
}

从以上代码中,我们看到在定义结构体时,将struct LNode重定义为两个名字: LNode*LinkList

之所以这样命名,有助于我们后面对代码的理解。我们使用 LNode来定义结构体变量并统一指代链表中的一个结点,使用 LinkList定义指向结构体的指针并代表整个链表。

⭐上述表示定义了结构体 struct LNode,并且 struct LNode等价于 LNodestruct LNode *等价于 LinkList。所以定义结构体变量可以采用 struct LNode L或者 LNode L;定义结构体指针变量时可以采用 struct LNode *L或者 LNode *L或者 LinkList L

现在有一个问题是为什么 InitList()函数的形参为 LinkList &L?这对于不了解c++的我来说确实引发了一阵困惑。

⭐其实,在c++中 LinkList &L这种格式声明的是一种特殊的类型—->引用类型,它直接以按引用调用的方式调用变量(有点类似于指针,但并不相同)。

举个例子:

void swap1(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

void swap2(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void swap3(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int a = 1, b = 2;
    swap1(a, b); // 按值调用 其结果仍然是a = 1, b = 2;
    swap2(&a, &b); // 通过指针模拟按引用调用,其结果为a = 2, b = 1;
    swap3(a, b); // 按引用调用,其结果为a = 2, b = 1;
}

通过以上的解释,我们就可以理解 InitList(LinkList &L)实际上是按引用调用了链表指针,这样就可以将函数内对指针的修改带回到主函数中。

那么,如果我们不用这种方式,我们该怎么做呢?

此时,我们就需要使用双指针,代码如下:

typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;

bool InitList(LNode **L) { // 或者 InitList(LinkList *L)
    (*L) = (LNode *) malloc(sizeof(LNode));
    if ((*L) == NULL) {
        return false;
    }
    (*L) -> next = NULL;
    return true;
}

int main() {
    LinkList L;
    InitList(&L);
}

到此为止,我们就解释了 LNodeLinkList 的具体使用情况(LNode声明结构体变量,LinkList声明结构体指针)以及C++中的引用类型。

下面我们在举一个静态链表中的例子,深入理解一下。

先上代码:

#define MaxSize 10

typedef struct SNode{
    ElemType data;
    int next;
} SLinkList[MaxSize];

void testSLinkList() {
    SLinkList a;
    // 其他代码
}
define MaxSize 10
struct SNode{
    ElemType data;
    int next;
};

void testSLinkList() {
    struct SNode a[MaxSize];
    // 后续代码
}

// 也就是说 struct Node a[MaxSize]  SLinkList a;

从上面我们总结出如下结论:

也就是说,我们通过 typedef生成了一个简化版的新的数据类型。

Original: https://www.cnblogs.com/xiaotong-sun/p/16157557.html
Author: Xiao·Tong
Title: 关于链表中结构体typedef相关疑惑的解释

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/604867/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球