Skip to content
字数
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;
}

解释

  1. struct Node:

    • 定义单链表的节点结构体,包含一个整型数据和一个指向下一个节点的指针。
  2. createNode 函数:

    • 创建一个新节点并初始化其数据和 next 指针。
  3. appendNode 函数:

    • 在链表末尾添加一个新节点。它接受一个指向头指针的指针,以便在链表为空时可以修改头指针。
  4. printList 函数:

    • 遍历链表并打印每个节点的数据。
  5. freeList 函数:

    • 释放链表中的所有节点,防止内存泄漏。
  6. 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 结构体的内存,初始化其成员,打印成员的值,并最终释放分配的内存。

贡献者

The avatar of contributor named as sunchengzhi sunchengzhi

文件历史

撰写