顺序表(C++实现)

类实现代码如下:

 1 const int defaultSize=100;//默认的表空间大小
 2 template <class T>
 3 class SeqList{
 4     protected:
 5         T *data;//存放数组
 6         int maxSize;//表空间总大小
 7         int last;//当前表中最后一个元素的位置(从0开始计算)
 8         void reSize(int newSize);//重新设定表空间大小
 9     public:
10         SeqList(int sz=defaultSize){//构造函数
11             maxSize=sz;
12             last=-1;
13             data=new T[sz];
14             if(data==NULL) exit(1);
15         }
16         SeqList(SeqList<T>& L){//拷贝构造函数
17             maxSize=L.size();
18             last=L.length()-1;
19             data=new T[maxSize];
20             if(data==NULL) exit(1);
21             T value;
22             for(int i=0;i<=last;i++){
23                 L.getData(i+1,value);
24                 data[i]=value;
25             }
26
27         }
28         ~SeqList(){//析构函数
29             delete[] data;
30         }
31         int size()const{//表空间总大小
32              return maxSize;
33         }
34         int length()const{//表中元素的总个数
35             return last+1;
36         }
37         int search(T &x)const{//返回元素X在表中的位置(从1开始计算)
38             for(int i=0;i<=last;i++){
39                 if(data[i]==x) return i+1;
40             }
41             return 0;
42         }
43         bool getData(int i,T &x)const{//取第i个表项的值放到x中(从1开始计算)
44             if(i>0&&i<=last+1){
45                 x=data[i-1];
46                 return true;
47             }else{
48                 return false;
49             }
50         }
51         void setData(int i,T &x){//将x中的值放到第i个表项中 (从1开始计算)
52             if(i>0&&i<=last+1){
53                 data[i-1]=x;
54             }
55         }
56         bool insert(int i,T& x){//插入x在第i个表项后 (从1开始计算)
57             if(last==maxSize-1) return false;
58             if(i<0||i>last+1) return false;
59             for(int j=last;j>=i;j--)
60                 data[j+1]=data[j];
61             data[i]=x;
62             last++;
63             return true;
64         }
65         bool remove(int i,T &x){//删除第i个表项值,并放入x  (从1开始计算)
66             if(last==-1) return false;
67             if(i<1||i>last+1) return false;
68             x=data[i-1];
69             for(int j=i;j<=last;j++)
70                 data[j-1]=data[j];
71             last--;
72             return true;
73         }
74         bool isFull(){//判断表是否为空
75             return (last==maxSize-1)?true:false;
76         }
77         bool isEmpty(){//判断表是否为满
78             return (last==-1)?true:false;
79         }
80         void input(){//输入
81             while(true){
82                 cout<<"请先输入你需要输入表中元素的个数:(不能超过"<<maxSize<<")";
83                 cin>>last;
84                 last--;
85                 if(last<=maxSize-1) break;
86             }
87             cout<<"输入元素:"<<endl;
88             for(int i=0;i<=last;i++)
89                 cin>>data[i];
90         }
91         void output(){//输出
92             cout<<"输出元素:"<<endl;
93             for(int i=0;i<=last;i++)
94                 cout<<data[i]<<" ";
95             cout<<endl;
96         }
97         //SeqList<T> operator=(SeqList<T> &L);“=”重载,功能、函数实现同拷贝构造函数
98
99 }; 

测试代码如下:

 1 void menu(){
 2     cout<<"1.输入一组元素"<<endl;
 3     cout<<"2.输出一组元素"<<endl;
 4     cout<<"3.取第i个表项的值放到x中(从1开始计算) "<<endl;
 5     cout<<"4.将x中的值放到第i个表项中 (从1开始计算) "<<endl;
 6     cout<<"5.插入x在第i个表项后 (从1开始计算) "<<endl;
 7     cout<<"6.删除第i个表项值,并放入x  (从1开始计算)"<<endl;
 8     cout<<"7.返回元素X在表中的位置(从1开始计算)"<<endl;
 9     cout<<"8.调用拷贝构造函数"<<endl;
10     cout<<"9.退出"<<endl;
11 }
12
13 template <class T>
14 void function(int num,SeqList<T> *sl){
15     int i;T x;
16     switch(num){
17         case 1:
18             sl->input();
19             break;
20         case 2:
21             sl->output();
22             break;
23         case 3:
24             cin>>i;
25             sl->getData(i,x);
26             cout<<x<<endl;
27             break;
28         case 4:
29             cin>>x>>i;
30             sl->setData(i,x);
31             break;
32         case 5:
33             cin>>x>>i;
34             sl->insert(i,x);
35             break;
36         case 6:
37             cin>>i;
38             sl->remove(i,x);
39             break;
40         case 7:
41             cin>>x;
42             i=sl->search(x);
43             cout<<i<<endl;
44             break;
45         case 8:
46             {
47                 SeqList<T> *sl2=new SeqList<T>(*sl);
48                 sl2->output();
49 //                sl->remove(2,x);
50 //                sl2->output();
51                 delete sl2;
52             }//这里要用花括号!http://www.cnblogs.com/RealOnlyme/articles/2579628.html
53             break;
54         default:
55             exit(0);
56     }
57 }
58 int main(int argc, char** argv) {
59     int x;
60     SeqList<int> *sl=new SeqList<int>();
61     while(true){
62         menu();
63         cin>>x;
64         function(x,sl);
65     }
66     delete sl;
67     return 0;
68 }

