《数据结构与算法》——线性表之顺序表(SqList)总结
《数据结构与算法》——线性表之顺序表(SqList)总结
从前天开始着手复习线性表部分,整了3个下午才用C++对顺序表的部分内容进行了成功实现,下面就简单进行以下总结。
目录
《数据结构与算法》——线性表之顺序表总结
定义
class SqList
方法实现
错误
难点
参考文献
定义
线性表:具有线性存储结构的抽象数据类型,它是由n个数据元素组成的有限序列。其中数据元素可以是很多种,int、string、char甚至是自定义类型。
课本上还有个定义是说其他几个名词的关系:若干数据项组成了一条记录(数据元素),含有大量记录的线性表被称为文件。
在书上对抽象数据类型的线性表定义如下图:
线性表分为顺序表和链表,在本文中将对线性表中的顺序表以C++语言的方式,构建SqList类,并对其类方法进行实现。
class SqList
class SqList {private:T *data=NULL;//设置成动态的 int len,Max;int step;public:SqList(int Max , T t );//{//构造函数, int step = 50 void InitList(int Max , T t);//初始化 int length();int LocateElem(T elem);//按值查找T GetElem(int i); //按位查找void ListtInsert(int i ,T elem);void ListDelete(T elem);//删除元素void PrintList(); bool Empty();void DestroyList();void MergeList(SqList lb);//合并两个表,有序 ~ SqList();//析构函数
};
方法实现
/*编译环境:
win10专业版
DEV C++ 5.11
TDM-GCC 4.9.2 64bit
*/#include<iostream>
#include<stdlib.h>
using namespace std;
#define STEP 50
#define OVERFLOW 0template <typename T >
class SqList {private:T *data=NULL;//设置成动态的 int len,Max;int step;public:SqList(int Max , T t );//{//构造函数, int step = 50 void InitList(int Max , T t);//初始化 int length();int LocateElem(T elem);//按值查找T GetElem(int i); //按位查找void ListtInsert(int i ,T elem);void ListDelete(T elem);//删除元素void PrintList(); bool Empty();void DestroyList();void MergeList(SqList lb);//合并两个表,有序 ~ SqList();//析构函数
};template <typename T > SqList<T>::SqList(int Max , T t){//构造函数, int step = 50/** 初始化最大容量,元素类型&错误标记,步长 */T *tt = (T*)malloc(sizeof(T)*Max);if(!tt){cout<<"空间分配失败"<<endl; exit(OVERFLOW);//空间分配失败 }this->data = tt;this->data[0] = t;this->Max = Max;this->len = 0;this->step = STEP;
}template <typename T> void SqList<T>::InitList(int Max , T t){//初始化 SqList(Max , t);
}template <typename T>
int SqList<T>::length(){//返回顺序表长度 return len;
}template <typename T>
int SqList<T>::LocateElem(T elem){//按值查找int i = 0;for( ; i<=this->len && data[i]!= elem;i++);if( i <= this->len)return i;return 0;//无此值 }template <typename T>
T SqList<T>::GetElem(int i){ //按位查找if(i<=this->len && i>0 )return data[i];return data[0];
}template <typename T>
void SqList<T>::ListtInsert(int i ,T elem){//按位插值 if (i==0||i>=this->len+2)return ;if(this->len >= this->Max) {//重新分配内存块 T * Temp = (T *) realloc(this->data, sizeof(T)*(this->Max + this->step));if (Temp == NULL)// {exit(OVERFLOW);//<<"The memory relloced failed!"<<endl; //}this->data = Temp;this->Max = this->Max + this->step;}this->len ++;//长度增加 int j = this->len ;for( ; j>i ;j--){this->data[j] = this->data[j-1];}this->data[j] = elem;
} template <typename T>
void SqList<T>::ListDelete(T elem){//删除元素int i=0;while(i<len && this->data[++i]!=elem);if(i==len&&this->data[i]!=elem)return ; else{while(i<len){this->data[i] = this->data[i+1];i++;}this->len--;}
}template <typename T>
void SqList<T>::PrintList(){//输出顺序表 cout<<"[";if(len==0)cout<<" ";else{for(int i = 1 ; i < len ;i++){cout<<this->data[i]<<" ";}cout<<this->data[len];}cout<<"]"<<endl;
}template <typename T>
bool SqList<T>::Empty(){//判空 if(this->len==0)return 1;else return 0;
}template <typename T>
void SqList<T>::DestroyList(){//销毁顺序表 len=0;free(this->data); this->data = NULL;
}template <typename T>
void SqList<T>::MergeList(SqList<T> lb){//合并两个顺序表/**分为两种情况,有序和无序,无序直接合并,有序则按序合并 */int i=0,j=0;bool flag = 1; while(((++i)<this->len) && (this->data[i] <= this->data[i+1]) );//判断当前字符串是否有序 if((i <= this->len) && (this->data[this->len] < this->data[this->len-1]) )//无序 flag = 0 ;else{while(((++j) < lb.len) && (lb.data[j] <= lb.data[j+1]) );//判断合并字符串是否有序 if((j == lb.len) && (lb.data[j] >= lb.data[j-1]) )//有序 flag = 1 ;//有序elseflag = 0 ; //无序 }if(flag){//有序T * Temp = (T *) malloc(sizeof(T)*(this->Max));int len = this->len,j=1,k=1,l=1;if (!Temp)exit(OVERFLOW);while(j<=len)//辅助数组 Temp[j]= this->data[j++];if(this->Max < this->len + lb.len ){//空间不足 //对A扩充空间 T *tem = (T*) realloc(this->data, sizeof(T)*(this->Max + lb.Max));if (!tem)//exit(OVERFLOW);this->data = tem ;flag=0; }elseflag = 1;//比较大小合并 j = 1;while(j<=len && k<=lb.len)if(Temp[j] <= lb.data[k])this->data[l++] = Temp[j++];elsethis->data[l++] = lb.data[k++];while(j<=len) this->data[l++] = Temp[j++];while(k<=lb.len) this->data[l++] = lb.data[k++];}else{//无序T * Temp = (T*) realloc(this->data, sizeof(T)*(this->Max + lb.Max));lb.PrintList(); if (!Temp)exit(OVERFLOW);this->data = Temp;j=1;while(j<=lb.len){this->data[len+j] = lb.data[j++];}} this->Max = flag?this->Max :this->Max + lb.Max;this->len = this->len + lb.len;
} template <typename T>
SqList<T>::~SqList(){//析构 len=0;free(this->data); this->data = NULL;
}int main() {SqList<int> l(50,-1);cout<<"初始化:"; l.PrintList();l.ListtInsert(1,6);cout<<"在第1位插入6:";l.PrintList();l.ListtInsert(2,8);cout<<"在第2位插入8:";l.PrintList();l.ListtInsert(2,7);cout<<"在第2位插入7:";l.PrintList();l.ListtInsert(4,9);l.ListtInsert(1,5);l.ListtInsert(1,4);l.ListtInsert(1,3);l.ListtInsert(1,2);l.ListtInsert(1,1);cout<<"在插入很多数据后:";l.PrintList();cout<<"当前表长度为:"<<l.length()<<endl; l.ListDelete(4);cout<<"删除元素4:"; l.PrintList();cout<<"查询第6个元素是:"<<l.GetElem(6)<<endl;cout<<"查询元素6的位置为:"<<l.LocateElem(6)<<endl;//新建一个顺序表SqList<int> l2(50,-1);l2.ListtInsert(1,6);l2.ListtInsert(1,5);l2.ListtInsert(1,4);l2.ListtInsert(1,3);l2.ListtInsert(1,2);l2.ListtInsert(1,1);cout<<"l2有序初始化:"; l2.PrintList();l.MergeList(l2);cout<<"l与l2合并结果:"; l.PrintList();//新建一个顺序表SqList<int> l3(50,-1);l3.ListtInsert(1,9);l3.ListtInsert(1,8);l3.ListtInsert(1,5);l3.ListtInsert(1,7);l3.ListtInsert(1,4);l3.ListtInsert(1,2);cout<<"l3无序初始化:"; l3.PrintList();l.MergeList(l3);cout<<"l与l3合并结果:"; l.PrintList();l3.DestroyList();cout<<"销毁l3:"; l3.PrintList();return 0;
}
错误
在代码实现的过程中,采用了模板类+外联函数的方式,主要是为了达到C++和数据结构同时复习的目的。但在过程中以下代码总是报错:
template <typename T , int step=50 >
class SqList {private:T *data=NULL;//设置成动态的 int len,Max;int step;public:SqList(int Max , T t );//{//构造函数, int step = 50 ......};
template <typename T,int step = 50 > SqList<T>::SqList(int Max , T t){//构造函数, int step = 50T *tt = (T*)malloc(sizeof(T)*Max);if(!tt){cout<<"空间分配失败"<<endl; exit(OVERFLOW);//空间分配失败 }this->data = tt;this->data[0] = t;this->Max = Max;this->len = 0;this->step = step;
}
//错误:
/* [Error] invalid use of incomplete type 'class SqList<T>'
*[Error] declaration of 'class SqList<T>'
*原因?
*/
将其改为内联函数错误便消失,但是就想用外联函数,找原因也不知个所以然,所以就将其中的默认参数给删掉了,解决了问题。如下:
template <typename T >
class SqList {private:T *data=NULL;//设置成动态的 int len,Max;int step;public:SqList(int Max , T t );//{//构造函数, int step = 50 ......};template <typename T> SqList<T>::SqList(int Max , T t){//构造函数, int step = 50T *tt = (T*)malloc(sizeof(T)*Max);if(!tt){cout<<"空间分配失败"<<endl; exit(OVERFLOW);//空间分配失败 }this->data = tt;this->data[0] = t;this->Max = Max;this->len = 0;this->step = STEP;//宏定义STEP
}
难点
对于“数据结构”这一部分学习的难点,我认为一是对实际问题进行抽象化处理,二是对数据结构实现时的不熟练,这部分应归结于语言和编程能力的不足。
参考文献
严蔚敏,吴伟民. 数据结构(C语言版)[M]. 北京: 清华大学出版社,2013.
如有错误,还请朋友不吝指正。
《数据结构与算法》——线性表之顺序表(SqList)总结相关推荐
- 数据结构与算法(8-1)顺序表查找及优化
目录 一.顺序表查找 二.顺序表查找优化(重点) 总代码 一.顺序表查找 从头到尾或从尾到头查找. //顺序表查找(需要判断两次) int ListSearch(char ch) {for (int ...
- 数据结构与算法(一) 线性表之顺序表
线性表是一种最简单.最常用的数据结构,根据存储方式可以分为顺序表和链表. 顺序表: 顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequent ...
- Java数据结构与算法_线性表_顺序表与链表
文章目录 线性表 顺序表 顺序表API设计 顺序表的代码实现 链表 单向链表 双向链表 总结 线性表 概述 线性表是最基本.最简单.也是最常用的一种数据结构. 一个线性表是n个具有相同特性的数据元素的 ...
- 数据结构于算法—线性表
目录 前言 线性表基本架构 顺序表 插入 删除 其他操作 链表 基本结构 插入 带头节点与不带头节点 插入尾 删除 其他 代码实现 顺序表 链表 测试与结果 总结 原创公众号:bigsai 文章收藏在 ...
- Java版数据结构与算法——线性表
*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...
- 数据结构——线性表:顺序表、单链表、双链表(C++)
内容概要: 1.代码部分: 线性表抽象类 顺序表类 单链表类 双链表类 主函数 2.基本概念及注意事项 代码(测试环境VS2017): //线性表ADT类的定义:ADT_List.htemplate ...
- 1-2、数据结构线性表之顺序表的基本操作插入、删除、遍历、初始化
学习需要记录,更需要温习! 上一篇我们总结了什么是线性表,线性表的ADT类型,线性表的两种存储类型顺序存储结构和链式存储结构,今天正式进入线性表的顺序存储结构的总结和归纳,也就是数据结构的线性表的顺序 ...
- mysql 线性表_数据结构-线性表之顺序表
线性表 (1)逻辑结构和物理结构 物理结构:数据元素在内存中真实的存放次序,有可能是连续存放的,也可能是散落于内存里. 逻辑结构:为了便于描述数据元素之间的关系,我们想象出数据之间应该有某种的对应关系 ...
- 数据结构-线性表之顺序表
线性表包括顺序表和链表(单链表.双链表等),这里我们简单探讨一下线性表中顺序表的基本操作和实现. 线性表其实就是对数组的一个实现,其逻辑上和物理存储上的地址都是连续的(数组的下标是从0开始的,而线性表 ...
- 线性表、顺序表和链表,你还分不清?
摘要:其实说实话,可能很多人依然分不清线性表,顺序表,和链表之间的区别和联系! 本文分享自华为云社区<程序员必会自己设计线性表(顺序表.链表)>,原文作者:bigsai. 前言 其实说实话 ...
最新文章
- 关于arduino和zigbee串口16进制通信问题
- python接口开发django_用 Django 开发接口
- 题目:16版.雇员的工作职责(一)
- springboot快速入门(一)——HelloWorld搭建
- 判断大小_美人计 | 学会这招大小骨架判断法,我知道自己不是胖了
- Android笔记 消息机制handler+http之 网络图片浏览器demo
- python_格式化输出(%用法和format用法)
- thread类 java_java入门避坑必读,通过Thread类创建java多线程
- visio转换成eps
- 计算机应用类专业综合冲刺卷,计算机应用类专业(综合)二模试卷2011
- centos6 docker1.7 存储方式修改
- 华为鸿蒙系统首发设备,鸿蒙首发设备包装曝光:安卓已成过去式,鸿蒙正式走上舞台...
- java实现行政区域划分_JAVA采集京东的全国行政区划数据
- SpringBoot 轻松搞定数据验证 (三)
- 最新域名防红V1.19版本+已经去授权
- 英语 译林 2019 单词表
- 最新短网址生成api接口(t.cn、url.cn短链接生成)
- java表格怎样设置内间距_如何设置表格的间距和背景等属性
- 如何在同一台服务器上绑定多个域名?
- Kafka rebalance触发条件