"SqList.h"
#pragma once #define LIST_INIT_SIZE 10 //初始分配量 #define LISTINC 5 //增长量 template<class T> class SqList { public: typedef T ElemType; SqList(void){ elem = (T *)malloc(LIST_INIT_SIZE*sizeof(T)); if(!elem) { throw bad_alloc(); } else { length = 0; listsize = LIST_INIT_SIZE; } } //数组初始化--------------------OK! SqList(T *q,int n) { elem = (T *)malloc(n*sizeof(T)); if(!elem) { throw bad_alloc(); } else { length = n; listsize = n; for(size_t i = 0;i<size_t(n);i++) { elem[i] = q[i]; } } } //深拷贝-----------------OK! SqList(SqList & s){ size_t l = s.GetLength(); elem = (T *)malloc(l*sizeof(T)); if(!elem) { throw bad_alloc(); } else { length = l; listsize = l; } for(size_t j = 0;j<length ;j++) { elem[j] = s[j]; } } ~SqList(void){ free(elem); } //插入数据-------------------------OK! bool insert(int i,ElemType e){ if(i<1||size_t(i)>length) { return false; } T * newbase = 0; if(length>=listsize) { newbase = (T *)realloc(elem,(listsize + LISTINC)*sizeof(T)); if(!newbase) { throw bad_alloc(); } elem = newbase; listsize += LISTINC; } //获取插入点 T * q = &elem[i-1]; //开始向后移动数据 for(int j = length -1 ;j >= (i-1);j--) { elem[j+1] = elem[j]; } //插入数据 *q = e; length++; return true; } //增加元素-----------------------------OK! bool add(ElemType e){ T * newbase; if(length>=listsize) { newbase = (T *)realloc(elem,(listsize + LISTINC)*sizeof(T)); if(!newbase) { throw bad_alloc(); } elem = newbase; listsize += LISTINC; } //增加元素 elem[length] = e; length++; return true; } //删除元素-----------------------------------------OK! bool del(int i,ElemType &e){ if(i <1||i>length) { return false; } //找到删除点 T * q = &elem[i-1]; e = *q; //开始向前移动 for(int j = i ;j<=length+1;j++) { elem[j-1] = elem[j]; } length--; return true; } //查找第一个于e相等的元素------------------------OK! int find_first(T e ) { size_t i = 1; for(;(i<=length)&&(e!=elem[i-1]);i++); if(i<=length) return i-1; return 0; } //查找元素(查找第一个与e满足compare关系的元素)-------------------OK! int find_first(T e ,bool (* compare )(T,T)){ size_t i = 1; for(;(i<=length)&&(!(*compare)(e,elem[i-1]));i++); if(i<=length) return i; return 0; } //重载[]操作符函数---------------------------------OK! T & operator[](int i) { if((i<0)||size_t(i)>(length-1)) { throw range_error("range_error"); } return elem[i]; } //赋值操作符重载------------------------------------OK! SqList & operator=(SqList & s){ size_t l = s.GetLength(); T * newbase; if(l>listsize) { newbase = (T *)realloc(elem ,l*sizeof(T)); if(!newbase) { throw bad_alloc(); } elem = newbase; listsize = l; length = l; } length = l; for(size_t j = 0;j<length ;j++) { elem[j] = s[j]; } return *this; } //有序合并-----------------------------OK! bool MergeByOrder(SqList & b,SqList & c ){ SqList inis; size_t i =0; size_t j =0; while((i<length) &&(j<b.GetLength())) { if(elem[i]<=b[j]) {inis.add(elem[i]);i++;} else {inis.add(b[j]);j++; } } while(i<length) {inis.add(elem[i]);i++;} while(j<b.GetLength()){inis.add(b[j]);j++;} c = inis; return true; } //无序合并------------------------------OK! bool Merge(SqList & b,SqList & c) { c = (*this); size_t i = 0; for(;i<b.GetLength();i++) { c.add(b[i]); } return true; } //得到长度-------------------------------------------------OK! size_t GetLength(){ return length; } //排序(排成非降序列) void sort() { for(int i =length-1;i>0;i--) { for(int j = 0;j<i;j++) { if(elem[j]>=elem[j+1]) {T t = elem[j];elem[j] = elem[j+1];elem[j+1]=t;} } } } //重载排序 void sort(bool (* compare)(T ,T)) { for(int i =length-1;i>0;i--) { for(int j = 0;j<i;j++) { if((*compare)(elem[j],elem[j+1])) {T t = elem[j];elem[j] = elem[j+1];elem[j+1]=t;} } } } private: T * elem; size_t length;//实际长度 size_t listsize;//当前存储容量 };
#include "SqList.h" #include<iostream> using namespace std; bool fun(int a,int b ) { return a<=b; } bool fun1(int a,int b ) { return a=b; } int main() { /* *三种初始化方式 */ //建立一个空的线性表 SqList<double> Sad; SqList<float> Saf; //用数组初始化线性表 int a[5] = {2,3,1,0,9}; SqList<int> sb1(a,5); //赋值构造一个线性表 SqList<int> sb2(sb1); SqList<int> sb3 = sb1; /* *支持直接赋值操作 */ SqList<int> sb4; sb4 = sb3; /* *支持返回元素个数的操作,注意返回值类型是size_t类型 */ size_t ll = sb1.GetLength(); cout<<"sb1的长度:"<<ll<<endl; /* *支持下标操作 */ cout<<"sb1序列(用数组初始化线性表):"<<flush; for(size_t i =0;i<sb1.GetLength();i++)//输出sb1 { cout<<sb1[i]<<" "<<flush; } cout<<endl; cout<<"sb2序列(赋值构造一个线性表):"<<flush; for(size_t i =0;i<sb2.GetLength();i++)//输出sb2 { cout<<sb2[i]<<" "<<flush; } cout<<endl; cout<<"sb3序列(赋值构造一个线性表):"<<flush; for(size_t i =0;i<sb3.GetLength();i++)//输出sb3 { cout<<sb3[i]<<" "<<flush; } cout<<endl; cout<<"sb4序列(直接赋值操作):"<<flush; for(size_t i =0;i<sb4.GetLength();i++)//输出sb4 { cout<<sb4[i]<<" "<<flush; } cout<<endl; /* *支持增加元素 */ sb1.add(8); cout<<"sb1增加元素8:"<<flush; for(size_t i =0;i<sb1.GetLength();i++)//输出sb1 { cout<<sb1[i]<<" "<<flush; } cout<<endl; /* *支持定点插入操作 */ cout<<"sb1插入元素7:"<<flush; sb1.insert(1,7);//在位置1之前插入数据7 for(size_t i =0;i<sb1.GetLength();i++)//输出sb1 { cout<<sb1[i]<<" "<<flush; } cout<<endl; /* *支持删除元素操作 */ int de ; sb1.del(1,de); cout<<"被删除的元素:"<<de<<endl;//输出被删除的元素值 /* *查找第一个于e相等的元素位置下标 */ int ii; ii=sb1.find_first(3); cout<<"查找元素3:"<<sb1[ii]<<endl; /* *查找第一个与e符合函数关系的元素位置下标(函数重载) */ ii=sb1.find_first(3,fun1); cout<<"查找元素3(重载):"<<sb1[ii]<<endl; /* *支持线性表的排序操作 */ sb1.sort(); cout<<"sb1序列排序后(升序):"<<flush; for(size_t i =0;i<sb1.GetLength();i++)//输出sb1 { cout<<sb1[i]<<" "<<flush; } cout<<endl; /* *支持线性表的排序操作(关系函数重载) */ sb1.sort(fun); cout<<"sb1序列排序后(重载)(降序):"<<flush; for(size_t i =0;i<sb1.GetLength();i++)//输出sb1 { cout<<sb1[i]<<" "<<flush; } cout<<endl; /* *支持线性表的无序合并操作 */ int b[4]={1,4,3,2}; SqList<int> bs(b,4); SqList<int> is; sb1.Merge(bs,is); cout<<"与序列“{1,4,3,2}合并”:"<<flush; cout<<"合并后的序列(无序合并):"<<flush; for(size_t i =0;i<is.GetLength();i++)//输出合并后的序列 { cout<<is[i]<<" "<<flush; } cout<<endl; /* *支持线性表的有序合并操作(函数重载) */ sb1.sort();//先排序 bs.sort();//先排序 sb1.MergeByOrder(bs,is); cout<<"与序列“{1,4,3,2}合并”:"<<flush; cout<<"合并后的序列(有序合并):"<<flush; for(size_t i =0;i<is.GetLength();i++)//输出合并后的序列 { cout<<is[i]<<" "<<flush; } cout<<endl; }
线性表(顺序存储)结构与功能的简易实现,布布扣,bubuko.com
原文:http://blog.csdn.net/yyc1023/article/details/20284291