切换主题
字数
1093 字
阅读时间
5 分钟
c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构体
struct Node {
int data;
struct Node* next;
};
// 创建新节点
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 在链表末尾添加节点
void appendNode(struct Node** head, int data) {
struct Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
struct Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
// 打印链表
void printList(struct Node* head) {
struct Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
// 释放链表
void freeList(struct Node* head) {
struct Node* temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
}
int main() {
struct Node* head = NULL;
// 添加节点到链表
appendNode(&head, 1);
appendNode(&head, 2);
appendNode(&head, 3);
appendNode(&head, 4);
// 打印链表
printList(head);
// 释放链表
freeList(head);
return 0;
}
解释
struct Node
:- 定义单链表的节点结构体,包含一个整型数据和一个指向下一个节点的指针。
createNode
函数:- 创建一个新节点并初始化其数据和
next
指针。
- 创建一个新节点并初始化其数据和
appendNode
函数:- 在链表末尾添加一个新节点。它接受一个指向头指针的指针,以便在链表为空时可以修改头指针。
printList
函数:- 遍历链表并打印每个节点的数据。
freeList
函数:- 释放链表中的所有节点,防止内存泄漏。
main
函数:- 创建一个空链表,添加几个节点,打印链表内容,然后释放链表的内存。
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); 这个语句什么意思
ChatGPT
这条语句在C语言中分配内存以创建一个新的Node
结构体,并返回一个指向该结构体的指针。下面是对该语句的详细解释:
语句分解
c
复制代码
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
1. malloc(sizeof(struct Node))
malloc
是标准库函数,用于动态分配指定字节数的内存块。它在运行时从堆中分配内存。sizeof(struct Node)
计算结构体Node
所占用的字节数。假设Node
结构体定义如下:
c
复制代码
struct Node { int data; struct Node* next; };
sizeof(struct Node)
会计算出 Node
结构体中所有成员变量的总大小。
malloc(sizeof(struct Node))
分配一块内存,大小等于一个Node
结构体的大小,并返回一个void*
类型的指针,指向分配的内存块。
2. (struct Node*)
malloc
返回的是void*
类型的指针,表示指向任意类型的指针。为了将这个指针赋值给特定类型的指针(在这个例子中是struct Node*
类型),需要进行类型转换。(struct Node*)
将void*
类型的指针强制转换为struct Node*
类型的指针。
3. struct Node* newNode
- 声明一个指针
newNode
,类型为struct Node*
,即指向Node
结构体的指针。
4. 赋值操作
- 将转换后的指针赋值给
newNode
,使newNode
指向新分配的Node
结构体内存。
综上
这条语句的完整含义是:
- 动态分配一个
Node
结构体大小的内存块。 - 将返回的
void*
指针转换为struct Node*
类型的指针。 - 将这个指针赋值给指针变量
newNode
。
这样,newNode
就指向了新分配的 Node
结构体,可以通过 newNode
来访问和操作这个结构体。
示例代码
为了更好地理解这条语句,下面是一个完整的示例代码:
c
复制代码
#include <stdio.h> #include <stdlib.h> // 定义 Node 结构体 struct Node { int data; struct Node* next; }; int main() { // 动态分配一个 Node 结构体的内存 struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); if (newNode == NULL) { // 检查内存分配是否成功 printf("Memory allocation failed\n"); return 1; } // 初始化 Node 结构体的成员 newNode->data = 10; newNode->next = NULL; // 打印 Node 结构体的成员 printf("Node data: %d\n", newNode->data); // 释放分配的内存 free(newNode); return 0; }
这个示例代码演示了如何动态分配一个 Node
结构体的内存,初始化其成员,打印成员的值,并最终释放分配的内存。
贡献者
sunchengzhi