SeqList.h

#ifndef SEQLIST_H
#define SEQLIST_H
#include<iostream>
using namespace std; typedef enum{TRUE,FALSE}Status;
template<class Type>
class SeqList
{
private:
enum{DefaultSize = 10}; //顺序表的默认长度
Type *base; //存放元素数组的首地址
int capacity; //顺序表的容量
int size; //顺序表实际存放元素的个数
private://为内部函数所调用,不希望在类外訪问
bool IsFull()
{
if (size == capacity)
return true;
else
return false;
}
bool IsEmpty()
{
if (size == 0)
return true;
else
return false;
}
Status destory()
{
if (base == NULL)
return FALSE;
delete[] base;
base = NULL;
capacity = size = 0;
return TRUE;
}
public:
SeqList(int sz = DefaultSize)
{
capacity = sz > capacity ? sz : capacity;
base = new Type[capacity];
size = 0;
}
~SeqList()
{
destory();
}
Status push_back(const Type &x)
{
if (IsFull())
{
cout << "空间已满" << x << "不能插入" << endl;
return FALSE;
}
base[size++] = x;
return TRUE;
}
Status push_front(const Type &x)
{
if (IsFull())
{
cout << "空间已满" << x << "不能插入" << endl;
return FALSE;
}
for (int i = size - 1; i >= 0; --i) //------------------>从最后一个元素到第一个元素依次往后移动一个位置
base[i+ 1] = base[i];
base[0] = x;
size++;
return FALSE;
}
void show_list()
{
for (int i = 0; i < size; ++i)
cout << base[i] << " ";
cout << endl;
}
Status pop_back(Type &x)//将删除的元素存放在x中,以备不时之需
{
if (IsEmpty())
{ cout << "空间已空,不能删除" << endl;
return FALSE;
}
x = base[--size];
return TRUE;
}
Status pop_front(Type &x)
{
if (IsEmpty())
{
cout << "空间已空。不能删除" << endl;
return FALSE;
}
x = base[0];//将删除的元素保存在x中,以备不时之需
for (int i = 1; i <= size - 1; ++i) //--------------->从第二个元素到最后一个元素,依次覆盖前一个元素
base[i - 1] = base[i];
size--;
return TRUE;
}
Status insert_pos(int pos,const Type &x)
{
if (pos < 0 || pos >= size)
{
cout << "插入位置无效" << endl;
return FALSE;
}
if (IsFull())
{
cout << "空间已满" << x << "不能插入" << endl;
return FALSE;
}
for (int i = size - 1; i >= pos; --i)//--------------->从最后一个元素到所插入的位置的元素依次往后移动一个位置,为所要插入的元素留出位置
base[i + 1] = base[i];
base[pos] = x;
size++;
return TRUE;
}
Status delete_pos(int pos,Type &x)
{
if (pos < 0 || pos >= size)
{
cout << "删除位置无效" << endl;
return FALSE;
}
if (IsEmpty())
{
cout << "空间已空,不能删除" << endl;
return FALSE;
}
x = base[pos];
for (int i = pos + 1; i < size; ++i)//从删除位置后面的第一个元素開始依次覆盖前一个元素
base[i - 1] = base[i];
size--;
return TRUE;
}
int find(const Type &x)
{
for (int i = 0; i < size; ++i)
{
if (base[i] == x)
return i;
}
return -1;
}
void sort()//冒泡排序
{
for (int i = 0; i < size - 1; ++i)//排序size-1次
{
for (int j = 0; j < size - 1 - i; ++j)
{
if (base[j] > base[j + 1])
{
Type tmp = base[j];
base[j] = base[j + 1];
base[j + 1] = tmp;
}
}
} }
void reserve()//左右对称位置交换
{
int left = 0;
int right = size - 1;
while (left < right)
{
Type tmp = base[left];
base[left] = base[right];
base[right] = tmp;
left++;
right--;
}
}
Status insert_val(const Type &x)
{
if (IsFull())
{
cout << "空间已满" << x << "不能按值插入" << endl;
return FALSE;
}
sort();
for (int i = 0; i < size; ++i)
{
if (base[i] > x)//存在比所要插入元素大的元素,在该位置插入它
{
insert_pos(i, x);
return TRUE;
}
}
base[size++] = x;//不存在比所要插入元素大的元素,在最后位置插入它
return TRUE;
}
/*
Status insert_val(const Type &x)//用while取代for
{
if (IsFull())
{
cout << "空间已满" << x << "不能按值插入" << endl;
return FALSE;
}
sort();
int i = 0;
while(i<size && x > base[i])
{
i++;
}
insert_pos(i,x);
return TRUE;
}
*/
Status delete_val(const Type &x)
{
int n = find(x);
if (n == -1)
{
cout <<x<< "不存在,无法删除" << endl;
return FALSE;
}
Type item;
delete_pos(n, item);
return TRUE;
}
void clear()
{
size = 0;
}
};
#endif

main.cpp

#include"SeqList.h"

