二、线性表的概念与实现

1.线性表的本质与相关操作

线性表的定义
?线性表(List)是零个或多个数据元素的集合
?线性表中的数据元素之间是有顺序的
?线性表中的数据元素个数是有限的
?线性表中的数据元素的类型必须相同

线性表的性质
?a0为线性表的第一个元素,只有一个后继
?an为线性表的最后一个元素,只有一个前驱
?除a0和an外的其它元素ai,既有前驱,又有后继
?线性表能够逐项访问和顺序存取
线性表的一些常用操作
?创建线性表
?销毁线性表
?清空线性表
?将元素插入线性表
?将元素从线性表中删除
?获取线性表中某个位置的元素
?获取线性表的长度
线性表操作的实现
?线性表在程序中表现为一种特殊的数据类型,其操作在程序中的表现为一组函数

List* List_Create();                                                       //创建线性表
void List_Destroy(List* list);                                       //销毁线性表
void List_Clear(List* list);                                           //清空线性表
int List_Insert(List* list, ListNode* node, int pos);     //将元素插入线性表
ListNode* List_Delete(List* list, int pos);                   //将元素从线性表中删除
ListNode* List_Get(List* list, int pos);                       //获取线性表中某个位置的元素
int List_Length(List* list);                                         //获取线性表的长度

2.线性表的顺序存储结构

顺序存储定义
?线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

在C语言中可以用一维数组来实现顺序存储结构
?存储空间的起始位置:数组node
?线性表的最大容量:数组长度MAXSIZE
?线性表的当前长度:length

#define MAXSIZE 20
typedef struct  _tag_List
{
    char node[MAXSIZE];
    int length;
} List;

获取元素操作
?判断线性表是否合法
?判断位置是否合法
?直接通过数组下标的方式获取元素

char Get(List* list, int pos)
{
    char ret = -1;
    if((list != NULL) && (0 <= pos ) && (pos <= list->length))
    {
        ret = list->node[pos];
    }
    return ret;
}

插入元素操作
?判断线性表是否合法
?判断插入位置是否合法
?把最后一个元素到插入位置的元素后移一个位置
?将新元素插入
?线性表长度加1

int Insert(List* list, char c, int pos)
{
    //判断线性表是否合法
    int ret = (list != NULL);
    int i = 0;
    //判断插入位置是否合法
    ret = ret && ((list->length + 1) <= MAXSIZE);
    ret = ret && (0 <= pos);
    if(ret)
    {
        if(pos >= list->length)
            pos = list->length;
        //从最后一个元素开始到第pos个位置,分别将他们地洞到后一个位置
        for(i=list->length;i > pos; i--)
        {
            list->node[i] = list->node[i-1];
        }
        //将新元素插入
        list->node[pos] = c;
        //长度加1
        list->length++;
    }
    return ret;
}

删除元素操作
?判断线性表是否合法
?判断删除位置是否合法
?将元素取出
?将删除位置后的元素分别向前移动一个位置
?线性表长度减1

char Delete(List* list, int pos)
{
    char ret = -1;
    int i = 0;
    //判断线性表是否合法,判断删除位置是否合法
    if((list != NULL)&&(0 <= pos)&&(pos < list-> length))
    {
        ret = list->node[pos];
        for(int i=pos+1; i < list->length; i++)
            list->node[i-1] = list->node[i];
        list->length--;
    }
    return ret;
}

3.线性表的链式存储结构

链式存储定义
?为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。

链式存储逻辑结构
?n个结点链接成一个链式线性表的结构叫做链表,当每个结点中只包含一个指针域时,叫做单链表。
链表的基本概念
?表头结点
??链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息
?数据结点
??链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息
?尾结点
??链表中的最后一个数据结点,其下一元素指针为空,表示无后继
单链表示例

在C语言中可以用结构体来定义链表中的指针域;链表中的表头结点也可以用结构体实现

//结点指针域定义
typedef struct _tag_LinkListNode{
    LinkListNode* next;
} LinkListNode;

//头结点定义
typedef struct _tag_LinkList
{
    LinkListNode header;
    int length;
} TLinkList;

//数据元素定义
struct Value
{
    LinkListNode header;
    int v;
};

获取第pos个元素操作
?判断线性表是否合法
?判断位置是否合法
?由表头开始通过next指针移动pos次后,当前元素的next指针即指向要获取的元素

LinkListNode* current = (LinkListNode*) list;
for(i=0; i<pos; i++)
{
    current = current->next;
}
ret = current->next;

插入元素操作
?判断线性表是否合法
?判断插入位置是否合法
?由表头开始通过next指针移动pos次后,当前元素的next指针即指向要插入的位置
?将新元素插入
?线性表长度加1

