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日

相关文章

  • 2020滴滴最新PHP试题(附答案及解析)

    题目链接:https://www.fibar.cn/newsDetail/18216.html 本文主要是对“2020滴滴最新PHP试题(附答案及解析)”的解题思路和过程进行详细讲解。 题目难度 此题属于中等难度,需要考生具备 PHP 基础知识和算法基础。 题目要求 题目要求我们编写一个程序,实现多个字符串的排序输出。程序需要满足以下要求: 输入:多个字符串…

    数据结构 2023年5月17日
    00
  • 数据结构之位图(bitmap)详解

    数据结构之位图(bitmap)详解 什么是位图? 位图,又称为比特图、Bitmap,是一种非常常用的数据结构。它是一种特殊的数组,只能存储0或1,可以用来表示一些二元状态,如二进制码、字符集、颜色等信息。在数据挖掘、工程设计、网络安全等领域都有广泛的应用。 位图的原理 位图的原理是用数据的位来表示某个元素对应的值。如果对应位为1,则代表该元素存在,否则代表该…

    数据结构 2023年5月17日
    00
  • 在matlab中创建类似字典的数据结构方式

    当需要使用类似字典的数据结构时,Matlab中可以使用结构体来实现。结构体是一种有序的数据集合,每个元素都可以包含不同类型的数据(如字符串、数值等),并通过指定一个名称来唯一地标识该元素。 创建一个空结构体 使用struct函数可以创建一个空的结构体,可以使用下面的代码: st = struct; 添加键值对 可以将键值对添加到结构体中,可以使用下面的代码向…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之希尔排序示例详解

    Go语言数据结构之希尔排序示例详解 希尔排序简介 希尔排序,也称为缩小增量排序,是插入排序的一种更高效的改进版本;希尔排序是非稳定排序算法。 希尔排序的基本思想是已距离进行“减半”的插入排序;先将整个待排序的记录序列分割成若干个子序列,分别进行直接插入排序,待各子序列中的记录基本有序时,再将子序列合并为整体有序序列。 希尔排序的过程 从上面的简介中我们可以得…

    数据结构 2023年5月17日
    00
  • C++数据结构红黑树全面分析

    C++数据结构红黑树全面分析攻略 红黑树是一种自平衡二叉搜索树,它可以保证最坏情况下的操作时间复杂度为O(logn),是一种非常高效的数据结构,而且广泛应用于STL等库的实现中。本文将详细介绍红黑树的基本概念、插入、删除、查找等相关操作,帮助读者深入理解和掌握红黑树的实现过程。 基本概念 红黑树是一种特殊的二叉搜索树,它的每个节点要么是红色,要么是黑色。同时…

    数据结构 2023年5月17日
    00
  • C#常用数据结构之数组Array

    C#常用数据结构之数组Array 什么是数组 在C#中,数组是一种数据结构,它可以用于存储具有相同数据类型的多个元素。数组中的元素可以通过下标来访问,数组下标从0开始,最大下标为数组长度-1。 声明和初始化数组 声明数组 声明数组需要指定数据类型和数组名称,括号中指定数组的容量。例如,声明一个包含5个整数的数组: int[] arr = new int[5]…

    数据结构 2023年5月17日
    00
  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    C语言数据结构顺序表中的增删改(头插头删)教程示例详解 什么是顺序表? 顺序表是一种用数组实现的线性表,所有元素存储在一块连续的存储区中。顺序表的操作包括插入、删除、查找等。 常用的顺序表操作 增加元素 删除元素 修改元素 查找元素 以下以头插和头删为例,讲解如何在C语言数据结构顺序表中实现这些操作。 头插操作 头插的实现首先需要考虑插入位置的下标,由于是头…

    数据结构 2023年5月17日
    00
  • C语言数据结构中约瑟夫环问题探究

    C语言数据结构中约瑟夫环问题探究 什么是约瑟夫环问题? 约瑟夫环问题(Josephus problem)是一个经典的问题,据说是Flavius Josephus发现并命名的。该问题描述为,编号从1到n的n个人按照顺时针方向围坐成一圈,每人持有一个密码。从第1个人开始,顺时针方向每次完整的数m个人,然后让这m个人出圈并把他们的密码拿走不算。当到达队尾时,又从队…

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