关于线性表的具体操作方法

#include<iostream>  
using namespace std;
#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写入到已经空出的位置  


	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值