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日

相关文章

  • 【ACM组合数学 | 错排公式】写信

    题目链接:https://ac.nowcoder.com/acm/contest/54484/B 题意很简单,但是数据范围偏大。 错排公式 首先来推导一下错排公式: \[D(n) = n!\sum_{k=0}^{n}\frac{(-1)^k}{k!} \] 设一个函数: \[S_i表示一个排列中p_i = i的方案数 \] 那么我们可以知道: \[D(n) …

    算法与数据结构 2023年4月17日
    00
  • Java数据结构之链表、栈、队列、树的实现方法示例

    Java数据结构之链表、栈、队列、树的实现方法示例 链表 链表是一种线性数据结构,由节点的集合构成。每个节点包含两部分,数据部分和指针部分。数据部分用于存储数据,指针部分用于指向下一个节点。 单向链表示例 public class LinkedList<E>{ private Node<E> head; private int siz…

    数据结构 2023年5月17日
    00
  • Java数据结构之实现哈希表的分离链接法

    Java数据结构之实现哈希表的分离链接法 哈希表是一种非常常用的数据结构,它将数据存储在一个数组中,每个数组元素都存储着链表中的一个节点,这样可以实现高效的数据存储和查找操作。在哈希表中,我们可以通过哈希函数将关键字映射到数组中的特定位置。 但是,当哈希表的负载因子过高时,就会造成哈希冲突,这意味着两个或更多的关键字映射到了同一个数组位置。一种常见的解决方案…

    数据结构 2023年5月17日
    00
  • Java数据结构BFS广搜法解决迷宫问题

    Java数据结构BFS广搜法解决迷宫问题 什么是BFS广搜法? 广度优先搜索(BFS)是一种遍历或搜索数据结构(例如树或图)的算法经典方法之一,也是解决迷宫问题的有效解法之一。BFS方法是从图的某个节点出发,以广度优先的方式依次访问与该节点相通的各节点,直到访问所有节点。BFS算法主要借助队列的数据结构来实现。 解决迷宫问题的具体实现 数据准备: 在解决迷宫…

    数据结构 2023年5月17日
    00
  • 【ACM博弈论】SG函数入门(2):博弈树SG函数的转移与子游戏的合并

    上一篇文章我们讲了两种经典的博弈模型:《【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏》,这一节我们开始讲解SG函数。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https:…

    算法与数据结构 2023年4月17日
    00
  • Go语言数据结构之二叉树必会知识点总结

    Go语言数据结构之二叉树必会知识点总结 二叉树是一种非常重要的数据结构,它被广泛应用于算法、数据处理等领域。在Go语言中,使用二叉树可以实现很多高级数据结构和算法。本文将为大家介绍二叉树相关的基本知识和操作,以及如何利用Go语言实现二叉树。 什么是二叉树? 二叉树是一种树形结构,由一个根节点和两个子树组成。它的每个节点最多有两个子节点,称为左子节点和右子节点…

    数据结构 2023年5月17日
    00
  • C++实现LeetCode(211.添加和查找单词-数据结构设计)

    首先,我们需要先了解一下题目的要求和限制,以及具体的解题思路。 题目描述 设计一个支持添加、删除、查找单词的数据结构。添加和删除单词的操作需要支持普通词和通配符’.’。查找单词只支持普通词,不支持通配符’.’。所有单词都是非空的。 解题思路 这道题可以使用前缀树(Trie树)来实现。 首先,我们需要定义一个单词类,它包含两个字段:单词字符串和单词长度。然后,…

    数据结构 2023年5月17日
    00
  • Java面试题冲刺第十九天–数据库(4)

    本篇攻略是针对Java数据库相关面试题的,为了方便浏览,我将其分为以下几个部分: 1. 数据库连接池 在Java开发中,我们使用JDBC连接数据库进行数据操作时,为了提高数据库访问性能,通常会使用数据库连接池技术。常见的数据库连接池有:C3P0、Druid、HikariCP等。 C3P0 C3P0是一个开源的数据库连接池,可以设置最大连接数、最小连接数、最大…

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