线性表->顺序存储
文字描述:
用一组地址连续的存储单元依次存储线性表的数据元素,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。
即是,线性表的顺序存储结构的特定是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单、直观的公式来表示。但是这也导致了它的一个弱点,在作插入或删除操作时,需移动大量元素。
示意图
算法分析
在顺序存储结构的线性表中某个位置上插入或删除一个数据元素,其时间主要耗费在移动元素上,而移动的元素个数取决于插入或删除的位置。故其插入和删除的时间复杂度为n。
在顺序存储结构的线性表中求“表长”和“取第i个数据元素”的时间复杂度为1。
在顺序存储结构的线性表中,union算法(将所有在线性表Lb但不在线性表La中的数据元素插入到La,即La=La U Lb), 其时间复杂度为La.length X Lb.length; 但是如果La,Lb是有序的,另外新建Lc存放结果,其时间复杂度将变为MAX(La.length+Lb.length).
代码实现
//
// Created by lady on 19-1-26.
// /*
现性表的顺序表示和实现
现性表的顺序表示:用一组地址连续的存储单元依次存储线性表的数据元素。
*/
#include <stdio.h>
#include <stdlib.h> //-------------线性表的动态分配顺序存储结构------------------
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LIST_INCREMENT 10 //线性表存储空间的分配增量
typedef int ElemType;
typedef struct{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList; /*构造一个空的线性表*/
static int InitList_Sq(SqList *L)
{
if(L==NULL){
return -;
}
if((L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType))) == NULL){
//存储分配失败
return -;
}
//空表长度为0
L->length = ;
//初始存储容量
L->listsize = LIST_INIT_SIZE;
return ;
} /*在L中第i个位置之前插入新的数据元素e,L的长度增1*/
static int ListInsert_Sq(SqList *L, int i, ElemType e)
{
//i的合法值为1 <= i <= ListLength_Sq(L)+1
if((i<) || (i>L->length+))
return -;
if(L->length >= L->listsize){
//当前存储空间已满,增加分配
ElemType *newbase = NULL;
if((newbase=(ElemType*)realloc(L->elem, (L->listsize+LIST_INCREMENT)*sizeof(ElemType))) == NULL){
//存储分配失败
return -;
}
//新的基址
L->elem = newbase;
//增加存储容量
L->listsize += LIST_INCREMENT;
}
//q为插入位置
ElemType *q = (L->elem+i-);
ElemType *p;
for(p=(L->elem+L->length-); p>=q; --p){
//插入位置及之后的元素右移
*(p+) = *p;
}
//插入e
*q = e;
//表长增1
L->length += ;
return ;
} /*删除L中的第i个数据元素,并用e返回其值, L的长度减1*/
static int ListDelete_Sq(SqList *L, int i, ElemType *e)
{
//i的合法值为1 <= i <= ListLength_Sq(L)
if((i<) || (i>L->length)){
return -;
}
ElemType *p;
ElemType *q;
//p为被删除元素的位置
p = L->elem+i-;
//被删除元素的值赋给e
*e = *p;
//表尾元素的位置
q = L->elem+L->length-;
for(++p;p<=q;++p){
//被删除元素之后的元素坐移
*(p-) = *p;
}
//表长减1
L->length -= ;
return ;
} /*依次对L的每个数据元素调用函数fun。一旦fun失败,则操作失败*/
static int ListTraverse_Sq(SqList L, int (*fun)(ElemType,int), char info[])
{
printf("顺序存储的线性表%s", info);
int i = ;
for(i=; i<L.length; i++)
{
if(fun(L.elem[i],i+) < ){
printf("Err:when traverse(e,%d) wrong!\n",i);
return -;
}
}
printf("\n");
return ;
} /*
* 在顺序表L中查找第1个值与e满足fun的元素的位序
* 若找到, 则返回其在L中的位置, 否则返回0
*/
static int LocateElem_Sq(SqList L, ElemType e, int (*fun)(ElemType,ElemType))
{
//i的初值为第一个元素的位置
int i = ;
ElemType *p;
//p的初值为第一个元素的存储位置
p = L.elem;
while(i<=L.length && (fun(*p++,e)))
++i;
if(i<=L.length)
return i;
return ;
} /*销毁线性表L*/
static int DestroyList_Sq(SqList *L)
{
if(L == NULL)
return -;
if(L->elem){
free(L->elem);
L->elem = NULL;
}
L->length = ;
L->listsize = ;
return ;
} /*
* 已知顺序线性表La和Lb的元素按照非递减排列
* 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
* 时间复杂度为MAX(La.length, Lb.length)
*/
static int MergeList_Sq(SqList La, SqList Lb, SqList *Lc)
{
if(Lc == NULL){
return -;
} ElemType *pa = La.elem, *pa_last;
ElemType *pb = Lb.elem, *pb_last; Lc->length = La.length + Lb.length;
Lc->listsize = La.length + Lb.length; if((Lc->elem = (ElemType*)malloc(Lc->listsize * sizeof(ElemType))) == NULL){
//存储分配失败
Lc->length = ;
Lc->listsize = ;
return -;
}
ElemType *pc = Lc->elem; pa_last = La.elem+La.length-;
pb_last = Lb.elem+Lb.length-;
while((pa<=pa_last) && (pb<=pb_last)){
//归并
if(*pa <= *pb){
*pc++ = *pa++;
}else{
*pc++ = *pb++;
}
}
while(pa<=pa_last){
//插入La的剩余部分
*pc++ = *pa++;
}
while(pb<=pb_last){
//插入Lb的剩余部分
*pc++ = *pb++;
}
return ;
} //打印位置loc和其数据元素e
static int printE(ElemType e, int loc)
{
printf("%3d=%-3d", loc, e);
return ;
} //比较元素e1和e2是否相等, 相等返回0,否则返回-1
static int equal(ElemType e1, ElemType e2)
{
if(e1==e2){
return ;
}else{
return -;
}
} int main(int argc, char *argv[])
{
SqList L;
if(InitList_Sq((&L)) < ){
printf("Err:init sqList wrong!\n");
goto End;
} ElemType e;
int location;
int data; //以插入法构造一个线性表·[12,13,21,24,28,30,42,77]
ListInsert_Sq(&L, , );
ListInsert_Sq(&L, , );
ListInsert_Sq(&L, , );
ListInsert_Sq(&L, , );
ListInsert_Sq(&L, , );
ListInsert_Sq(&L, , );
ListInsert_Sq(&L, , );
ListInsert_Sq(&L, , );
ListTraverse_Sq(L, printE, "L:");
printf("\n"); //insert a data and print
printf("insert a data and print, please input (locatioon, data):");
scanf("%d,%d", &location, &data);
ListInsert_Sq(&L, location, data);
ListTraverse_Sq(L, printE, "L:");
printf("\n"); //delete a data and print
printf("delete a data and print, please input (location):");
scanf("%d", &location);
ListDelete_Sq(&L, location, &e);
ListTraverse_Sq(L, printE, "L:");
printf("\n"); //locate a data and print
printf("locata a data and print, please input (data):");
scanf("%d", &data);
location = LocateElem_Sq(L, data, equal);
printf("the location of the first data who equals to %d is %d!\n\n", data, location); printf("Merge LA and LB to LC!\n");
SqList La, Lb, Lc;
if(InitList_Sq(&La) || InitList_Sq(&Lb)){
printf("Err:init sqList wrong!\n");
goto End;
}
//构造一个值非递减的线性表:LA [3,5,8,11]
ListInsert_Sq(&La, , );
ListInsert_Sq(&La, , );
ListInsert_Sq(&La, , );
ListInsert_Sq(&La, , );
ListTraverse_Sq(La, printE, "LA"); //构造一个值非递减的线性表:LB [2,6,8,9,11,15,20]
ListInsert_Sq(&Lb, , );
ListInsert_Sq(&Lb, , );
ListInsert_Sq(&Lb, , );
ListInsert_Sq(&Lb, , );
ListInsert_Sq(&Lb, , );
ListInsert_Sq(&Lb, , );
ListInsert_Sq(&Lb, , );
ListTraverse_Sq(Lb, printE, "LB"); //将线性表La和Lb按照非递减形式归并成线性表Lc
if(MergeList_Sq(La, Lb, &Lc))
{
printf("Err:when merge(La,Lb) wrong!\n");
goto End;
}
ListTraverse_Sq(Lc, printE, "LC"); End:
DestroyList_Sq(&L);
DestroyList_Sq(&La);
DestroyList_Sq(&Lb);
DestroyList_Sq(&Lc);
return ;
}
顺序存储的线性表(动态表示)
代码运行
/home/lady/CLionProjects/untitled/cmake-build-debug/untitled
顺序存储的线性表L: 1=12 2=13 3=21 4=24 5=28 6=30 7=42 8=77 insert a data and print, please input (locatioon, data):5,25
顺序存储的线性表L: 1=12 2=13 3=21 4=24 5=25 6=28 7=30 8=42 9=77 delete a data and print, please input (location):5
顺序存储的线性表L: 1=12 2=13 3=21 4=24 5=28 6=30 7=42 8=77 locata a data and print, please input (data):42
the location of the first data who equals to 42 is 7! Merge LA and LB to LC!
顺序存储的线性表LA 1=3 2=5 3=8 4=11
顺序存储的线性表LB 1=2 2=6 3=8 4=9 5=11 6=15 7=20
顺序存储的线性表LC 1=2 2=3 3=5 4=6 5=8 6=8 7=9 8=11 9=11 10=15 11=20 Process finished with exit code 0
线性表->顺序存储的更多相关文章
- 01线性表顺序存储_List--(线性表)
#include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...
- 线性表顺序存储方式的C语言实现
/* 编译器VC6++ 文件名1.cpp 代码版本号:1.0 时间:2015年9月14日16:39:21 */ #include <stdio.h> #include <stdlib ...
- 线性表 顺序存储 链式存储 ---java实现
首先抽象出一个线性表抽象类(包括主要的增删操作) public abstract class MyAbstractList<E> { public abstract void add(E ...
- 线性表顺序存储_List
#include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include &q ...
- 2.2_线性表的顺序存储结构_参考集合ArrayList
[线性表的顺序存储从结构] 指的是用一段连续的存储单元一次储存线性表的数据元素. [线性表的顺序存储的结构代码 C语言版] #define MAXSIZE 20 /*存储空间初始分配量*/ typed ...
- C++编程练习(1)----“实现简单的线性表的顺序存储结构“
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 故可以用数组来实现顺序存储结构. 用C++编写的利用数组实现简单的读取.插入和删除功能的线性表. #include< ...
- c++实验2 顺序存储线性表
线性表顺序存储 实现了动态数组的增删改查 前驱后继 A=AUB 动态数组右移 (1)顺序表存储结构的定义(类的声明): class SeqList { protected: DataType *l ...
- 线性表的顺序存储C++代码实现
关于线性表的概念,等相关描述请参看<大话数据结构>第三章的内容, 1 概念 线性表list:零个或多个数据的有限序列. 可以这么理解:糖葫芦都吃过吧,它就相当于一个线性表,每个 ...
- 数据结构线性表(js实现)
最近在复习数据结构的过程中,发现基本上数据结构都是用C来实现的,自己之前学习的时候也是用C去写的,由于目前对js更为熟悉一些,所以这里选择使用js去实现其中的某些算法和结构.实际上算法和语言关系不大, ...
随机推荐
- WebService - [Debug] undefined element declaration 's:schema'
错误: [ERROR] undefined element declaration 's:schema' line 44 of http://www.webxml.com.cn/WebServices ...
- Pytorch报错记录
1.BrokenPipeError 执行以下命令时: a,b = iter(train_loader).next() 报错:BrokenPipeError: [Errno 32] Broken pip ...
- java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
♦ 问题所在:项目lib包里少一个jar包 ♦ 解决办法: commons-lang3-3.1.jar 导入到项目就ok
- 【原创】大数据基础之Spark(2)Spark on Yarn:container memory allocation容器内存分配
spark 2.1.1 最近spark任务(spark on yarn)有一个报错 Diagnostics: Container [pid=5901,containerID=container_154 ...
- 新增项目到GIT仓库中
在本地新建项目的目录中打开Git Bash命令行工具 运行以下命令,设置全局信息(包括用户名,邮箱地址) git config --global user.name "你的姓名" ...
- 结构体重载运算符&srand&rand
先上代码,再按代码讲解 #include<stdio.h>#include<string.h>#include<stdlib.h>#include<time. ...
- Java判断水仙花数
水仙花数 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI).自恋数.自幂数.阿姆斯壮数或阿姆斯特朗数( ...
- 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用
学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...
- UOJ#347. 【WC2018】通道 边分治 虚树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ347.html 题意 有三棵树,边有边权. 对于所有点对 (x,y) 求在三棵树上 x 到 y 的距离之和 ...
- 2018山东省赛sequence
2018山东省赛sequence因为必须要删除一个数,所以可以计算每个数删除的代价,从而选取代价最小的进行删除如果一个数大于它前面的所有数的最小值而小于次小值,删除最小值的代价就要+1:如果一个数本身 ...