【c++版数据结构】之顺序表的实现
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++版数据结构】之顺序表的实现的更多相关文章
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
- [Python] 数据结构--实现顺序表、链表、栈和队列
说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...
- 数据结构:顺序表(python版)
顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...
- 【PHP数据结构】顺序表(数组)的相关逻辑操作
在定义好了物理结构,也就是存储结构之后,我们就需要对这个存储结构进行一系列的逻辑操作.在这里,我们就从顺序表入手,因为这个结构非常简单,就是我们最常用的数组.那么针对数组,我们通常都会有哪些操作呢? ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- [数据结构]C#顺序表的实现
在数据结构的学习当中,想必C++可能是大家接触最多的入门语言了 但是C#的数据结构却很少看到,今天我写了一个C#顺序表的顺序存储结构 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是 ...
- 数据结构之顺序表,c#实现
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
- 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现
逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...
- Java——数据结构(顺序表)
这是一个顺序表的类,初始化的时候就已经确定了表的长度,之后不能添加数据,因为使用的是数组存储的数据,不过这个表的类型是泛型的. public class List { private Object[] ...
- javascript数据结构之顺序表
关于线性表的概念这里就不赘述了,可以自行百度和查阅资料,线性表按照存储(物理)结构分为顺序存储和链式存储,每种存储方式的不同决定了它的实现代码是不同的: 顺序存储的特点就是在内存中选一块连续的地址空间 ...
随机推荐
- 解决Unity的 The file 'MemoryStream' is corrupted! Remove it and launch 崩溃问题
孙广东 2015.7.30 问题: 在项目平时删除资源或者脚本资源时产生的prefab的脚本引用丢失,特别是在场景scene中丢了解决方式/// 1.又一次Clone项目/// 2.删除项目的 ...
- memcached—向memcached中保存Java实体需注意的问题
今天以代码实例的形式总结一下向memcached中保存Java实体需注意的问题: memcached工具类代码: package com.ghj.packageoftool; import java. ...
- 疯狂Java学习笔记(72)-----------大话程序猿面试
大话程序猿面试 10个我最喜欢问程序猿的面试问题 程序猿面试不全然指南 10个经典的C语言面试基础算法及代码 程序猿的10大成功面试技巧 程序猿选择公司的8个标准 编程开发 8个值得关注的PHP安全函 ...
- 0xC0000005;Access Violation(栈区空间很宝贵, linux上栈区空间默认为8M,vc6下默认栈空间大小为1M)
写C/C++程序最怕出现这样的提示了,还好是在调试环境下显示出来的,在非调试状态就直接崩溃退出. 从上述汇编代码发现在取内存地址 eax+38h 的值时出错, 那说明这个地址非法呗, 不能访问, 一般 ...
- VC 6.0中添加库文件和头文件 【转】
本文转载自:http://blog.sina.com.cn/s/blog_9d3971af0102wxjq.html 加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools&g ...
- [SCOI 2009] 生日快乐
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1024 [算法] 直接DFS,即可 [代码] #include<bits/std ...
- angular4父组件向子组件传值,子组件向父组件传值的方法
父组件向子组件传值 @Input 文件目录 父组件: father.template.html <h1>父组件</h1> <cmt-child [data]='dat ...
- CSS3 过渡、动画、多列、用户界面
CSS3 过渡.动画.多列.用户界面 transition过渡 transition: transition-property transition-duration transition-timin ...
- 互联网时代: 从Uber的供需匹配看开发需求
每次看电影中的有钱人都有专属司机接送,只要坐在车里,就有人帮忙开车门.提行李及关车门.感觉是非现实的遥远画面,现在却有机会可以在日常生活中成真! 2009年Travis Kalanick及Garret ...
- ZBrush软件如何编辑物体
新手在刚接触ZBrush®的时候,想要选中模型进行编辑,有时怎么都选不中,当再次画的时候只能在边上新建一个,还是不能进行编辑,遇到类似问题,你是如何解决的,本文将为您讲解ZBrush中怎么选中物体并进 ...