首页 > 代码库 > 线性表

线性表

线性表概述
线性表是最基本、最简单、也是最常用的一种数据结构。在线性表中数据元素之间的关系是线性,数据元素可以看成是排列在一条线上或一个环上。
线性表分为静态线性表和动态线性表,常见的有顺序表(静态的)、单向链表(动态的)和双向链表(动态的)。


线性表的操作主要包括:
(0)初始化线性表 
(1)计算表的长度n。
(2)线性表是否为空
(3)将元素添加到线性表的末尾
(4)获取第i个元素,0≤i < n。
(5)清除线性表
(6)返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1。
(7)返回列表中最后一次出现指定元素的索引,如果列表不包含此元素,则返回 -1。
(8)将新元素插入第i个位置,0≤i < n,使原来的第i,i+1,…,n–1个元素变为第i+1,i+2,…,n个元素。
(9)更改第i个元素
(10)删除第i个元素,0≤i < n,使原来的第i+1,i+2,…,n–1个元素变为第i,i+1,…,n–2个元素

#include"iostream"
using namespace std;
struct List{
	int *list;   //存线性表元素的动态存储空间的指针
	int size;    //存线性表长度
	int maxsize; //规定list数组的长度
};
void init_list(List &l)  //初始化线性表
{
	l.maxsize=6;                  //初始定义数组长度
	l.list=new int[l.maxsize];    //动态存储空间分配
	if(l.list==NULL)
	{
		cout<<"动态可分配的存储空间已用完,退出运行!"<<endl;
		exit(1);
	}
	l.size=0;       //置线性表长度为0,即为空表
}

void clear_list(List &l)   //清空线性表
{
	if(l.list!=NULL)
	{
		delete []l.list;
		l.list=NULL;
	}
	l.maxsize=0;
	l.size=0;
}

int length_list(List &l)    //获取线性表的长度
{
	return l.size;
}

bool empty_list(List &l)  //检查线性表是否为空
{
	return l.size==0;
}

int get_list(List &l,int pos)   //获取线性表中指定位置的元素
{
	if(pos<1 ||pos>l.size)   //若pos越界则退出
	{
		cout<<"pos is out range!"<<endl;
		exit(1);
	}
	return l.list[pos-1];     //返回线性表中第pos个元素的值
}

void traverse_list(List &l)   //遍历线性表中的元素,若遍历记录类型,则需要重插入操作符
{
	for(int i=0;i<l.size;i++)
	{
		if(i!=(l.size-1))
			cout<<l.list[i]<<" ";
		else
			cout<<l.list[i]<<endl;
	}
}

void findpoint_list(List &l,int item)   //返回查找的位置
{
	for(int i=0;i<l.size;i++)
	{
		if(l.list[i]==item)
		{
			item=l.list[i];
			cout<<"你查找的元素的位置序号为:"<<i+1<<endl;
		}
	}
}

bool insert_list(List &l,int item,int pos)  //向线性表中指定的位置插入元素
{
	if(pos<1||pos>l.size+1)                 // 先检查pos的位置是否有效
		cout<<"pos值无效"<<endl;
	int j;
	if(l.size<=l.maxsize)     //表示线性表的存储空间已经用完了
	{
		int k=sizeof(int);       //计算每个存储空间的长度
		l.list=(int *)realloc(l.list,2*l.maxsize*k);   //扩展空间
		if(l.list==NULL)
		{
			cout<<"动态可分配的存储空间用完"<<endl;
			exit(1);
		}
		l.maxsize=2*l.maxsize;
	}
	for(j=l.size-1;j>=pos-1;j--)   //等插入元素的位置及所有后续元素位置都依次后移一个位置
		l.list[j+1]=l.list[j];
	l.list[pos-1]=item;     //将等插入的元素插入已经空下的位置
	l.size++;              //表长度加1
	return true;
}

bool delete_list(List &l,int pos)  //从线性表中删除指定位置元素
{
	if(l.size==0)
	{
		cout<<"线性表为空"<<endl;
		return false;
	}
	if(pos<1 ||pos>l.size+1)
		cout<<"pos值无效"<<endl;
	//进行删除操作
	int k=0;
	for(k=pos-1;k<l.size;k++)
		l.list[k]=l.list[k+1];
	l.size--;
	return true;
}

void buffersort_list(List &l)   //冒泡排序
{
	for(int a=0;a<l.size-1;a++)
	{
		for(int b=0;b<l.size-a-1;b++)
		{
			if(l.list[b]>l.list[b+1])
			{
				int temp=l.list[b+1];
				l.list[b+1]=l.list[b];
				l.list[b]=temp;
			}
		}
	}
}

void main()
{
	int a[6];
	int i,x;
	cout<<"请输入线性表的6个正整数元素:";
	for(int j=0;j<6;j++)
		cin>>a[j];
	cout<<endl;
	List list;
	init_list(list);     //初始化List
	for(i=0;i<6;i++)
		insert_list(list,a[i],i+1);                                       //将数组插入到线性表中
	cout<<"遍历新插入的线性表的元素:";
	traverse_list(list);                                                  //遍历线性表
	findpoint_list(list,11);                                              //查找指定位置的元素
	cout<<"获取指定位置的元素值为:"<<get_list(list,3)<<endl;             //获取指定位置的元素值
	cout<<"获取线性表的长度为:"<<length_list(list)<<endl;                //获取线性表的长度
	buffersort_list(list);                                                //对线性表进行排序
	cout<<"对线性表排序后的结果为:";
	traverse_list(list);
	cout<<"删除指定Pos位置的元素:"<<delete_list(list,3)<<endl;          //删除指定位置上的元素
	traverse_list(list); 
}


线性表