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

yizhihongxing

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日

相关文章

  • JavaScript中的Map数据结构详解

    JavaScript中的Map数据结构详解 什么是Map数据结构 Map是JavaScript中一种新的数据结构,类似于对象,但是比对象更加灵活。Map可以将任意类型的值作为键名(包括对象、字符串、数字、布尔值等),并且不会将键名强制转换为字符串。Map的键值对个数没有限制,可以根据需要动态地增加或者删除键值对。Map内部实现了一个哈希表,因此增加、删除、查…

    数据结构 2023年5月17日
    00
  • C语言数据结构之vector底层实现机制解析

    C语言数据结构之vector底层实现机制解析 什么是vector? vector是C++标准库中的一种容器,可以动态调整大小,用于存储数据。 vector的底层实现机制 vector实际上是通过数组实现的,当需要添加元素时,如果当前数组已满,就会重新创建一个更大的数组,并将原数组中的元素复制到新数组中。这样,内存空间得到了增加,同时操作后的元素仍然是顺序存储…

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

    C++数据结构之哈希算法详解 概述 哈希算法是一种常用于对数据进行快速检索的算法,它通常将数据映射为一个较短的指纹码,并将这个指纹码作为数据的索引值,这样可以快速地根据索引值找到对应的数据。 本文将详细讲解哈希算法的实现原理、常见应用场景以及在 C++ 语言中如何实现一个简单的哈希表。 哈希算法的实现原理 哈希算法的核心思想是将输入数据通过一个哈希函数进行映…

    数据结构 2023年5月17日
    00
  • C语言数据结构中串的模式匹配

    C语言数据结构中串的模式匹配 什么是字符串的模式匹配? 字符串的模式匹配是指在一个主字符串中查找特定的子串,找到特定的子串后输出其在主字符串中的位置。 例如有一个主串”this is a test string”,要查找的子串为”string”,则字符串的模式匹配应能输出”string”在主串中的位置为17。 如何实现字符串的模式匹配? 字符串的模式匹配可以…

    数据结构 2023年5月17日
    00
  • 稀疏数组

    引入 当在网页上下棋类游戏时,玩到中途想要离开,但是我们需要保存进度,方便下次继续 我们应该怎么实现 ? 以围棋举例 使用二维数组将棋盘记下 ,如 0 为 没有棋子 ,1 为 黑子 , 2为白子 但是没有棋子的地方都为 0 ,整个二维数组充斥着大量的无效数据 0 我们需要想一个办法来 优化存储的方式 基本介绍 当一个数组中大部分元素是同一个值时,我们可以使用…

    算法与数据结构 2023年4月19日
    00
  • qqwry.dat的数据结构图文解释第2/2页

    首先,对于“qqwry.dat的数据结构图文解释第2/2页”这个主题,我们需要先对其进行一些介绍。 qqwry.dat是一种IP地址转换工具,它可以将一个给定的IP地址转换成一个物理地址。它的数据结构是一种二叉查找树,在此二叉查找树中每个节点保存了一个IP地址段和该段IP地址所对应的物理地址的信息。这个数据结构的结构图可以在“qqwry.dat的数据结构图文…

    数据结构 2023年5月17日
    00
  • Python数据结构之二叉排序树的定义、查找、插入、构造、删除

    Python数据结构之二叉排序树 一、定义 二叉排序树(Binary Search Tree,BST),也称为二叉查找树或二叉搜索树,是一种基于二叉树的数据结构,其中每个节点都包含一个键值,且满足: 左子树中所有节点的键值均小于当前节点; 右子树中所有节点的键值均大于当前节点; 这是一种自平衡的数据结构,可以快速地进行查找、插入、删除等操作。 二、查找 查找…

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

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

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