C语言编程数据结构线性表之顺序表和链表原理分析

C语言编程数据结构线性表之顺序表和链表原理分析

线性表的定义

线性表是由n(n>=0)个数据元素a1、a2、...、an组成的有限序列,通常用(a1, a2, ..., an)表示,其中a1是线性表的第一个元素,an是线性表的最后一个元素。线性表中的元素个数n称为线性表的长度,当n=0时,线性表为空表。

线性表的分类

根据存储结构,线性表可以分为顺序表和链表两种。

顺序表

顺序表即为按照线性顺序将元素存放在一组连续的存储单元里。

实现顺序表需要使用一块连续的内存空间存储。

在顺序表中,数据元素之间的关系是通过它们在存储空间中的位置相邻而建立的,所以顺序表的存储结构也叫做线性存储结构。

下面是一段创建顺序表的代码示例:

#define MaxSize 50

typedef struct{
    int data[MaxSize];
    int length;
}SqList;

void InitList(SqList &L) {
    L.length = 0;
}

bool InsertList(SqList &L, int i, int e) {
    if(i<1 || i>L.length+1 || L.length==MaxSize)   return false;  // i不合法或者表满
    for(int j=L.length; j>=i; j--)   L.data[j] = L.data[j-1];  // 元素后移
    L.data[i-1] = e;    // 插入新元素
    L.length++; // 长度增加
    return true;
}

bool DeleteList(SqList &L, int i, int &e) {
    if(i<1 || i>L.length)   return false;  // i不合法
    e = L.data[i-1];    // 删除元素
    for(int j=i; j<L.length; j++)    L.data[j-1] = L.data[j];  // 元素前移
    L.length--; // 长度减少
    return true;
}

int GetElem(SqList L, int i) {
    if(i<1 || i>L.length)   return -1;   // i不合法
    return L.data[i-1];
}

链表

链表即为将数据元素分散存储在内存中的不连续的存储单元中。

链表由每个元素的数据域和指向下一个元素的指针域组成,数据域存储元素的数据,指针域存储下一个元素的地址。

下面是一段创建链表的代码示例:

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode, *LinkList;

void InitList(LinkList &L) {
    L = NULL;
}

bool InsertList(LinkList &L, int i, int e) {
    if(i<1) return false;
    if(i==1) {  // 头插法
        LNode *s = (LNode*)malloc(sizeof(LNode));
        s->data = e;
        s->next = L;
        L = s;
        return true;
    }
    LNode *p; int j=1;
    p = L;
    while(p!=NULL && j<i-1) {
        p = p->next;
        j++;
    }
    if(p==NULL) return false;
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}

bool DeleteList(LinkList &L, int i, int &e) {
    if(L==NULL || i<1)  return false;
    if(i==1) {  // 头结点
        LNode *p = L;
        e = p->data;
        L = L->next;
        free(p);
        return true;
    }
    LNode *p; int j=1;
    p = L;
    while(p!=NULL && j<i-1) {
        p = p->next;
        j++;
    }
    if(p==NULL || p->next==NULL) return false;
    LNode *q = p->next;
    e = q->data;
    p->next = q->next;
    free(q);
    return true;
}

int GetElem(LinkList L, int i) {
    if(L==NULL || i<1)  return -1;
    LNode *p = L;
    int j = 1;
    while(p!=NULL && j<i) {
        p = p->next;
        j++;
    }
    if(p==NULL) return -1;
    return p->data;
}

总结

顺序表和链表是数据结构中很基础的内容,在实际应用中也比较常见。当需要经常进行插入和删除操作时,链表的效率就会比较高;当需要进行随机存取操作时,顺序表的效率就会比较高。因此,在实际应用中,需要根据具体的需求来选择使用哪种存储结构。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言编程数据结构线性表之顺序表和链表原理分析 - Python技术站

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

相关文章

  • 集合框架及背后的数据结构

    集合框架及背后的数据结构 集合框架是Java编程语言中的一组接口和实现类,用于存储数据的集合。集合框架中提供了许多不同类型的集合,包括List、Set、Map等。背后的数据结构是实现集合框架的关键,不同的数据结构适用于不同的集合类型和场景。 集合框架中的接口和实现类 Java中的集合框架定义了一些接口以及这些接口的实现类,在使用Java集合的时候,主要是使用…

    数据结构 2023年5月17日
    00
  • C++二叉树结构的建立与基本操作

    C++二叉树是一种非常常见的数据结构,同时也是算法中经常使用的一种数据结构。本文将详细讲解C++二叉树的建立和基本操作,包括二叉树的定义、创建、遍历和删除等。 1. 二叉树的定义 二叉树是一种树形结构,每个节点最多只有两个子节点:左子节点和右子节点。树的深度取决于有多少个节点,根节点是最顶端的节点,不再有父节点。节点之间存在一些有天然排序关系且有先后性的关系…

    数据结构 2023年5月17日
    00
  • 详解python数据结构之队列Queue

    详解Python数据结构之队列 (Queue) 在计算机科学中,队列(Queue)是一种数据结构,可以用于按顺序存储和访问元素。该数据结构遵循先进先出(FIFO)原则,人们可以从队列的前面插入元素,从队列的后面删除元素。Python内置了队列模块(queue),这个模块实现了多线程安全队列、同步机制及相关数据结构。Queue模块提供了三种队列类型: FIFO…

    数据结构 2023年5月17日
    00
  • C语言植物大战数据结构快速排序图文示例

    C语言植物大战数据结构的快速排序可以分为以下步骤: 准备工作 首先需要定义一个关于植物大战中植物的结构体,例如: struct Plant { int hp; int atk; int cost; }; 然后准备一个装载植物信息的数组: struct Plant plants[] = { {75, 36, 100}, {100, 20, 50}, {125,…

    数据结构 2023年5月17日
    00
  • java数据结构与算法数组模拟队列示例详解

    下面是“java数据结构与算法数组模拟队列示例详解”的完整攻略。 标题 Java数据结构与算法:数组模拟队列示例详解 简介 本文将以Java语言为例,详细讲解如何使用数组模拟队列。对于初学者来说,队列是一个非常基础的数据结构,掌握其实现方法可以帮助进一步理解其他的数据结构和算法。 队列的定义 队列(Queue)是一种先进先出(First In First O…

    数据结构 2023年5月17日
    00
  • 题目 3158: 蓝桥杯2023年第十四届省赛真题-三国游戏(贪心)

    题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y, Z 增加Ai , Bi ,Ci 。当游戏结束时 (所有事件的发生与否已经确定),如果 X, Y, Z 的其中一个大于另外两个之…

    算法与数据结构 2023年4月30日
    00
  • Java集合和数据结构排序实例详解

    Java集合和数据结构排序实例详解 作为Java程序员,集合和数据结构是我们经常会用到的工具,其中排序是其中非常重要的一环。本文将为大家详细介绍Java中集合和数据结构排序的实例。 Java集合排序 在Java中,集合排序通常使用Collections工具类来完成。Collections提供了多种排序算法,包括插入排序、选择排序、归并排序等等。例如,下面的示…

    数据结构 2023年5月17日
    00
  • Java数据结构之图的路径查找算法详解

    Java数据结构之图的路径查找算法详解 什么是图? 在计算机科学中,图是一种非常常见的数据结构,用于表示图形和网络等概念。图由节点和边组成,其中节点表示实体,边表示这些实体之间的关系。节点和边可以表示各种各样的实体和关系,因此图在计算机科学中具有广泛的应用。 图的路径查找算法 路径查找算法是一个用途广泛的算法,它用于查找从一个节点到另一个节点的路径。在图中,…

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