删除元素操作
?判断线性表是否合法
?判断插入位置是否合法
?获取第pos个元素
?将第pos个元素从链表中删除
?线性表长度减1

实现代码

原文地址:https://blog.51cto.com/yinsuifeng/2355312

时间: 2024-10-14 20:44:13

二、线性表的概念与实现的相关文章

2、蛤蟆的数据结构笔记之二线性表

2.蛤蟆的数据结构笔记之二线性表 到了笔记二了,每个笔记开头都应该弄个语句激励一下自己和小伙伴. "人生中最重要的不是位置,而是前进的方向" 这次咱们学习表,没错是表.什么表?额,汉字真是博大精深,没错,只是个表.不要想歪了. 欢迎转载,转载请标明出处: 1.  定义 线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.因此,线性表

二 线性表

一. 线性表的几种形式: 1.线性表是最常用且最简单的一种数据结构. 线性表中元素的个数n定义为线程表的长度,n= 0时称为空表. 2. 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素. 这种顺序存储结构的线性表为顺序表. 线性表的特点: 优点是:可以随机存取的存储结构 缺点是:插入和删除时间复杂度高,主要耗费在移动元素上. 时间复杂度O(n).      数组 3.线性表的链式表示和实现  [字典,集合] 链式表是一组任意的存储单元存储线性表的数据元素(这组存储单元可以

线性表的概念

线性表List:零个或多个数据元素的有限序列.n=0为空表.每个元素有且仅有一个直接前驱和直接后继. 线性表的抽象数据类型: ADT List Data /*线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType.其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素.数据元素直接是一对一的关系.*/ Operation InitList(*L);  //初始化操作,建立一个空的线性表 ListEm

考研系列二-线性表合并

套用系列一的线性表类,又加了三个成员函数: 1 #include <fstream> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdlib> 5 6 using namespace std; 7 8 #define N 100 9 enum Status{success,fail,fatal,range_error,overflow}; 10 11 class List{ 12 priv

数据结构、算法、线性表总结

一.数据结构 1.概念 1.数据类型和抽象数据类型是不同的概念. 2.逻辑结构分为线性结构(一对一).树形结构(一对多).图形结构(多对多). 3.时间复杂度(T(n)=O(f(n)):空间复杂度(占用的内存空间). 4.算法 1.BF算法:时间复杂度最坏为O(n*m). 2.kmp算法:时间复杂度最坏为O(n+m). 二.线性表 1.概念 1.顺序表结点的存储地址计算公式:Loc(ai)=Loc(a1)+(i-1)*C. 2.操作主要是查找用顺序表,进行插入.删除操作的适合用链表. 3.存储密

第三讲.线性表(读书笔记)

一.线性表(List)概念 线性表(List):零个或多个数据元素的有限序列. 元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继. 二.线性表的抽象数据类型 对于一个线性表来说,插入数据和删除数据都是必须的操作. 注意一个很容易混淆的地方:当你传递一个参数给函数的时候,这个参数会不会在函数内被改动决定了使用什么参数形式.如果需要被改动,则需要传递指向这个参数的指针,如果不用被改动,可以直接传递这个参数. 三.线性表的顺序存储结构 线

线性表之顺序存储结构实现(上)

一,线性表的概念以及数学定义 1.线性表的概念 零个或多个数据元素的有限序列.首先说明这是一个序列,也就是说数据元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且仅有一个前驱和后继. 2.数学定义 若将线性表记为(a1...ai-1,ai,ai+1....an),则线性表中,ai-1领先于ai,ai领先于ai+1,则称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素,当i=1,2....n-1的时候,ai有且仅有一个直接后继元素,当i=2,3

02.线性表(一)顺序存储结构

顺序存储结构 一.线性表基本概念 1.线性表定义 线性表(list)是指零个或多个数据元素的有限序列,所有数据元素为相同数据类型且一个数据元素可以由多个数据项组成.若将线性表记为(a1,..ai-1,ai,ai+1...,an),线性表元素的个数n(n>0,n=0时为空表)定义为线性表的长度,其中ai-1是ai 的直接前驱元素,ai+1是ai的直接后继元素. 2.线性表的抽象数据类型 ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,....an},每个元素的类型均匀Da

算法系列15天速成——第七天 线性表【上】

原文:算法系列15天速成--第七天 线性表[上] 人活在社会上不可能孤立,比如跟美女有着千丝万缕的关系,有的是一对一,有的是一对多,有的是多对多. 哈哈,我们的数据也一样,存在这三种基本关系,用术语来说就是: <1>  线性关系. <2>  树形关系. <3>  网状关系. 一: 线性表 1 概念: 线性表也就是关系户中最简单的一种关系,一对一. 如:学生学号的集合就是一个线性表. 2 特征: ① 有且只有一个“首元素“. ② 有且只有一个“末元素”. ③ 除“末元素”