C语言创建和操作单链表数据结构的实例教程

C语言创建和操作单链表数据结构的实例教程

什么是单链表

单链表是一种常见的动态数据结构,它由一个个节点组成,每个节点包含范围内的数据和指向下一个节点的指针。单链表通常用于需要频繁插入删除节点的情况。

单链表的创建和操作步骤

创建单链表

  1. 定义一个链表节点结构体,结构体中包含要存储的数据和指向下一个节点的指针。

  2. 定义一个指向链表头部的指针,如果链表为空,则指针为空。

  3. 创建链表节点,将数据存储到节点中,并将节点插入链表头部或尾部,直到链表完整。

示例代码:

struct ListNode {
    int val;
    struct ListNode* next;
};

typedef struct ListNode ListNode;

ListNode* createList() {
    ListNode* head = NULL;
    ListNode* tail = NULL;
    // 插入节点并赋值
    for(int i = 1; i <= 5; i++) {
        ListNode* node = (ListNode*)malloc(sizeof(ListNode));
        node->val = i;
        node->next = NULL;
        // 处理头指针和尾指针
        if(head == NULL) {
            head = node;
            tail = node;
        } else {
            tail->next = node;
            tail = node;
        }
    }
    return head;
}

遍历单链表

遍历单链表即是从链表头部开始访问每个节点,并输出节点中存储的数据。

示例代码:

