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

yizhihongxing

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日

相关文章

  • 贪心算法基础及leetcode例题

    理论 本质:找到每个阶段的局部最优,然后去推导得到全局最优两个极端:常识&&很难: 很多同学通过了贪心的题目,但都不知道自己用了贪心算法,因为贪心有时候就是常识性的推导,所以会认为本应该就这么做! 套路:贪心没有套路,说白了就是常识性推导加上举反例做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。 贪心算法一般分为如下…

    算法与数据结构 2023年4月20日
    00
  • python数据结构树和二叉树简介

    下面是关于“Python数据结构树和二叉树简介”的详细攻略。 一、树的概念 树(Tree)是一种非常重要的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合。其中一个节点被称作根节点,它没有父节点;除根节点外,其他节点都有且只有一个父节点;每个节点可以有0个或多个子节点。一棵树的深度为树中层次最大的节点层数,根节点层次为1。 二、二叉树的…

    数据结构 2023年5月17日
    00
  • python算法与数据结构朋友圈与水杯实验题分析实例

    让我来详细讲解一下“python算法与数据结构朋友圈与水杯实验题分析实例”的完整攻略。 1. 前言 本文将分享两个Python的算法与数据结构问题,即朋友圈和水杯实验题。我们将分别介绍问题的背景、解题思路和代码实现。 2. 朋友圈问题 2.1 背景 给定一个M*N的矩阵,矩阵中的每个元素都是1或0。如果矩阵中的1元素相邻,即水平、垂直或对角线相邻,则将这些元…

    数据结构 2023年5月17日
    00
  • C语言植物大战数据结构希尔排序算法

    C语言植物大战数据结构希尔排序算法 什么是希尔排序 希尔排序是一种基于插入排序的排序算法,也叫做“缩小增量排序”。和插入排序不同的是,希尔排序的插入排序是对一定间隔的元素进行插入排序,而不是对数组中相邻的元素进行排序。 希尔排序的流程和方法 希尔排序的主要流程是根据元素间的间隔d,分组进行插入排序,依次减小d值。最后当d=1的时候,再按照插入排序的方法对整个…

    数据结构 2023年5月17日
    00
  • C语言实题讲解快速掌握单链表下

    C语言实题讲解快速掌握单链表下 简介 单链表是常见的一种数据结构,可以存储任意数量的数据,并且可以高效的进行插入、删除和查找操作。本篇文章将介绍如何使用C语言实现单链表,以及如何应对在实现单链表时所遇到的常见问题。 实现过程 数据结构设计 为了实现单链表,我们需要设计一个数据结构来存储节点信息,一般包含两个成员,一个是数据域,用来存储实际的数据,另一个是指针…

    数据结构 2023年5月17日
    00
  • C++数据结构深入探究栈与队列

    C++数据结构深入探究栈与队列 简介 栈和队列是常见的数据结构,尤其在程序设计和算法中都是不可或缺的。本文将深入讲解C++中栈和队列的实现原理和基本操作,并提供两个示例说明其应用。 栈(Stack)基本操作 栈的定义 栈是一种线性数据结构,具有后进先出(Last In First Out, LIFO)的特点。栈可以用数组或链表实现。 栈的操作 push() …

    数据结构 2023年5月17日
    00
  • c语言 数据结构实现之字符串

    下面是详细讲解“c语言 数据结构实现之字符串”的完整攻略。 1. 什么是字符串? 字符串是由一组字符组成的序列,字符可以是字母、数字、标点符号等,字符串常用于文本处理。 在C语言中,字符串是以‘\0’ 结束的字符数组。 2. 字符串的常见操作 常见的字符串操作包括:复制、比较、连接、查找等。 2.1 字符串复制 字符串复制是将一个字符串的内容复制到另一个字符…

    数据结构 2023年5月17日
    00
  • C#数据结构与算法揭秘三 链表

    作为一本通俗易懂的C#数据结构与算法书籍,其第三章主要介绍链表(Linked List)的概念和基本操作。下面是链表的基本概念: 链表(Linked List)是一种动态数据结构,其中的元素按线性顺序排列,并且每个元素都称为一个结点(Node)。 每个结点都包含一个元素和一个指向下一个结点的指针(Pointer)。 相比于数组,链表的优势在于能够轻松地增加或…

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