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日

相关文章

  • C#数据结构与算法揭秘一

    C#数据结构与算法揭秘 准备工作 首先,需要在电脑上安装好Visual Studio开发环境。然后,从官网下载并安装书籍代码和演示程序。代码和示例程序都是基于.NET Framework 4.5.1平台,所以需要该版本或以上的.NET Framework。 第一章:初识数据结构和算法 该章节介绍了数据结构和算法的概念、学习数据结构和算法的重要性、以及该书的学…

    数据结构 2023年5月17日
    00
  • C语言详解数据结构与算法中枚举和模拟及排序

    我们一步步来详细讲解“C语言详解数据结构与算法中枚举和模拟及排序”的完整攻略。 纲要 本文的主要内容包括: 枚举的概念及应用 模拟的概念及应用 排序的概念及分类 枚举的概念及应用 枚举是一种数据类型,可以将一组具有相关性质的常量定义为枚举常量。枚举常量默认是按照自然数递增的顺序进行编号的。枚举常量可以用于表示状态、类型、结果等概念。以下是一个枚举类型的定义:…

    数据结构 2023年5月17日
    00
  • Java实现链表数据结构的方法

    Java实现链表数据结构的方法可以分为以下步骤: 定义链表节点类Node 首先,在Java中实现链表数据结构,需要定义一个链表节点类,称为Node。Node类中包含两个重要属性: 数据域data,用于存储每个节点的数据信息。 指针域next,用于存储下一个节点的引用。 代码示例: public class Node { public int data; //…

    数据结构 2023年5月17日
    00
  • Java深入了解数据结构之优先级队列(堆)

    Java深入了解数据结构之优先级队列(堆) 本文将会详细介绍Java中的优先级队列,即堆数据结构的实现过程和使用方法。 什么是优先级队列? 在介绍优先级队列之前,我们需要了解先进先出队列(FIFO Queue)和后进先出队列(LIFO Queue,或称栈)的概念。FIFO Queue按照元素的插入顺序依次出队;而LIFO Queue则按照元素的插入顺序反向出…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法之反转链表的方法详解

    C++数据结构与算法之反转链表的方法详解 在C++中,反转链表是一种常见的数据结构与算法技巧。在本文中,我们将详细讲解反转链表的实现过程以及常见的两种反转方法。 基本定义 在开始讲述反转链表算法之前,我们先介绍一下链表的基本定义。 链表是一种数据结构,其中每个节点包含一个数据元素和一个指向下一个节点的指针。下面是一个简单的链表的节点结构定义: struct …

    数据结构 2023年5月17日
    00
  • java数据结构实现顺序表示例

    如果想要实现一种数据结构,我们首先需要考虑它的存储结构。对于顺序存储结构,Java中的数组是一个很好的选择。下面就为大家分享关于Java数据结构实现顺序表示例的完整攻略,帮助读者更好地理解该数据结构的实现方式。 1. 定义一个顺序表数组 首先,我们需要定义一个数组类型的顺序表。这个顺序表可以使用泛型来表示各种类型的数据: public class MyArr…

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

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

    数据结构 2023年5月17日
    00
  • Android随手笔记44之JSON数据解析

    Android随手笔记44之JSON数据解析 1. JSON数据的基本概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 JavaScript 的一个子集。JSON 格式最初是为了解决 JavaScript 程序通过 AJAX 传输数据时的数据交换格式问题而出现的,但是现在已经成为了一种通用的数据格式。…

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