C语言数据结构之单链表存储详解

C语言数据结构之单链表存储详解

什么是单链表

链表是一种非顺序存储的数据结构,其每个节点都保存下一个节点的地址。单链表是最简单的链表,每个节点只包含下一个节点的地址。

单链表节点的定义

单链表的节点定义一般包括两个部分:数据域和指针域。数据域存放节点的数据,指针域存放下一个节点的地址。

以下是单链表节点的定义:

typedef struct node {
    int data;           // 数据域
    struct node *next;  // 指针域
} Node, *LinkList;

这里使用typedefLinkList是为了方便使用。详情可以参考代码。

单链表的基本操作

头插法创建单链表

头插法是一种从前往后建立单链表的方法,每次新建节点都插入到链表的头部。

LinkList createList() {
    LinkList L = NULL;      // 头节点
    Node *s = NULL;         // 新建节点
    int x = 0;              // 输入的数据
    scanf("%d", &x);
    while (x != -1) {
        s = (Node*)malloc(sizeof(Node));    // 新建节点
        s->data = x;        // 节点赋值
        s->next = L;        // 插入到链表头部
        L = s;              // 更新头指针为新建节点
        scanf("%d", &x);
    }
    return L;
}

以上代码是使用头插法创建单链表的实现。程序首先输入第一个数据,然后循环输入数据并新建节点,每次将新节点插入到头部。这里需要注意的是如果有一个数据为-1,那么循环结束,返回头节点。

尾插法创建单链表

尾插法是一种从后往前建立单链表的方法,每次新建节点都插入到链表的尾部。

LinkList createList() {
    LinkList L = NULL;      // 头节点
    Node *s = NULL;         // 新建节点
    Node *r = NULL;         // 指向链表的尾部
    int x = 0;              // 输入的数据
    scanf("%d", &x);
    while (x != -1) {
        s = (Node*)malloc(sizeof(Node));    // 新建节点
        s->data = x;        // 节点赋值
        if (L == NULL) {    // 链表为空,新节点就是链表的头节点
            L = s;
            r = s;
        } else {            // 新节点插入到链表的尾部
            r->next = s;
            r = s;
        }
        scanf("%d", &x);
    }
    if (r != NULL) {    // 这里需要判断一下,以免链表为空
        r->next = NULL;
    }
    return L;
}

以上代码是使用尾插法创建单链表的实现。程序首先输入第一个数据,然后循环输入数据并新建节点,每次将新节点插入到尾部。这里需要注意的是如果有一个数据为-1,那么循环结束。最后需要判断一下链表是否为空,如果不为空则设置尾部指针为空指针。

遍历单链表

遍历单链表就是依次输出每个节点的数据。