int main()
{
SeqList<int> mylist;
int item;
int n;
int select = 1;
while (select)
{
cout << "*************************************** *" << endl;
cout << "*[1] push_back [2] push_front *" << endl;
cout << "*[3] show_list [4] pop_back *" << endl;
cout << "*[5] pop_front [6] insert_val *" << endl;
cout << "*[7] insert_pos [8] find *" << endl;
cout << "*[9] delete_pos [10] delete_val*" << endl;
cout << "*[11] sort [12] reserve *" << endl;
cout << "*[13] destory [14] clear *" << endl;
cout << "*[0] quit_system [0] quit_system*" << endl;
cout << "请选择:>";
cin >> select;
switch (select)
{
case 1:
cout << "请输入要插入的元素(-1结束):>";
while (cin >> item, item != -1)
{
mylist.push_back(item);
}
break;
case 2:
cout << "请输入要插入的元素(-1结束):>";
while (cin >> item, item != -1)
{
mylist.push_front(item);
}
break;
case 3:
mylist.show_list();
break;
case 4:
mylist.pop_back(item);
break;
case 5:
mylist.pop_front(item);
break;
case 6:
cout << "请输入要插入的元素:";
cin >> item;
mylist.insert_val(item);
break;
case 7:
cout << "请输入要插入的位置:";
cin >> n;
cout << "请输入要插入的元素:";
cin >> item;
mylist.insert_pos(n,item);
break;
case 8:
cout << "请输入要查找的元素:";
cin >> item;
cout << mylist.find(item) << endl;
break;
case 9:
cout << "请输入要删除的位置:";
cin >> n;
mylist.delete_pos(n,item);
break;
case 10:
cout << "请输入要删除的元素:";
cin >> item;
mylist.delete_val(item);
break;
case 11:
mylist.sort();
break;
case 12:
mylist.reserve();
break;
case 14:
mylist.clear();
break;
default:
break;
}
}
system("pause");
return 0;
}

【c++版数据结构】之顺序表的实现的更多相关文章

  1. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

  2. [Python] 数据结构--实现顺序表、链表、栈和队列

    说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...

  3. 数据结构:顺序表(python版)

    顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...

  4. 【PHP数据结构】顺序表(数组)的相关逻辑操作

    在定义好了物理结构,也就是存储结构之后,我们就需要对这个存储结构进行一系列的逻辑操作.在这里,我们就从顺序表入手,因为这个结构非常简单,就是我们最常用的数组.那么针对数组,我们通常都会有哪些操作呢? ...

  5. C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...

  6. [数据结构]C#顺序表的实现

    在数据结构的学习当中,想必C++可能是大家接触最多的入门语言了 但是C#的数据结构却很少看到,今天我写了一个C#顺序表的顺序存储结构 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是 ...

  7. 数据结构之顺序表,c#实现

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  8. 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...

  9. Java——数据结构(顺序表)

    这是一个顺序表的类,初始化的时候就已经确定了表的长度,之后不能添加数据,因为使用的是数组存储的数据,不过这个表的类型是泛型的. public class List { private Object[] ...

  10. javascript数据结构之顺序表

    关于线性表的概念这里就不赘述了,可以自行百度和查阅资料,线性表按照存储(物理)结构分为顺序存储和链式存储,每种存储方式的不同决定了它的实现代码是不同的: 顺序存储的特点就是在内存中选一块连续的地址空间 ...

随机推荐

  1. struts2提交多个对象带图片

    一:实体类 二:前台页面 三:Action处理

  2. iframe是否缓存页面探究

    近期手里有个项目须要用iframe来调用每天都会变化的页面,后来想到iframe会不会缓存页面呢.于是写了个demo论证了下,结果例如以下: iframe的src假设是静态页面,就有可能会缓存.由于静 ...

  3. Java-MyBatis-杂项:MyBatis根据数组、集合查询

    ylbtech-Java-MyBatis-杂项:MyBatis根据数组.集合查询 1.返回顶部 1. foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的 ...

  4. Xcode的一些控制台命令

    命令 解释 break NUM 在指定的行上设置断点 bt 显示所有的调用栈帧,该命令可用来显示函数的调用顺序 clear 删除设置在特定源文件.特定行上的断点,其用法为:clear FILENAME ...

  5. Python—JSON数据解析

    1.安装pip pip是python的包管理工具,使用它能非常方便地安装和卸载各种python工具包 第一步:直接用浏览器访问地址:https://raw.github.com/pypa/pip/ma ...

  6. 修改eclipse最近访问的工程的配置文件

    此文件为:org.eclipse.ui.ide.prefs 配置项为:RECENT_WORKSPACES= 示例:RECENT_WORKSPACES=E\:\\Workspaces\\wokspace ...

  7. hive2.0函数大全

    Hive2.0函数大全(中文版)   摘要 Hive内部提供了很多函数给开发者使用,包括数学函数,类型转换函数,条件函数,字符函数,聚合函数,表生成函数等等,这些函数都统称为内置函数. 目录 数学函数 ...

  8. 移动端 华为手机 input中placeholder垂直居中失效

    为一个app写了一个嵌套的提现页面,效果如下图 input给定宽高,给了line-heigh,在浏览器查看效果正常,placeholder内容以及光标显示都是垂直居中的, IOS显示正常, Andro ...

  9. Tomcat转jboss踩的那些坑

    问题背景 今天发版本,是一个httpclient的跳转(由于公司网络原因,所以对外网的访问都经过这个代理服务出去). 问题原因 之前的开发一直在window系统的tomcat服务器上进行的,对jbos ...

  10. Oracle PL/SQL开发基础(第三十三弹:EXCEPTION_INIT)

    如果有一些异常并没有异常名称,比如一些ORA-开头的异常并没有一个友好的预定义的异常定义,此时在WHEN子句中无法使用具体的异常名称,必须要使用OTHERS异常处理器进行捕捉.通过EXCEPTION_ ...