|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype ;
typedef struct LNode {
Elemtype data;
struct LNode* next;
}LNode, * LinkList;
//头插法建新链表
LinkList CreatList1(LinkList &L)
{
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d",&x);
while (x != 9999)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
int main()
{
LinkList L;
CreatList1(L);
}
以上代码是单链表头插法,问题如下:
1.
typedef struct LNode {
Elemtype data;
struct LNode* next;
}LNode, * LinkList;
这声明结构体这段代码中,大括号后的LNode是在给大括号前的struct LNode别名加定义吗?*LinkList是在给括号内的struct LNode* next;起别名加定义吗?这段代码是否等同于下面这个代码?
struct LNode {
Elemtype data;
struct LNode* next;
};
int main()
{
struct LNode LNode;
struct LNode *LinkList;
}
2.主函数中 LinkList L;是什么含义?是在定义头指针还是头结点?LinkList类型是结构体指针变量,感觉L是一个指针,但是子函数中 L = (LinkList)malloc(sizeof(LNode));在给L分配内存空间,感觉L又应该是一个结点。s是一个结点定义了LNode类型,L却定义了LinkList类型。且指针存储的是内存地址,那么结构体指针又是什么含义呢?
(反正就是结构体指针这里很迷糊……虚心向大佬求教,谢谢)
非常好的问题,我尽量解答:
1. typedef 关键字用于为现有的类型定义一个新的别名。在你的代码中, LNode 是 struct LNode 的别名, LinkList 是 struct LNode* (LNode的指针)的别名。所以,你的理解是正确的。
所以,这段代码:
- typedef struct LNode {
- Elemtype data;
- struct LNode* next;
- }LNode, * LinkList;
-
复制代码
是等同于下面这段代码:
- struct LNode {
- Elemtype data;
- struct LNode* next;
- };
- typedef struct LNode LNode;
- typedef struct LNode *LinkList;
-
复制代码
注意,这并不等同于你给出的示例:
- int main()
- {
- struct LNode LNode;
- struct LNode *LinkList;
- }
-
复制代码
在这段代码中, LNode 和 LinkList 是变量,而不是类型别名。
2. LinkList L; 在这里, L 是一个 LinkList 类型的变量,即 LNode 结构的指针。当你调用 malloc(sizeof(LNode)) 时,你正在请求足够的内存来存储一个 LNode 类型的结构,并返回该内存区域的地址。然后,你将此地址存储在 L 中,使 L 指向你创建的新节点。
结构体指针是指向结构体的指针。因此, L 实际上是一个指向 LNode 结构的指针。由于 LNode 本身包含一个指针,用于指向链表中的下一个节点,所以 L 可以被用作链表的头指针,其指向的第一个节点即链表的头节点。
可能的混淆源于 LinkList 类型的声明:实际上, LinkList 是 struct LNode* 的别名,所以 LinkList 类型的变量是指向 LNode 结构的指针,即它是一个地址,这个地址存储的是 LNode 结构的位置。所以当你说“L是一个指针”时,你是正确的。当你说“L是一个节点”时,应该更准确地说“L指向一个节点”。
希望这个答案对你有所帮助!如果你还有其他关于链表或指针的问题,欢迎随时向我提问。
|
|