小结:

  1.顺序表中各个元素必须相继存放于一个连续的空间内,不准跳跃地存放。(与一维数组的区别)

  2.顺序表中最复杂的操作就是搜索,插入和删除运算。

  3.分析搜索的时间代价主要看循环内数据的比较次数,次数从1到n,平均比较(n+1)/2个表项。

  4.分析插入删除的时间代价主要看循环内的数据移动次数。插入时有n+1个插入位置,移动次数从0到n,平均移动n/2个表项;删除时有n个删除位置,移动次数从0到n-1,平均移动(n-1)/2个表项。

  

时间: 2024-10-05 05:05:46

顺序表(C++实现)的相关文章

顺序表算法设计笔记

1.已知长度为 n 的线性表 A 采用顺序存储结构.设计一个时间复杂度为O(n).空间复杂度为O(1)的算法,该算法删除线性表中所有值为 x 的元素数据元素. 以下两种方法都不满足要求: 如果删除一个值为 x 的元素都进行移动, 其时间复杂度为O(n^2),时间复杂度为O(1). 如果借助一个新的顺序表, 存放将A中所有不为x的元素,其时间复杂度O(n), 空间复杂度为O(n). 解法一:设删除 A 中所有值等于 x 元素后的顺序表为A1, 显然A1包含在 A 中, 为此A1重用 A 的空间.

2、顺序表

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 从这节开始,以后的每一篇博文均会只描述一种结构.这节要解决的是有关顺序表的问题,下面就是一些顺序表的基本的知识点: 1. 顺序表其实就是线性表的一种,它除开始节点和结束节点之外的其他节点,均有且只有一个直接前趋和一个直接后继,开始 节点只有一个后继节点,结束节点只有一个前趋节点. 2. 用顺序存储方法存储的线性表就称为顺序表. 3. 顺序存储方法就是将表的节点按逻辑上的次序依次的存放在一组连续的内存单元中,这里是指在逻辑上连续排列,在

顺序表查找和有序表查找

查找里面顺比表查找和有序表查找(包括二分查找,插值查找,斐波那契查找)比较简单,直接贴代码,代码里面有详细注释. 1 #include <iostream> 2 using namespace std; 3 4 //顺序表查找(线性查找.静态表查找) 时间复杂度为O(n) 5 int Seq_Search(int *s,int n,int key) 6 { 7 s[0] = key; //设置了一个哨兵,避免了每次比较一次过后都要判断查找位置是否越界 8 int i = n; 9 while

线性表---顺序表

线性结构的特点是:在非空的有限集合中,只有唯一的第一个元素和唯一的最后一个元素.第一个元素没有直接前驱元素,最后一个没有直接的后继元素.其它元素都有唯一的前驱元素和唯一的后继元素. 线性表是一种最简单的线性结构.线性表可以用顺序存储结构和链式存储结构存储,可以在线性表的任意位置进行插入和输出操作. 要想将线性表在计算机上实现,必须把其逻辑结构转化为计算机可识别的存储结构.线性表的存储结构主要有两种:顺序存储结构和链式存储结构. 线性表的顺序表示与实现 线性表的顺序存储结构 线性表的顺序存储结构指

模板实现顺序表

类模板的成员函数: 类模板的成员函数本身是一个普通函数.但是,类模板的每个实例都有其自己版本的成员函数.因此,类模板的成员函数具有和模板相同的模板参数.因此,在=定义在类模板之外的成员函数就必须以template开始,后跟类模板参数列表. 类模板中的友元函数: 类模板中的友元函数,应该在类中定义.若只在类中声明,在类外定义,则在链接时会出现错误. 类模板实现顺序表: "SeqList.h" //冒泡法 "test.cpp"

顺序表

#include <cstdio> #include <cstring> ///都用c语言写的 #include <iostream> ///建议从主函数开始看 #include <cstdlib> using namespace std; int sequence_map[1000]; int total_sequence = 0; void init_sequence() ///主界面. ///一级菜单中顺序表的操作界面 init初始化 { printf

顺序表的非递减数列合并

#include<stdio.h> /*包含输入输出头文件*/ #define ListSize 100 typedef int DataType; typedef struct { DataType list[ListSize]; int length; }SeqList; void InitList(SeqList *L) /*将线性表初始化为空的线性表只需要把线性表的长度length置为0*/ { L->length=0; /*把线性表的长度置为0*/ } int ListEmpt

顺序表(存在问题)

#include <iostream> using namespace std; typedef int DataType; struct SeqList { int MAXNUM; int n; DataType *element; }; typedef struct SeqList *PSeqList; PSeqList createEmptySeq(int m) { PSeqList palist = (PSeqList) malloc (sizeof (struct SeqList))

稀疏矩阵的三元组顺序表的C语言实现

对于没有排序功能的集合来说,都可以使用java.util.Collections.sort()方法进行排序,它除了集合对象以外,还需要提供一个比较器.如果列表中的元素全部都是相同的类型,并且这个类实现了Comparable接口,就可以简单的调用Collections.sort()方法,如果这个类没有实现comparable接口,那么可以创建一个比较器传递一个Comparator实例作为Sort()的第二个参数进行排序,另外,如果不想使用默认的分类顺序进行排序,同样也可以传递一个Comparato

【线性表2】线性表的顺序实现:顺序表

顺序表简介 特点:使用一组地址连续的存储单元依次存储表中的数据元素,常见的就是使用数组去实现. 表中逻辑相邻的数据元素,在物理内存上也相邻. 顺序表中的任意数据元素都可随机访问,是一种支持随机访问,长度自动动态调整的线性表结构. 优点:访问表中的元素很快,时间复杂度为O(1) 缺点:插入,删除元素需要移动大量的元素,时间复杂度为O(n) . 因此如果我们在编程中需要这样一种线性表数据结构:构造后对元素的访问操作很频繁,而很少进行增,删等元素位置的调整操作,那么就可以考虑使用顺序表. 代码实现 #