C语言线性表顺序表示及实现

C语言线性表顺序表示及实现

线性表的概念

线性表是一种数据结构,它是由n(n≥0)个数据元素a1,a2,...,an 组成的有限序列(元素个数为0时,称为空表),并且这些数据元素遵循一定的线性关系。

线性表的存储结构

线性表的存储结构有两种:顺序存储和链式存储。顺序存储指的是用一段连续的存储单元依次存储线性表的数据元素,线性表中的元素在物理位置上也是相邻的;而链式存储则是通过每个元素记录下一个元素的地址,以此将节点链接在一起。

顺序存储结构

顺序存储结构也叫数组存储结构,它通常是用一个一维数组来实现。当需要第i个元素时,直接使用数组的下标索引即可。如果数组的长度不够大,可以使用realloc函数来重新分配更大的存储空间。

下面是一个C语言实现的线性表的顺序存储结构示例代码:

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

#define MAXSIZE 100

typedef struct {
    int data[MAXSIZE]; // 用来存储数据元素的数组
    int length; // 顺序表的当前长度
} SeqList;

void InitList(SeqList* L) { // 初始化一个空线性表
    for (int i = 0; i < MAXSIZE; i++) {
        L->data[i] = 0; // 将所有元素初始化为0
    }
    L->length = 0; // 初始化长度为0
}

void ListInsert(SeqList* L, int i, int e) { // 在第i个位置插入元素e
    if (i < 1 || i > L->length+1 || L->length >= MAXSIZE) { // 判断i的范围是否有效,以及当前表是否已满
        printf("插入失败\n");
        return;
    }
    for (int j = L->length; j >= i; j--) { // 将第i个位置后面的所有元素后移
        L->data[j] = L->data[j-1];
    }
    L->data[i-1] = e; // 空出来的第i个位置插入新的元素
    L->length++; // 线性表长度加1
}

void ListPrint(SeqList L) { // 输出线性表中的所有元素
    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
    printf("\n");
}

int main() {
    SeqList L;
    InitList(&L); // 初始化一个空的线性表
    ListInsert(&L, 1, 10); // 在第1个位置插入元素10
    ListInsert(&L, 2, 20); // 在第2个位置插入元素20
    ListInsert(&L, 3, 30); // 在第3个位置插入元素30
    ListPrint(L); // 输出线性表中的所有元素
    return 0;
}

链式存储结构

链式存储结构也叫链表,它由节点组成,每个节点中存储数据以及指向下一个节点的指针。链表的插入和删除操作十分方便,但是读取节点时需要从头节点开始依次遍历节点,效率比顺序存储结构要低。

下面是一个C语言实现的线性表的单链表示例代码:

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

typedef struct Node { // 定义链表节点
    int data; // 数据域
    struct Node* next; // 指向下一个节点的指针
} Node;

typedef struct { // 定义链表头节点
    struct Node* head; // 指向链表首节点的指针
    int length; // 链表的长度
} LinkList;

void InitList(LinkList* L) { // 初始化一个空链表
    L->head = (Node*) malloc(sizeof(Node));
    L->head->next = NULL; // 头节点的指针指向NULL,表示它是最后一个节点
    L->length = 0; // 初始化长度为0
}

void ListInsert(LinkList* L, int i, int e) { // 在第i个位置插入元素e
    if (i < 1 || i > L->length+1) { // 判断i的范围是否有效
        printf("插入失败\n");
        return;
    }
    Node* p = L->head;
    for (int j = 1; j < i; j++) { // 移动指针到第i-1个节点
        p = p->next;
    }
    Node* newNode = (Node*) malloc(sizeof(Node));
    newNode->data = e; // 在第i-1个位置后面插入一个新的节点
    newNode->next = p->next;
    p->next = newNode;
    L->length++; // 链表长度加1
}

