线性表的顺序存储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 1
typedef 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;
else
return FALSE;
}
//clean list
//前提:顺序表存在
Status CleanList(Sqlist* L)
{
if (NULL != (*L).elem)
{
(*L).length = 0;
return OK;
}
else
return ERROR;
}
//return list length
int ListLength(Sqlist L)
{
if (NULL != L.elem)
{
return L.length;
}
else
return 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;
}
else
return 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;
}
else
return 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;
}
else
return 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;
else
return ERROR;
思路正确,但不够简练
*/
}
else
return 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;
}
不当之处请多多指点。
线性表的顺序存储C++代码实现的更多相关文章
- 2.2_线性表的顺序存储结构_参考集合ArrayList
[线性表的顺序存储从结构] 指的是用一段连续的存储单元一次储存线性表的数据元素. [线性表的顺序存储的结构代码 C语言版] #define MAXSIZE 20 /*存储空间初始分配量*/ typed ...
- 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...
- 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现
逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...
- 线性表的顺序存储和链式存储c语言实现
一.线性表的顺序存储 typedef int ElemType;typedef struct List { ElemType *data;//动态分配 ,需要申请空间 int length; }Lis ...
- 线性表的顺序存储结构——java
线性表的顺序存储结构:是指用一组地址连续的存储单元一次存放线性表的元素.为了使用顺序结构实现线性表,程序通常会采用数组来保存线性中的元素,是一种随机存储的数据结构,适合随机访问.java中ArrayL ...
- C++编程练习(1)----“实现简单的线性表的顺序存储结构“
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 故可以用数组来实现顺序存储结构. 用C++编写的利用数组实现简单的读取.插入和删除功能的线性表. #include< ...
- 线性表的顺序存储设计和实现 - API函数实现
基本概念 设计与实现 插入元素算法 判断线性表是否合法 判断插入位置是否合法 把最后一个元素到插入位置的元素后移一个位置 将新元素插入 线性表长度加1 获取元素操作 判断线性表是否合法 判断位置是否合 ...
- C 线性表的顺序存储实现及插入、删除等操作示例
一.线性表的定义 线性表(Linear List)是由同一类型元素构成的有序序列的线性结构.线性表中元素的个数称为线性表的长度:线性表内没有元素(长度为0)时,称为空表:表的起始位置称为表头,表的结束 ...
- 线性表的顺序存储结构之顺序表类的实现_Java
在上一篇博文——线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构——顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放 ...
随机推荐
- ASP.NET Core 配置身份验证
以AspUser的Password为例,去掉最少1个大写字母,1个小写字母等等坑爹的要求在Startup的ConfigureServices中进行配置 services.Configure<Id ...
- 就服务器项目部署debug谈谈自己的感受
前言 学校小组Project那些外国人啥也不会, 基本上我一个人全包了前端和后端, 说实话这些天来也感受到了写一个比较拿得出手的web确实也不是这么容易的, 特别是我没什么项目经验, 很多时候碰到问题 ...
- Tab切换顺序设置
使用TabIndex设置顺序 <StackPanel Orientation="Vertical"> <Button Content="Button1& ...
- qml实现对SSL的支持(使用msys2,同时支持32和64位)超详细 good
首先准备环境.两种方法,使用mingw64 或者VS 直接放上下载地址https://sourceforge.net/projects/msys2/我下载的是msys2-x86_64-20161025 ...
- 小米手机销量暴跌36% 雷军做错了什么?(人的需求是复杂的,而不是仅仅是一个性价比;要做体验价格比,而不是配置价格比)good
小米手机销量暴跌36% 雷军做错了什么? 日前,小米科技创始人雷军在美国马萨诸塞州剑桥市出席了第20届哈佛中国论坛开幕式并发表了演讲.在演讲中,雷军说但小米却只用两年半的时间一跃成为了中国第一,世界第 ...
- Android零基础入门第61节:滚动视图ScrollView
原文:Android零基础入门第61节:滚动视图ScrollView 前面几期学习了ProgressBar系列组件.ViewAnimator系列组件.Picker系列组件和时间日期系列组件,接下来几期 ...
- UWP项目生成安装包远程安装在树莓派上
原文: UWP项目生成安装包远程安装在树莓派上 哎,好纠结啊!如果这个名字写的太长,会显得太繁琐,如果写的短又好像说不清楚,我这语言表达水平实在是令人担忧啊!不过应该能够明白啥意思吧!因为对这个感兴趣 ...
- Qt DLL总结【二】-创建及调用QT的 DLL(三篇)good
目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...
- Excel报表开发(本节主要讲述导出到Excel操作)
一.Excel导入到GridView以及数据库操作比较简单,这儿不做过多讲解,需要注意的有二点: 1.设置IMEX=1将强制混合数据转换为文本. 2.解决Excel驱动程序默认读取8行:将" ...
- C语言实现常用数据结构——二叉树
#include<stdio.h> #include<stdlib.h> #define SIZE 10 typedef struct Tree { int data; str ...