当前位置:首页 > 行业动态 > 正文

c语言中 linklist 怎么定义

在C语言中,链表(Linked List)是一种常见的数据结构,它由一系列节点组成,每个节点包含两部分:数据部分和指向下一个节点的指针,链表的一个重要特点是它的元素在内存中的地址可以是不连续的,这使得链表可以在运行时动态地分配和释放内存,链表有很多种实现方式,如单链表、双链表、循环链表等,下面将详细介绍如何在C语言中定义一个单链表。

1、定义链表节点结构体

我们需要定义一个链表节点结构体,用于存储链表中的每个元素,结构体通常包括数据部分和指向下一个节点的指针,我们可以定义一个名为ListNode的结构体,包含一个整型数据data和一个指向下一个ListNode类型的指针next:

typedef struct ListNode {
    int data; // 数据部分
    struct ListNode *next; // 指向下一个节点的指针
} ListNode;

2、创建链表

接下来,我们需要创建一个链表,创建链表的过程实际上是不断地向链表中添加节点,我们可以定义一个名为createList的函数,用于创建一个新的链表:

ListNode *createList() {
    // 创建头节点,头节点不存储数据,只作为链表的起始位置
    ListNode *head = (ListNode *)malloc(sizeof(ListNode));
    head>next = NULL; // 头节点的指针域指向NULL,表示链表为空
    return head;
}

3、向链表中添加节点

为了向链表中添加节点,我们需要定义一个名为addNode的函数,该函数接受一个链表头节点和一个整型数据作为参数,将新节点添加到链表的末尾:

void addNode(ListNode *head, int data) {
    // 创建新节点
    ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
    newNode>data = data; // 设置新节点的数据部分
    newNode>next = NULL; // 新节点的指针域指向NULL,表示新节点是当前链表的最后一个节点
    // 如果链表为空,则将头节点指向新节点
    if (head>next == NULL) {
        head>next = newNode;
    } else {
        // 否则,遍历链表,找到最后一个节点,并将其指针域指向新节点
        ListNode *current = head>next;
        while (current>next != NULL) {
            current = current>next;
        }
        current>next = newNode; // 将最后一个节点的指针域指向新节点
    }
}

4、遍历链表

为了查看链表中的元素,我们可以定义一个名为traverseList的函数,该函数接受一个链表头节点作为参数,并按顺序打印出链表中的所有元素:

void traverseList(ListNode *head) {
    ListNode *current = head>next; // 从头节点的下一个节点开始遍历
    while (current != NULL) { // 当当前节点不为NULL时,继续遍历
        printf("%d ", current>data); // 打印当前节点的数据部分
        current = current>next; // 移动到下一个节点
    }
    printf("
"); // 换行
}

5、释放链表内存

当我们不再需要链表时,需要释放链表占用的内存,我们可以定义一个名为freeList的函数,该函数接受一个链表头节点作为参数,并递归地释放链表中所有节点的内存:

void freeList(ListNode *head) {
    if (head == NULL) { // 如果头节点为NULL,表示链表为空,无需释放内存
        return;
    } else { // 否则,先释放头节点的内存,然后递归地释放其他节点的内存
        free(head);
        freeList(head>next);
    }
}

至此,我们已经成功地在C语言中定义了一个单链表,通过调用上述定义的函数,我们可以创建链表、向链表中添加节点、遍历链表以及释放链表内存,以下是一个完整的示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <time.h>
#include "list.h" // 假设我们已将上述代码保存在一个名为list.h的文件中,并在此处引用它
int main() {
    srand(time(NULL)); // 初始化随机数生成器种子为当前时间戳,以确保每次运行程序时生成的随机数不同
    ListNode *head = createList(); // 创建一个新的链表头节点
    for (int i = 0; i < 10; i++) { // 向链表中添加10个随机整数作为元素
        addNode(head, rand() % 100); // 生成一个099之间的随机整数,并将其添加到链表中
    }
    printf("链表中的元素:"); // 输出提示信息
    traverseList(head); // 遍历并打印链表中的所有元素
    freeList(head); // 释放链表占用的内存
    return 0; // 程序正常结束,返回0表示成功执行了main函数
0