ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-17 22:00:30  阅读:186  来源: 互联网

标签:疑惑 LinkList typedef struct int 链表 指针 LNode


本文将以单链表和静态链表的初始化代码(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;

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

  1. typedef .... *LinkList;可以使简化后续声明结构体指针的过程,LinkList就指代了一个结构体指针类型
  2. typedef ..... LinkList[MaxSize];可以使简化后续声明结构体数组的过程,LinkList就指代了一个结构体数组类型

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

标签:疑惑,LinkList,typedef,struct,int,链表,指针,LNode
来源: https://www.cnblogs.com/xiaotong-sun/p/16157557.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有