【C++数据结构程序笔记】顺序存储下的线性表操作的实现

#include
#include 
#include 
#include"stdlib.h" 
typedef int ElemType;
using namespace std;

struct List{
	ElemType *list;
	int size;
	int MaxSize;
};


//1、初始化线性表 
void InitList(List &L){
	L.MaxSize=10;
	L.list=new ElemType[L.MaxSize];
	if(L.list==NULL){
		cout<<" 动态可分配的存储空间用完,退出运行!"<<endl;
		exit(1); 
	}
	L.size=0;
}

//2、删除线性表中的所有元素,使之成为一个空表
void ClearList(List &L){
	if(L.list!=NULL){
		delete []L.list;
		L.list=NULL;
	}
	L.MaxSize=0;
	L.size=0;
} 

//3、得到线性表的长度
int LenthList(List &L){
	return L.size;
} 

//4、检查线性表是否为空
bool EmptyList(List &L){
	return L.size==0;
} 

//5、得到线性表中指定序号为pos的元素
ElemType GetList(List &L,int pos){
	if(pos<1||pos>L.size){
		cerr<<" pos is out range!"<<endl;
		exit(1);
	}
	return L.list[pos-1];
} 

//6、遍历一个线性表

void TraverseList(List &L){
	for(int i=0;i<L.size;i++)
	cout<<L.list[i]<<' ';
	cout<<endl;
} 

//7、从线性表中查找具有给定的第一个元素
bool FindList(List &L,ElemType& item)
{
	for(int i=0;i<L.size;i++)
	  if(L.list[i]==item){
	  	return true; 
	  }
	  return false;
 } 

//8、更新线性表中具有给定值的第一个元素
bool UpdateList(List &L,const ElemType &item){
	for(int i=0;i<L.size;i++)
	  if(L.list[i]==item){
	  	L.list[i]=item;
	  	return true;
	  }
	  return false;
} 

//9、向线性表中按给定条件插入一个元素
bool InsertList(List &L,ElemType item,int pos){
	//检查pos值是否有效 
	if(pos<-1||pos>L.size+1){
		cout<<" pos值无效!"<<endl;
		return false; 
	}
	//求出按值插入时item的插入位置,使之保存到pos中 
	int i;
	if(pos==0){                        
		for(i=0;i<L.size;i++)
		  if(item<L.list[i]) break;
		  pos=i+1; //pos中保存的是新插入元素的序号 
	}
	else if(pos==-1) pos=L.size+1;//pos=-1表示在线性表的最后一个元素的后面开始插入,插入位置pos自然为 L.size+1 
	
	//若线性表的存储空间用完,则重新分配大一倍的存储空间 
	if(L.size==L.MaxSize){
		int k=sizeof(ElemType);//计算每一个存储空间的长度 
		L.list=(ElemType*)realloc(L.list,2*L.MaxSize*k); 
		if(L.list==NULL){
			cout<<" 动态的存储空间已经用完,退出运行!"<<endl;
			exit(1);
		}
		L.MaxSize=2*L.MaxSize;
	}
	//待插入位置及所有后继元素,从后往前依次向后移动一个位置
	for(i=L.size-1;i>=pos-1;i--)
	L.list[i+1]=L.list[i];
	L.list[pos-1]=item;//把item的值赋给已经空出的pos-1的位置,成为第pos个元素 
	L.size++;//由于插入了一个新元素,故线性表的长度加一 
	return true;//插入成功返回真 
} 

//10、 从线性表中删除符合给定条件的的第一个元素的值
bool DeleteList(List &L,ElemType &item,int pos){
	//检查线性表是否为空,若是,返回假,无法删除
	if(L.size==0){
		cout<<"线性表为空无法删除!"<<endl;
		return false;
	} 
	
	//检查pos值是否有效
	if(pos<-1||pos>L.size){
		cout<<" pos值无效,无法删除!"<<endl;
		return false;
	} 
	
	//求出按值删除时,item值的删除位置,使之保存在pos中
	int i;
	if(pos==0){
		for(i=0;i<L.size;i++)
		  if(item==L.list[i]) break;
	    if(i==L.size)//表示无元素可删,返回键 
		return false;
		pos=i+1; 
	} 
	//得到表尾元素的序号,保存在pos中
	else if(pos==-1) pos=L.size;
	
	item=L.list[pos-1];//将被删除元素赋值给item带回 
	 
	//将待删除元素之后的元素从前向后依次向前移动一个位置 
	for(i=pos;i<L.size;i++)
	 L.list[i-1]=L.list[i];
	 
	 L.size--;
	 
	 //若线性表存储空间空余太多,则进行删减
	 if(float(L.size)/L.MaxSize<0.4&&L.MaxSize>10){
	 	int k=sizeof(ElemType);
	 	L.list=(ElemType*)realloc(L.list,L.MaxSize*k/2);
	 	L.MaxSize=L.MaxSize/2;
	 }
	 return true;
} 

//11、对线性表进行排序
void SortList(List &L){//对L中的所有元素按照给定条件排序 
	List a;//定义一个临时的线性表a 
	InitList(a);//初始化a
	for(int i=0;i<L.size;i++)
	 InsertList(a,L.list[i],0);//将形参线性表L的每一个值通过for循环读到a中 
	ClearList(L);//清除线性表L的值 
	L=a;//把临时表的值赋给空表L
} 

int main(){
	int a[12]={3,6,9,12,15,18,21,24,27,30,33,36}; 
	int i;
	ElemType x;
	List t;
	InitList(t);
	for(i=0;i<12;i++)
	 InsertList(t,a[i],i+1);
	 InsertList(t,48,13);
	 InsertList(t,40,0);
	 cout<<GetList(t,4)<<' '<<GetList(t,9)<<endl;
	 TraverseList(t);
	 cout<<" 输入待查找的数值!";
	 cin>>x;
	 if(FindList(t,x))
	 cout<<" 查找成功!"<<endl;
	 else cout<<" 查找失败!"<<endl;
	 
	 cout<<" 输入被删除的元素的值"<<endl;
	 cin>>x;
	 if(DeleteList(t,x,0)) 
	 cout<<" 删除成功!"<<endl;

     else cout<<" 删除失败!"<<endl;
	 TraverseList(t);
	
	cout<<" 按值插入,请输入待插入元素的值:";
	cin>>x;
	if(InsertList(t,x,0)) 
	  cout<<" 插入成功!"<<endl;
	  else cout<<" 插入失败!"<<endl;
	TraverseList(t);
	
	cout<<" 线性表的长度!"<<LenthList(t)<<endl;
	if(EmptyList(t))  
	cout<<" 线性表为空!"<<endl;
	else cout<<" 线性表不为空!"<<endl;
	ClearList(t);   
	 } 

你可能感兴趣的:(C++,数据结构)