C语言---链表

目录

一、引言

二、链表的基本概念

三、链表的实现

1.结点定义

2.创建链表

3.遍历链表

4.插入结点

5.删除结点

四、总结


本文将带领大家详细了解C语言中链表的概念、原理以及如何实现链表的各种操作。通过本文的学习,相信大家会对C语言链表有一个更加清晰的认识。

一、引言

在C语言中,链表是一种常用的数据结构,它由一系列结点组成,每个结点包含数据域和指针域。链表相较于数组,具有动态扩展、插入删除操作高效等优点。本文将围绕链表的基本概念、实现及操作进行讲解。

二、链表的基本概念

  1. 结点:链表中的每个元素称为结点,每个结点包含两部分:数据域和指针域。

  2. 头指针:指向链表第一个结点的指针。

  3. 尾指针:指向链表最后一个结点的指针。

  4. 空链表:头指针为NULL的链表。

三、链表的实现

1.结点定义

首先,我们需要定义一个结点结构体:

cpp 复制代码
typedef struct Node {
    int data;          // 数据域
    struct Node* next; // 指针域
} Node;
2.创建链表

创建链表的方法有很多种,这里我们以头插法为例:

cpp 复制代码
Node* createList() {
    Node* head = (Node*)malloc(sizeof(Node)); // 创建头结点
    head->next = NULL;                         // 初始化头结点指针域

    int data;
    while (scanf("%d", &data) != EOF) {
        Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新结点
        newNode->data = data;                         // 设置新结点数据域
        newNode->next = head->next;                   // 新结点指向原链表的第一个结点
        head->next = newNode;                         // 头结点指向新结点
    }

    return head;
}
3.遍历链表
cpp 复制代码
void traverseList(Node* head) {
    Node* p = head->next; // 从第一个结点开始遍历
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
4.插入结点

以下是在链表中第i个位置插入新结点的操作:

cpp 复制代码
void insertNode(Node* head, int i, int data) {
    Node* p = head;
    int j = 0;
    while (p != NULL && j < i - 1) { // 找到第i-1个结点
        p = p->next;
        j++;
    }
    if (p == NULL || j > i - 1) {
        printf("插入位置不合法\n");
        return;
    }

    Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新结点
    newNode->data = data;
    newNode->next = p->next; // 新结点指向第i个结点
    p->next = newNode;       // 第i-1个结点指向新结点
}
5.删除结点

以下是在链表中删除第i个结点的操作:

cpp 复制代码
void deleteNode(Node* head, int i) {
    Node* p = head;
    int j = 0;
    while (p->next != NULL && j < i - 1) { // 找到第i-1个结点
        p = p->next;
        j++;
    }
    if (p->next == NULL || j > i - 1) {
        printf("删除位置不合法\n");
        return;
    }

    Node* q = p->next; // q指向第i个结点
    p->next = q->next; // 第i-1个结点指向第i+1个结点
    free(q);           // 释放第i个结点的内存
}

四、总结

本文详细介绍了C语言链表的基本概念、实现及操作。通过学习链表,我们可以更好地理解C语言中的动态内存分配和指针操作。在实际开发中,熟练掌握链表的应用对于提高程序性能和优化数据结构具有重要意义。希望本文对大家有所帮助。

相关推荐
星星火柴9369 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑9 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
闪电麦坤9510 小时前
数据结构:迭代方法(Iteration)实现树的遍历
数据结构·二叉树·
Cx330❀11 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散11211 小时前
01数据结构-Prim算法
数据结构·算法·图论
..过云雨12 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习
拂晓银砾12 小时前
Java数据结构-栈
java·数据结构
旺小仔.12 小时前
双指针和codetop复习
数据结构·c++·算法
谱写秋天14 小时前
在STM32F103上进行FreeRTOS移植和配置(STM32CubeIDE)
c语言·stm32·单片机·freertos
我不是板神14 小时前
程序设计|C语言教学——C语言基础2:计算与控制语句
c语言