void traverseList(ListNode* head) {
    ListNode* p = head;
    while(p != NULL) {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

插入节点

插入节点可以在指定节点前或后插入,或者插入链表头部或尾部。

示例代码:

在指定节点前插入:

void insertNodeBefore(ListNode* head, ListNode* node, int val) {
    ListNode* p = head;
    while(p->next != NULL && p->next != node) {
        p = p->next;
    }
    if(p->next == NULL) {
        return ;
    }
    ListNode* new_node = (ListNode*)malloc(sizeof(ListNode));
    new_node->val = val;
    new_node->next = node;
    p->next = new_node;
}

在链表尾部插入:

void insertNodeAtTail(ListNode* head, int val) {
    ListNode* p = head;
    while(p->next != NULL) {
        p = p->next;
    }
    ListNode* new_node = (ListNode*)malloc(sizeof(ListNode));
    new_node->val = val;
    new_node->next = NULL;
    p->next = new_node;
}

删除节点

删除节点也有多种方式,可以删除指定节点或者按照值删除等。

示例代码:

删除指定节点:

void deleteNode(ListNode* head, ListNode* node) {
    ListNode* p = head;
    while(p->next != NULL && p->next != node) {
        p = p->next;
    }
    if(p->next == NULL) {
        return ;
    }
    p->next = node->next;
    free(node);
}

按照值删除:

void deleteNodeByValue(ListNode* head, int val) {
    ListNode* p = head;
    while(p->next != NULL && p->next->val != val) {
        p = p->next;
    }
    if(p->next == NULL) {
        return ;
    }
    ListNode* del_node = p->next;
    p->next = del_node->next;
    free(del_node);
}

示例

示例1:创建一个单链表并遍历

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode* next;
};

typedef struct ListNode ListNode;

ListNode* createList() {
    ListNode* head = NULL;
    ListNode* tail = NULL;
    // 插入节点并赋值
    for(int i = 1; i <= 5; i++) {
        ListNode* node = (ListNode*)malloc(sizeof(ListNode));
        node->val = i;
        node->next = NULL;
        // 处理头指针和尾指针
        if(head == NULL) {
            head = node;
            tail = node;
        } else {
            tail->next = node;
            tail = node;
        }
    }
    return head;
}

void traverseList(ListNode* head) {
    ListNode* p = head;
    while(p != NULL) {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

int main() {
    ListNode* head = createList();
    traverseList(head);
    return 0;
}

输出结果如下:

1 2 3 4 5

示例2:在链表中插入一个值为6的节点

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode* next;
};

typedef struct ListNode ListNode;

ListNode* createList() {
    ListNode* head = NULL;
    ListNode* tail = NULL;
    // 插入节点并赋值
    for(int i = 1; i <= 5; i++) {
        ListNode* node = (ListNode*)malloc(sizeof(ListNode));
        node->val = i;
        node->next = NULL;
        // 处理头指针和尾指针
        if(head == NULL) {
            head = node;
            tail = node;
        } else {
            tail->next = node;
            tail = node;
        }
    }
    return head;
}

void traverseList(ListNode* head) {
    ListNode* p = head;
    while(p != NULL) {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

void insertNodeAtTail(ListNode* head, int val) {
    ListNode* p = head;
    while(p->next != NULL) {
        p = p->next;
    }
    ListNode* new_node = (ListNode*)malloc(sizeof(ListNode));
    new_node->val = val;
    new_node->next = NULL;
    p->next = new_node;
}

int main() {
    ListNode* head = createList();
    insertNodeAtTail(head, 6);
    traverseList(head);
    return 0;
}

输出结果如下:

1 2 3 4 5 6

总结

本文介绍了创建和操作单链表的步骤,以及两个示例。在实际开发中,单链表的应用非常广泛,可以用于数据存储、任务调度等多种场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言创建和操作单链表数据结构的实例教程 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C#数据结构与算法揭秘二 线性结构

    C#数据结构与算法揭秘二 线性结构 线性结构是指数据元素之间一对一的关系,即数据元素之间存在一个前驱和一个后继。一般有两种基本形式:线性表和栈、队列。 线性表 线性表是由同类型数据元素构成有序序列的线性结构,常被用于实现基于数组的数据结构,如向量、矩阵等。 线性表可以分为顺序表和链表两种。 顺序表(Sequence List):是把线性表的元素按照顺序存储在…

    数据结构 2023年5月17日
    00
  • Java数据结构之最小堆和最大堆的原理及实现详解

    Java数据结构之最小堆和最大堆的原理及实现详解 什么是堆? 堆是一种特殊的树形数据结构,它满足以下两个条件: 堆是一个完全二叉树,即除了最后一层,其他层都必须填满,最后一层从左到右填满 堆中每个节点的值必须满足某种特定的条件,例如最小堆要求每个节点的值都小于等于其子节点的值。 堆一般分为两种类型:最小堆和最大堆。 最小堆:每个节点的值都小于等于其子节点的值…

    数据结构 2023年5月17日
    00
  • Java数据结构之双向链表的实现

    Java数据结构之双向链表的实现 一、双向链表的定义 双向链表是一种包含两个指针的链表数据结构,每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。 二、双向链表的实现 1. 定义节点 首先,我们需要定义一个节点类,包含节点的值,指向前一个节点的指针pre和指向后一个节点的指针next,代码如下: public class Node { int v…

    数据结构 2023年5月17日
    00
  • java实现队列数据结构代码详解

    Java实现队列数据结构代码详解 1. 队列数据结构简介 队列(Queue)是一种先进先出(FIFO)的数据结构,支持在一端插入元素,在另一端删除元素并返回删除的元素。其操作包括入队(enqueue)和出队(dequeue)。 2. 队列实现方法 队列可以通过数组或链表来实现。其中,数组实现的队列称为顺序队列,链表实现的队列称为链式队列。 2.1 顺序队列 …

    数据结构 2023年5月17日
    00
  • C++数据结构之实现邻接表

    C++数据结构之实现邻接表 在图论中,为了表示节点及其之间的联系,我们需要使用数据结构。邻接表是图的一种常见表示方法,实现方便且高效。 什么是邻接表 邻接表是一种图形式的数据结构,由节点和边组成。它使用链式结构来存储相邻节点的信息。邻接表常用于表示有向图、无向图以及加权图。在邻接表中,每一个节点都存储了一个链表,其中包含了该节点与其他节点之间的连接情况。 实…

    数据结构 2023年5月17日
    00
  • F – 产生冠军(不使用拓扑排序)

    题目描述 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之…

    算法与数据结构 2023年4月17日
    00
  • C++LeetCode数据结构基础详解

    C++LeetCode数据结构基础详解攻略 什么是LeetCode? LeetCode是一个专门为程序员提供的算法题平台。平台上汇集了各种算法、数据结构和编程题,用户可以在平台上挑战各种难度的算法用来提高自己的编程能力和算法素养。 如何学习LeetCode? 学习LeetCode的关键是掌握数据结构和算法。下面介绍如何结合具体的C++代码来学习LeetCod…

    数据结构 2023年5月17日
    00
  • Leetcode Practice — 栈和队列

    目录 155. 最小栈 思路解析 20. 有效的括号 思路解析 1047. 删除字符串中的所有相邻重复项 思路解析 1209. 删除字符串中的所有相邻重复项 II 思路解析 删除字符串中出现次数 >= 2 次的相邻字符 剑指 Offer 09. 用两个栈实现队列 239. 滑动窗口最大值 思路解析 155. 最小栈 设计一个支持 push ,pop ,…

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部