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日

相关文章

  • 腾讯2018秋招正式笔试题目小结

    腾讯2018秋招正式笔试题目小结 背景介绍 腾讯作为中国科技领域的佼佼者,每年都会举行大规模的招聘,吸引着众多优秀的应聘者前来。其中,笔试是选拔过程中的重要环节,也是一个入职的关键。本文旨在对腾讯2018秋招正式笔试的题目进行详细的分析和总结,帮助广大应聘者更好地进行准备。 题目类型 腾讯2018秋招正式笔试共分为两个部分:编程题和客观题。编程题主要考察应聘…

    数据结构 2023年5月17日
    00
  • Java队列数据结构的实现

    下面是实现Java队列数据结构的完整攻略。 Java队列数据结构的实现 1. 概述 队列是一种常用的线性数据结构,是“先进先出”(FIFO)的一种数据结构。队列通常具有两个操作:入队和出队,它们分别对应着在队列尾添加元素和在队列头删除元素的操作。 在Java中,有多种方式可以实现队列数据结构,本文将讲解两种常用的实现方式:基于数组的实现和基于链表的实现。 2…

    数据结构 2023年5月17日
    00
  • java中的PriorityQueue类过程详解

    Java中的PriorityQueue类过程详解 Java中的PriorityQueue类是一个基于优先级堆的无界优先级队列,它以小顶堆的形式来维护队列。在Java Collections Framework中,它实现了Queue接口,因此可以使用Queue的所有方法。 PriorityQueue类的基本性质 元素按照优先级排序:PriorityQueue类…

    数据结构 2023年5月17日
    00
  • C语言实现带头结点的链表的创建、查找、插入、删除操作

    C语言实现带头结点的链表的创建、查找、插入、删除操作攻略 一、链表基本概念 链表是一种动态的数据结构,它可以在运行时动态地分配内存,支持数据的插入、删除等操作。链表(Linked List)由多个节点(Node)组成,每个节点包含两部分,一个是数据部分(Data),另一个是指向下一个节点的指针(Next)。 二、带头结点的链表 带头结点的链表是一种特殊的链表…

    数据结构 2023年5月17日
    00
  • 快速排序(整数)的C语言代码和JAVA代码

    一、问题描述 我们目前有一些数据,这些数据都是整数,然后我们现在需要做的就是把这些数据按照小到大排一下,然后输出出来。 二、问题的解决办法 首先确认一下分界点,我们常见的分界点是第一个点,第二个点,中间的一个点; 然后我们调整一下范围,也就说所有小于等于某个点的值在左半边,大于等于某个点的值在右半边。 递归处理左右两端。 案例如下: 我们首先手头有一些数据,…

    算法与数据结构 2023年4月18日
    00
  • Python中的函数式编程:不可变的数据结构

    Python是一门支持函数式编程的语言。相比于传统的命令式编程,函数式编程更加强调数据的不可变性。本文将介绍如何在Python中使用不可变的数据结构实现函数式编程。 什么是不可变的数据结构? 不可变数据结构是指一旦创建就无法改变的数据结构。在Python中,元组(tuple)是一个典型的不可变数据结构。以下是一个创建元组的示例代码: a_tuple = (1…

    数据结构 2023年5月17日
    00
  • C#数据结构之单链表(LinkList)实例详解

    C#数据结构之单链表(LinkList)实例详解 概述 单链表是一种简单的数据结构,它由一些节点组成,每个节点包含着一个数据元素和一个指向下一个节点的指针。它的特点是可以快速的插入和删除节点,但在查找元素时效率不高。本篇文章将详细讲解单链表的实现过程和相关细节。 实现步骤 定义节点类 首先需要定义一个单链表节点类,包含两个部分:数据和指向下一个节点的指针。代…

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

    当我们准备面试数据库相关的职位时,需要掌握SQL语言和常见的数据库管理系统。下面是针对Java面试中可能出现的常见数据库面试题的一些攻略。 1. 数据库连接的常见方式 在Java中,要与数据库连接有两种方式:JDBC和ORM框架。 (1) JDBC JDBC是Java连接数据库的标准方式,使用JDBC可以通过Java程序来连接不同的数据库。连接数据库的步骤包…

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