void printList(LinkList L) {
    Node *p = NULL;     // 遍历指针
    p = L;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

以上代码是遍历单链表的实现。程序创建了一个指针p用于遍历单链表,当p指向空指针时遍历结束。

单链表的应用举例

静态链表

静态链表是一种使用数组来模拟的链表。静态链表的一个显著特点是可以随机访问节点。

以下是静态链表节点定义:

typedef struct snode {
    int data;
    int next;
} SNode;

静态链表的代码实现和单链表基本相同,只是在创建节点的时候需要使用数组下标代替地址。

void createSList(SNode s[], int *p) {
    int x = 0;              // 输入数据
    scanf("%d", &x);
    while (x != -1) {
        s[*p].data = x;
        s[*p].next = *p + 1;
        *p++;
        scanf("%d", &x);
    }
    s[*p].next = -1;
}

void printSList(SNode s[], int p) {
    while (s[p].next != -1) {
        printf("%d ", s[p].data);
        p = s[p].next;
    }
    printf("%d\n", s[p].data);
}

以上代码实现了静态链表的创建和遍历。程序使用数组来保存静态链表,p代表数组下标,每次新增节点的地址都是p+1。静态链表的遍历需要使用数组下标代替指针指向节点位置。

单链表的逆序输出

单链表的逆序输出不需要改变节点的位置,只需要修改遍历顺序。这可以通过使用递归函数来实现。

void reversePrint(Node *L) {
    if (L == NULL) {
        return;
    }
    reversePrint(L->next);
    printf("%d ", L->data);
}

以上代码实现了单链表逆序输出的功能。reversePrint函数使用递归的形式来遍历链表,当遇到空指针时递归结束。同时,printf函数在递归函数后面执行,所以输出顺序就是逆序的了。

结论

以上是C语言单链表存储的详细攻略。单链表是一种比较简单的数据结构,可以用来解决许多实际问题。在实际应用中,我们需要灵活使用各种算法和技巧来处理单链表。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构之单链表存储详解 - Python技术站

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

相关文章

  • C语言程序设计第五版谭浩强课后答案(第二章答案)

    首先,需要说明的是本题涉及到一个特定的知识领域,即C语言程序设计,以及该领域内某个具体教材的课后习题解答。因此,本攻略的重心将放在如何利用Markdown格式对该领域内的知识进行准确、清晰的表达和展示上。 下面是本攻略的目录: C语言程序设计第五版谭浩强课后答案(第二章答案)攻略 一、简介 二、题目列表 三、示例说明 示例一 示例二 四、总结 一、简介 本攻…

    数据结构 2023年5月17日
    00
  • C++数据结构之链表的创建

    C++中链表的创建一般可分为以下几个步骤: 创建节点结构体 创建链表类,定义私有变量头结点(head)和一些公有方法,如插入、删除和打印链表等 实现链表的插入、删除和打印方法 下面将会对以上每个步骤进行详细讲解。 1. 创建节点结构体 节点结构体包含两个部分,一个是存储数据的变量,另一个是存储指向下一个节点的指针。代码如下: struct Node { in…

    数据结构 2023年5月17日
    00
  • 一步步带你学习设计MySQL索引数据结构

    一步步带你学习设计MySQL索引数据结构 索引原理 在MySQL中,索引是一种数据结构,用于快速查找表中的记录。在一张表中,可以使用不同的列来创建索引,索引可以大大提高查询效率,减少扫描行数,加快数据查询速度。 索引的实现一般使用的是B树和B+树这两种数据结构,因为它们都具有良好的平衡性,可以快速查找,插入和删除。 如何设计MySQL索引 确认需要优化的查询…

    数据结构 2023年5月17日
    00
  • Golang Mutex互斥锁源码分析

    Golang Mutex互斥锁源码分析 介绍 Golang的Mutex互斥锁机制是一种非常重要的并发控制方式,它可以保证在同一时刻,同一共享资源只能被一个goroutine访问,其他的goroutine必须等待当前访问者释放锁之后才能访问该共享资源。 在使用Mutex机制时,需要进行锁定、解锁等操作,而这一过程是由Mutex的底层实现——sync包来完成的。…

    数据结构 2023年5月17日
    00
  • Python数据结构之翻转链表

    对于“Python数据结构之翻转链表”的完整攻略,我会按照以下顺序进行讲解: 1.什么是链表? 2.如何翻转链表? 3.示例1:翻转一个简单的链表 4.示例2:翻转一个带环的链表 5.如何在Python中实现翻转链表? 接下来,我会详细讲解每个部分。 什么是链表? 链表是一种数据结构,它由一系列的节点组成,每个节点包含了数据和指向下一个节点的指针。链表有很多…

    数据结构 2023年5月17日
    00
  • C语言中单链表的基本操作指南(增删改查)

    C语言中单链表的基本操作指南如下: 单链表 单链表是一种线性结构,具有链式存储的特点,即用指针相连的方式存储数据。单链表的每个节点包含一个数据域和一个指向下一个节点的指针域。单链表与数组相比,其插入和删除操作效率较高,但是查找效率较低。 在C语言中,可以使用结构体和指针实现单链表。如下所示,Node结构体表示单链表中的一个节点,包含一个数据成员和一个指向下一…

    数据结构 2023年5月17日
    00
  • C++数据结构哈希表详解

    C++数据结构哈希表详解 哈希表(Hash Table)是一种非常重要的数据结构,用于实现字典等各种应用。哈希表将关键字映射到一个固定大小的数据集合中,以支持常数时间复杂度的插入、查找和删除操作。哈希表的核心思想是将关键字通过哈希函数(Hash Function)映射到数据集合中的一个索引位置,哈希函数需要满足良好的散列性质,使得关键字能够均匀地散布在数据集…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法 | 欧拉函数 | 数论

    DAY10共2题: 月月给华华出题 华华给月月出题 难度较大。 ? 作者:Eriktse? 简介:211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/110…

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