void ListPrint(LinkList L) { // 输出链表中的所有元素
    Node* p = L.head->next;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

int main() {
    LinkList L;
    InitList(&L); // 初始化一个空的链表
    ListInsert(&L, 1, 10); // 在第1个位置插入元素10
    ListInsert(&L, 2, 20); // 在第2个位置插入元素20
    ListInsert(&L, 3, 30); // 在第3个位置插入元素30
    ListPrint(L); // 输出链表中的所有元素
    return 0;
}

总结

以上是C语言线性表顺序表示及实现的完整攻略,其中包括了顺序存储结构和链式存储结构的详细说明以及代码示例。顺序存储结构适合数据元素数量较少、频繁进行查找操作的情况;链式存储结构适合进行频繁插入、删除操作的情况。在实际应用中需要根据具体的情况选择合适的存储方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言线性表顺序表示及实现 - Python技术站

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

相关文章

  • C语言线性表全面梳理操作方法

    C语言线性表全面梳理操作方法 线性表概述 线性表是一种常用的数据结构,是指数据元素之间存在一定逻辑顺序,每个元素都有唯一的前驱和后继。 线性表有两种存储方式: 顺序存储结构 和 链式存储结构。 顺序存储结构 顺序存储结构是指采用顺序存储方式存储线性表,即将线性表的元素依次存储在一段连续的存储空间内。 代码示例:创建顺序存储线性表 #define MaxSiz…

    数据结构 2023年5月17日
    00
  • C语言数据结构树的双亲表示法实例详解

    C语言数据结构树的双亲表示法实例详解 什么是双亲表示法 在树上,每个节点都有且仅有一个父节点(根节点除外)。对于一个树结构,我们可以使用许多方法来表示这个树,其中最常见的一种方法是双亲表示法。该表示法使用一个一维数组来存储树的节点,数组的下标即为该节点的编号,数组的值则表示该节点的父节点编号。 当一个节点没有父节点时,该节点即为根节点。 双亲表示法的优缺点 …

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划

    DAY4共2题: 树(组合数学) 子序列(dp,数学) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/109…

    算法与数据结构 2023年4月18日
    00
  • 一文学会数据结构-堆

    一文学会数据结构-堆 什么是堆 在计算机科学中,堆是一个特殊的树状数据结构。堆通常有如下几个特性: 堆是完全二叉树; 堆中每个节点的值都大于或等于(小于或等于)其子节点的值,这个取值规则称为堆的“属性”; 堆顶元素(即根节点)总是为最大值或最小值。 堆的种类 堆分为小根堆和大根堆两种。小根堆要求每个节点的值都不大于其父节点的值,即A[PARENT[i]] &…

    数据结构 2023年5月17日
    00
  • C++高级数据结构之优先队列

    C++高级数据结构之优先队列 什么是优先队列? 优先队列是一种特殊的队列,其中每个元素都有一个优先级。当加入一个元素时,它会被放置在队列中的适当位置,以确保优先级最高的元素位于队头。从队列中取出元素时,总是从队头删除元素。 优先队列的应用 优先队列的常见应用场景包括: 操作系统任务调度 网络传输协议TCP中的拥塞控制算法 各种图像算法如边缘检测等 C++中S…

    数据结构 2023年5月17日
    00
  • Java concurrency集合之LinkedBlockingDeque_动力节点Java学院整理

    Java Concurrency集合之LinkedBlockingDeque_动力节点Java学院整理 LinkedBlockingDeque是什么? LinkedBlockingDeque是java.util.concurrent包下一个双向阻塞队列,用于在多线程的环境中处理元素序列,它支持在队列两端添加和移除元素。LinkedBlockingDeque可…

    数据结构 2023年5月17日
    00
  • 数据结构TypeScript之二叉查找树实现详解

    数据结构TypeScript之二叉查找树实现详解 什么是二叉查找树 二叉查找树(Binary Search Tree,简称BST)是一种基础的数据结构,也是一种常用的搜索算法。它通过以二叉树的形式表示各个结点之间的关系,实现了快速查找、添加、删除等操作。对于任何一个节点,其左子树上的节点值均小于该节点的值,右子树上的节点值均大于该节点的值。 二叉查找树的实现…

    数据结构 2023年5月17日
    00
  • LinkedList学习示例模拟堆栈与队列数据结构

    下面是关于“LinkedList学习示例模拟堆栈与队列数据结构”的完整攻略。 什么是LinkedList? LinkedList是Java语言中的一个类,用于表示链表数据结构。链表数据结构可以根据需要进行增、删、改、查等操作,是常用的数据结构之一。 如何使用LinkedList实现堆栈? 堆栈是一种先进后出(LIFO)的数据结构,可以使用LinkedList…

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