线性表->顺序存储
文字描述:
用一组地址连续的存储单元依次存储线性表的数据元素,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。
即是,线性表的顺序存储结构的特定是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单、直观的公式来表示。但是这也导致了它的一个弱点,在作插入或删除操作时,需移动大量元素。
示意图
算法分析
在顺序存储结构的线性表中某个位置上插入或删除一个数据元素,其时间主要耗费在移动元素上,而移动的元素个数取决于插入或删除的位置。故其插入和删除的时间复杂度为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去实现其中的某些算法和结构.实际上算法和语言关系不大, ...
随机推荐
- Existing lock /var/run/yum.pid: another copy is running as pid 解决办法
yum只能支持一个例程运行,所以如果有一个例程已经在运行,其他的必须等待该进程退出释放lock.出现这种情况时,可以用以下命令来恢复: rm -f /var/run/yum.pid
- Java面试题复习笔记(前端)
1.Html,CSS,Jsp在网页开发中的定位? Html——定义网页结构(超文本标记语言) CSS——层叠样式表,用来美化界面 Jsp——主要用来验证表单,做动态交互(Ajax) 2.介绍Ajax? ...
- Java Callable使用
1. 创建线程的三种方式: 继承Thread,重写run方法 实现Runnable接口,重新run方法 实现Callable接口,重写call方法 2. Callable接口实际上是属于Executo ...
- 代码生成工具更新--快速生成Winform框架的界面项目
在之前版本的代码生成工具Database2Sharp中,由于代码生成都是考虑Winform和Web通用的目的,因此Winform界面或者Web界面都是单独生成的,在工具中生成相应的界面后,复制到项目里 ...
- zTree 3-- jQuery 树插件笔记
地址:http://www.treejs.cn/v3/demo.php#_507 数据结构json,里可以自定义属性. var zNodes =[ { name:"父节点1 - 展开&quo ...
- Codeforces 1098B. Nice table 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1098B.html 题解 首先,我们来证明一个结论: 合法的矩阵要么满足每列只有两种字符,要么满足每行只有两 ...
- Centos下安装配置Mongodb3.6
首先更新系统 yum -y update 1.安装Mongodb 编辑Mongodb安装源 vim /etc/yum.repos.d/mongodb-org-3.6.repo 编辑内容如下: [mon ...
- open
open服务指的是封装的订单流接口,给外部第三方提供使用.(当然也可以区别的名字,我司这么叫而已,并且是用Java写的,谁晓得为什么不选择PHP来写)通过open api合作方就可以通过调用接口直接下 ...
- 【AtCoder】【模拟】【模型转化】Camel and Oases(AGC012)
题意: 有一个骆驼,n个绿洲遍布在数轴上,第i个绿洲的坐标为x[i],保证x[i]单增.骆驼的驼峰有体积初始值V.当驼峰的体积变为v的时候,驼峰中至多只能够存储v L的水.骆驼希望走完所有的绿洲,并且 ...
- web.xml配置文件的简单说明
简单说一下,web.xml的加载过程.当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等).首先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的 ...