C++实现线性表的操作

#include<iostream.h>
#include<stdlib.h>

typedef int ElemType;

struct List 
{
	ElemType *list;	//存线性表元素的动态存储空间的指针
	int size;	//存线性表长度
	int MaxSize;	//规定list数组的长度
};

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

//清除L中所有元素
void ClearList(List &L)
{
	if(L.list!=NULL)
	{
		delete []L.list;
		L.list=NULL;
	}
	L.MaxSize=0;
	L.size=0;
} 

//返回L的长度
int LenthList(List &L)
{
	return L.size;
}

//判断L是否为空
bool EmptyList(List &L)
{
	return L.size==0;
} 

//返回L中第pos个元素的值
ElemType GetList(List &L, int pos)
{
	if(pos<1 || pos>L.size)
	{
		cerr<<"pos值无效!"<<endl;
	}
	return L.list[pos-1];
} 

//遍历输出L中的所以元素
void TraverseList(List &L)
{
	for(int i=0; i<L.size; i++)
	{
		cout<<L.list[i]<<' ';
	}
	cout<<endl;
}

//从L中查找并返回元素
bool FindList(List &L, ElemType item)
{
	for(int i=0; i<L.size; i++)
	{
		if(L.list[i]==item)
		{
			item=L.list[i];
			return true;
		}	
	}
	return false;
}

//修改L中的元素
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;
} 

//向L中插入元素
bool InsertList(List &L, ElemType item, int pos)
{
	//判断pos的值是否合法
	if(pos<-1 || pos>L.size+1)
	{
		cout<<"pos的值不合法!"<<endl;
		return false;
	}
	int i;	//循环变量
	//判断插入的位置
	if(pos==0)	//顺序插入
	{
		for(i=0; i<L.size; i++)
		{
			if(L.list[i]>item)
				break;
		}
		pos=i+1;
	}
	else if(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];
	}
	//把item的值赋给已空出的下标为pos-1的位置
	L.list[pos-1]=item;
	L.size++;	//线性表的长度加1
	return true;	//返回真,表示插入成功
} 

//从L中删除元素
bool DeleteList(List &L, ElemType item, int pos)
{
	if(L.size==0)	//检查线性表是否为空
	{
		cout<<"线性表为空,删除无效!"<<endl;
		return false;
	}
	//判断pos的值是否合法
	if(pos<-1 || pos>L.size+1)
	{
		cout<<"pos的值不合法!"<<endl;
		return false;
	}
	int i;	//循环变量
	//判断删除的位置
	if(pos==0)	//按值删除
	{
		for(i=0; i<L.size; i++)
		{
			if(L.list[i]==item)
				break;
		}
		if(i==L.size) return false;	//无元素可删除
		pos=i+1;
	}
	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--;	//线性表的长度减1
	//如果剩余空间过大,进行缩小
	if(float(L.size)/L.MaxSize<0.4 && L.size>10)
	{
		int k= sizeof(ElemType);
		L.list=(ElemType*)realloc(L.list, L.MaxSize*k/2);
	}
	L.MaxSize=L.MaxSize/2;	//把线性表的空间大小修改为新的长度
	return true;	//返回真,表示删除成功
}

//对L中的所元素按给定条件进行排序
void SortList(List &L)
{
	int i,j;
	ElemType x;
	for(i=1; i<L.size; i++)	//共循环n-1次
	{
		x=L.list[i];	//把无序表中的第一个元素暂存x中
		for(j=i-1; j>=0; j--)	//向前属性进行比较和移动
		{
			if(x<L.list[j])
				L.list[j+1]=L.list[j];
			else break;
		}
		L.list[j+1]=x;	//把x写入到已经空出的位置

		
	}
}

//主函数

void 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<<"输入带删除元素的值:";
	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);
}

运行结果:


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值