线性表的顺序存储C++代码实现
关于线性表的概念,等相关描述请参看《大话数据结构》第三章的内容,
1 概念
线性表list
:零个或多个数据的有限序列。
可以这么理解:糖葫芦都吃过吧,它就相当于一个线性表,每个山楂就相当于线性表中的数据。(这很类似与线性表的顺序存储结构)
线性表有两种存储结构,顺序存储结构和链式存储结构,对线性表的操作包括:初始化,判空,清空,查找元素(返回元素和返回元素位置),插入,删除,线性表长度等,今天先放线性表顺序存储结构操作的代码实现,有参考高一凡大师的代码。
2 代码
代码分成三个文件,一个头文件,两个cpp文件,sqlist.h
头文件,实现线性表顺序存储结构,函数的声明,宏定义等,其中一个sqlist.cpp
文件实现对线性表的操作,另一个sqlist_main.cpp
文件实现测试功能。
以下代码在vs2013中亲测有效
头文件sqlist.h
#ifndef _SQLIST_H
#define _SQLIST_H#define MAXSIZE 10
#define LISTINSREMENT 2
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1typedef int Status;
typedef int ElemType;typedef struct
{ElemType *elem;int length;//当前长度int listsize;//分配的总大小(按sizeof(ElemType)的整数倍计)
}Sqlist;Status InitList(Sqlist* L);
Status DestroyList(Sqlist* L);
Status ListEmpty(Sqlist L);
Status CleanList(Sqlist* L);
int ListLength(Sqlist L);
Status ListInsert(Sqlist* L, int i, ElemType e);
Status ListDelete(Sqlist* L, int i, ElemType* e);
Status GetElem(Sqlist* L, int i, ElemType *e);
Status LocateElem(Sqlist L, ElemType e);#endif
sqlist.cpp
文件
#include "sqlist.h"
#include <iostream>
#include <assert.h>using namespace std;/*init sqlist*/
Status InitList(Sqlist* L)
{(*L).elem = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));assert(NULL != (*L).elem);(*L).length = 0;(*L).listsize = MAXSIZE;return OK;
}//destroy list
Status DestroyList(Sqlist* L)
{free((*L).elem);(*L).elem = NULL;(*L).length = 0;(*L).listsize = 0;return OK;
}//list is empty return true
Status ListEmpty(Sqlist L)
{if (0 == L.length)return TRUE;elsereturn FALSE;
}//clean list
//前提:顺序表存在
Status CleanList(Sqlist* L)
{if (NULL != (*L).elem){(*L).length = 0;return OK;}elsereturn ERROR;
}//return list length
int ListLength(Sqlist L)
{if (NULL != L.elem){return L.length;}elsereturn ERROR;
}//insert elem
//前提:顺序表存在
//1 判断i合法
//2 顺序表未满,若满,增加内存分配
//3 插入时,第i个及之后元素后移
//操作结果在第i个前面插入新元素,长度加1
Status ListInsert(Sqlist* L, int i, ElemType e)
{ElemType *newbase = NULL, *p = NULL, *q = NULL;if (NULL != (*L).elem)//顺序表存在{assert(!(i < 1 || i >(*L).length + 1));// i 不合法if ((*L).listsize <= (*L).length)//分配内存不够{newbase = (ElemType*)realloc((*L).elem, (((*L).listsize + LISTINSREMENT) * sizeof(ElemType)));assert(NULL != newbase);(*L).elem = newbase;(*L).listsize += LISTINSREMENT;}q = (*L).elem + i - 1;//新元素存放位置for (p = (*L).elem + (*L).length - 1; p >= q; p--)//第i个元素后的元素后移一位{*(p + 1) = *p;}*q = e;(*L).length++;return OK;}elsereturn ERROR;
}//delete elem
//前提:顺序表存在
//i是否合法
//删除第i个位置的元素并返回这个值
Status ListDelete(Sqlist* L, int i, ElemType* e)
{ElemType *p = NULL;if (NULL != (*L).elem){assert(!(i < 1 || i >(*L).length));p = (*L).elem + i - 1;*e = *p;for (p; p < (*L).elem + (*L).length - 1; p++){*p = *(p + 1);}(*L).length--;return OK;}elsereturn ERROR;
}//get elem
//前提:顺序表存在
//判断i的合法性
//获得第i个位置的元素并返回其值
Status GetElem(Sqlist* L, int i, ElemType *e)
{ElemType *p = NULL;if (NULL != (*L).elem){assert(!(i<1 || i>(*L).length));p = (*L).elem + i - 1;*e = *p;return OK;}elsereturn ERROR;
}//find elem
//前提:顺序表存在
//查找结束后i时候在正确范围内
//返回元素在表中的序号
Status LocateElem(Sqlist L, ElemType e)
{int i = 1;if (NULL != L.elem){while (i <= L.length && !(*L.elem++ == e))i++;return i;/*for (i = 0; i < L.length; i++){if (e == L.elem[i])break;}if(i+1 <= L.length )return i+1;elsereturn ERROR;思路正确,但不够简练*/}elsereturn ERROR;
}
sqlist_main.cpp
文件
#include "sqlist.h"
#include <iostream>
#include <assert.h>using namespace std;int main()
{Sqlist SL;Status ret;int i = 0;ElemType e;ret = InitList(&SL);cout << "init success,ret is: " << ret << endl;ret = ListEmpty(SL);cout << "return 1 is empty, ret is: " << ret << endl;ret = CleanList(&SL);cout << "return 1 mean clean success, ret is: " << ret << endl;for (i = 1; i < 10; i++){ret = ListInsert(&SL, i, i);//从头到尾插入9个数//cout << ret << endl;}ret = ListDelete(&SL, 2, &e);cout << "delete success return 1, ret is " << ret << "e is: " << e << endl;for (i = 0; i < SL.length; i++)//打印{cout << SL.elem[i] << endl;}ret = ListLength(SL);cout << "SL length is: " << ret << endl;ret = GetElem(&SL, 3, &e);cout << "get success return 1, ret is " << ret << "e is: " << e << endl;ret = LocateElem(SL, 4);cout << "e loctation is: " << ret << endl;ret = DestroyList(&SL);cout << "destroy success, ret is: " << ret << endl;system("pause");return 0;
}
不当之处请多多指点。
转载于:https://www.cnblogs.com/MisterXu/p/11173044.html
线性表的顺序存储C++代码实现相关推荐
- 线性表的增加C语言实现,数据结构(严蔚敏)C语言实现---线性表的顺序存储
总觉得写的代码差点什么,所以回过头开始看数据结构,真正去实现一下. 这次看的是线性表的顺序存储,代码如下: 1.为了增加代码可读性,用了一些宏定义,文件名称为BaseDefine.h,内容如下: #i ...
- 数据结构代码--线性表的顺序存储结构
/*** 线性表的顺序存储结构*/ public class SqList {int[] data;int length;public SqList(int leng, int length) {th ...
- 数据结构和算法:(3)3.1线性表的顺序存储结构
-----------------------1.线性表基础操作------------------------ 线性表:(List)由零个或多个数据元素组成的有限序列. 首先他是一个序列,元素之间是 ...
- 《数据结构》c语言版学习笔记——线性表的顺序存储结构
线性表的顺序存储结构 第一章 线性表的顺序存储结构 文章目录 线性表的顺序存储结构 前言 一.顺序存储结构的建立 1.条件 2.代码 二.顺序存储结构的获得元素 1.条件 2.代码 三.顺序存储结构的 ...
- 数据结构开发(3):线性表的顺序存储结构
0.目录 1.线性表的本质和操作 2.线性表的顺序存储结构 3.顺序存储结构的抽象实现和具体实现 3.1 SeqList 3.2 StaticList 和 DynamicList 4.顺序存储线性表的 ...
- 实验一 线性表的顺序存储与实现_【自考】数据结构中的线性表,期末不挂科指南,第2篇
线性表 这篇博客写的是线性表相关的内容,包括如下部分,先看下有木有期待 啥是线性表 线性表的顺序存储 线性表的基本运算在顺序表上的实现 线性表的链式存储 线性表的基本运算在单链表上的实现 循环链表与双 ...
- 线性表之顺序存储结构相关算法学习
作为一名准备干一辈子的程序员,学习算法还是很有必要的.所以从基础开始了.学习教材 是大话数据结构. 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素.代码 参照教材 采用c ...
- 线性表:2.线性表的顺序存储结构--顺序表及C语言实现
逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为 线性表的顺序存储结构 . 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中, ...
- 数据结构之线性表之顺序存储结构(3)
1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数 ...
- 顺序表(线性表的顺序存储)---C语言版
目录 顺序表 一.顺序表的定义 二.顺序表上基本操作的具体实现 1.`InitList_Sq(*L)`:初始化表.构造一个空的顺序表. 分类一:主函数里声明的是一个指向顺序表的指针 分类二:主函数里声 ...
最新文章
- 【PAT乙级】1049 数列的片段和 (20 分)
- SAP SD里CDS view对status的设计
- surround360
- 3.1 go context代码示例
- Android fragmnet标签,在Android中为Fragment添加标签?
- hdu 3038 HowManyAnswersAreWrong 并查集
- ASP.NET版在线客服系统源码 带服务端
- SpringCloud工作笔记086---SpringBoot启动报错:No active profile set, falling back to default profiles
- python提高——闭包、装饰器
- 整除光棍 (20 分)
- 【ARC083E】Bichrome Tree
- JAVA中Long与Integer踩的坑
- C++开发斗地主(QT)第三篇之动画发牌与位置计算
- 三维点云处理-chap1
- 分享陌陌怎么站街引流附近如何不屏蔽
- MyEclipse2014用外部的浏览器运行web项目
- 24点纸牌游戏,c语言实现
- 鼠标点击添加动态类名active
- 一篇文章看懂如何转行产品经理
- java web二手书店,基于jsp的二手书交易-JavaEE实现二手书交易 - java项目源码
热门文章
- div+css 背景图片的定位取图问题详解
- 450B Jzzhu and Sequences 我考研之后做的第一道题
- JSON Editor for Mac(JSON编辑器)
- 如何使用Snagit修剪视频?
- Mac磁盘工具---Disk Xray三大功能使用指南
- 一线互联网企业负载均衡和应用优化基础
- oracle 12.1.0.2中对象锁对系统的较大影响
- 代码之美~强大的构造方法重载
- ux.form.field.KindEditor 所见所得编辑器
- 利用 sql server agent(sql server代理)实现定时备份