Bootstrap

C++数据结构-线性表

仅供参考!

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

int a_assign=0; 
int b_assign=0;
int a_success=0;
int b_success=0;
int c_success=0;
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
#define list_init_size  100 //线性表存储空间的初始分配量 
#define list_increment 10   //线性表存储空间的分配增量 
typedef int Satus;
typedef int ElemType;
typedef struct List{
	ElemType *elem;  //存储空间基址 
	int length;      //当前长度 
	int listsize;    //当前分配的存储容量 
}List;
void catalog();
Satus Init_List_a( List &La );
Satus Init_List_b( List &Lb );
Satus Destory( List &La,List &Lb );
Satus Clear( List &La,List &Lb );
void Judge( List &La,List &Lb );
void GetLength( List &La,List &Lb );
void GetelemByIndex( List &La,List &Lb );
void GetIndexByelem( List &La,List &Lb );
void Getfront( List &La,List &Lb );
void Getbehind( List &La,List &Lb );
void InsertElem( List &La,List &Lb );
void DeleteElem( List &La,List &Lb );
void PrintElem( List &La,List &Lb );
Satus CombineList( List &La,List &Lb,List &Lc );

int main()
{
	int n,flag=1;//设定一个flag来判断循环需要的次数 
	while( flag )
	{
		catalog();
		cout<<"请输入要进行的功能:";
		cin>>n;
		List La,Lb,Lc;
		switch( n )
		{
			case 1:
				Init_List_a(La);
				Init_List_b(Lb);
				break;
			case 2:
				Destory(La,Lb);
				break;
			case 3:
				Clear(La,Lb);
				break;
			case 4:
				Judge(La,Lb);
				break;
			case 5:
				GetLength(La,Lb);
				break;
			case 6:
				GetelemByIndex(La,Lb);
				break;
			case 7:
				GetIndexByelem(La,Lb);
				break;
			case 8:
				Getfront(La,Lb);
				break;
			case 9:
				Getbehind(La,Lb);
				break;
			case 10:
				InsertElem(La,Lb);
				break;
			case 11:
				DeleteElem(La,Lb);
				break;
			case 12:
				PrintElem(La,Lb);
				break;
			case 13:
				CombineList(La,Lb,Lc);
				break;
			default :
				cout<<"输入有误,请重新选择功能进行输入!"<<endl;
				break; 
		}
		system("pause");
		system("cls");
	}
	return 0;
}

void catalog()
{		
	cout<<"		--------------------------------------"<<endl;
	cout<<"		|  1.---->初始化一个线性表           |"<<endl;
	cout<<"		|  2.---->销毁线性表                 |"<<endl;
	cout<<"		|  3.---->清空线性表                 |"<<endl;
	cout<<"		|  4.---->判断线性表是否为空         |"<<endl;
	cout<<"		|  5.---->求线性表的长度             |"<<endl;
	cout<<"		|  6.---->获取线性表中指定位置的元素 |"<<endl;
	cout<<"		|  7.---->获取线性表元素的位置       |"<<endl;
	cout<<"		|  8.---->求前驱                     |"<<endl;
	cout<<"		|  9.---->求后继                     |"<<endl;
	cout<<"		| 10.---->在线性表指定位置插入元素   |"<<endl;
	cout<<"		| 11.---->删除线性表指定位置的元素   |"<<endl;
	cout<<"		| 12.---->显示线性表                 |"<<endl;
	cout<<"		| 13.---->合并两个非递减有序的线性表 |"<<endl;
	cout<<"		|     退出,输入一个负数!           |"<<endl;
	cout<<"		--------------------------------------"<<endl;
}
Satus Init_List_a( List &La )
{
	//构造一个空的线性表La 
	La.elem=(ElemType*)malloc(list_init_size*sizeof(ElemType));
	if( !La.elem )
		exit(overflow);      //存储分配失败 
	a_success=1;
	La.length=0;              //空表长度为0 
	La.listsize=list_init_size;  //初始存储容量
	cout<<endl;
	cout<<"线性表A空间申请成功!"<<endl;
	cout<<"请给线性表A赋值:"<<endl;
	int a;
	do{
		a_assign=1;
		while( scanf("%d",&a) > 0 && getchar()!='\n' )//限定循环输入数字的次数以及结束循环的条件 
		{
			La.length++;
			if( La.length==1 )
				La.elem[0]=a;
			else
				for(int i=0;i<La.length-1;i++)//利用for循环来进行查重判断 
				{
					if( a!=La.elem[i] )
						La.elem[La.length-1]=a;
					else
					{
						cout<<"线性表中不能输入相同的数据!"<<endl;
						La.length=0;
						a_assign=0;
						break;
					}
				}
		} 
	}while(a_assign==0);
	return ok;
}
Satus Init_List_b( List &Lb )
{
	//构造一个空的线性表Lb 
	Lb.elem=(ElemType*)malloc(list_init_size*sizeof(ElemType));
	if( !Lb.elem )
		exit(overflow);      //存储分配失败 
	b_success=1;
	Lb.length=0;              //空表长度为0 
	Lb.listsize=list_init_size;  //初始存储容量
	cout<<endl;
	cout<<"线性表B空间申请成功!"<<endl;
	cout<<"请给线性表B赋值:"<<endl;
	int b;
	do{
		b_assign=1;
		while( scanf("%d",&b) > 0 && getchar()!='\n' )
		{
			Lb.length++;
			if( Lb.length==1 )
				Lb.elem[0]=b;
			else
				for(int i=0;i<Lb.length-1;i++)
				{
					if( b!=Lb.elem[i] )
						Lb.elem[Lb.length-1]=b;
					else
					{
						cout<<"线性表中不能输入相同的数据!"<<endl;
						Lb.length=0;
						b_assign=0;
						break;
					}
				}
		} 
	}while(b_assign==0);
	return ok;
}
Satus Destory( List &La,List &Lb )
{
	if( a_success == 0 )
	{
		cout<<"线性表A还未初始化!请先初始化~"<<endl;
		return false; 
	} 
	if( b_success == 0 )
	{
		cout<<"线性表B还未初始化!请先初始化~"<<endl;
		return false;
	}
	int i;
	cout<<"输入1:销毁线性表A"<<endl;
	cout<<"输入2: 销毁线性表B"<<endl;
	cin>>i;
	if( i==1 )
{
		free(La.elem);
		La.elem=NULL;
		La.length=0;
		a_success=0; 
		cout<<"线性表A销毁成功!" <<endl;
	}
	else if( i==2 )
	{
		free(Lb.elem);
		Lb.elem=NULL;
		Lb.length=0;
		b_success=0;
		cout<<"线性表B销毁成功!"<<endl;
	}
	else
		cout<<"输入有误,请重新进行操作!" <<endl;
	return true;
}
Satus Clear( List &La,List &Lb )
{
	if( a_success==0 )
		cout<<"线性表A未初始化或者长度为0!不必执行清空操作!" <<endl<<endl;
	else
	{
		La.length=0;
		cout<<"线性表A清空完成!"<<endl; 
	}
	if( b_success==0 )
		cout<<"线性表B未初始化或者长度为0!不必执行清空操作!" <<endl<<endl;
	else
	{
		Lb.length=0;
		cout<<"线性表B清空完成!"<<endl; 
	}
	return true;
}
void Judge( List &La,List &Lb )
{
	if( a_success==0 )
		cout<<"线性表A还未初始化!请先初始化!"<<endl;
	else
	{
		if( La.length==0 )
			cout<<"线性表A为空!"<<endl;
		else
			cout<<"线性表A不为空!"<<endl;
	}
	if( b_success==0 )
		cout<<"线性表B还未初始化!请先初始化!"<<endl;
	else
	{
		if( Lb.length==0 )
			cout<<"线性表B为空!" <<endl;
		else
			cout<<"线性表B不为空!"<<endl;
	}
}
void GetLength( List &La,List &Lb )
{
	if( a_success==0 )
		cout<<"线性表A还未初始化!请先初始化!"<<endl; 
	else
		cout<<"线性表A的长度为:"<<La.length<<endl;
	if( b_success==0 )
		cout<<"线性表B还未初始化!请先初始化~"<<endl;
	else
		cout<<"线性表B的长度为:"<<Lb.length<<endl;
	cout<<endl;
}
void GetelemByIndex( List &La,List &Lb )
{
	if( a_success==0 )
	{
		cout<<"线性表A还未初始化!请先初始化!"<<endl;
		return;
	}
	if( b_success==0 )
	{
		cout<<"线性表B还未初始化!请先初始化!"<<endl;
		return;
	}
	int list=0;
	int index=0;
	cout<<"1:线性表A"<<endl;
	cout<<"2:线性表B"<<endl; 
	cout<<"请输入需要查询的线性表序号:"<<endl;
	cin>>list;
	if( list==1 )
	{
		cout<<"请输入你要查询元素的位置:";
		cin>>index;
		if( index>0 && index<=La.length )
			cout<<"你查询的元素为:"<<La.elem[index-1]<<endl;
		else
			cout<<"你输入的位置超出了线性表A的范围!请正确输入!"<<endl; 
			cout<<endl;
	}
	
	else if( list==2 )
	{
		cout<<"请输入你要查询元素的位置:"; 
		cin>>index;
		if( index>0 && index<=Lb.length )
			cout<<"你查询的元素为:"<<Lb.elem[index-1]<<endl;
		else
			cout<<"你输入的位置超出了线性表B的范围!请正确输入!"<<endl;
			cout<<endl; 
	}
	else
		cout<<"输入有误,请正确输入!"<<endl;
}
void GetIndexByelem( List &La,List &Lb )
{
	if( a_success==0 )
	{
		cout<<"线性表A还未初始化!请先初始化!"<<endl;
		return;
	}
	if( b_success==0 )
	{
		cout<<"线性表B还未初始化!请先初始化!"<<endl;
		return;
	}
	int elem_num=0;
	int list=0;
	int find_flag=1;
	int index=0;
	cout<<"1:线性表A"<<endl;
	cout<<"2:线性表B"<<endl; 
	cout<<"请输入需要查询的线性表序号:"<<endl;
	cin>>list;
	if( list==1 )
	{
		cout<<"请输入你要查询的元素:" ;
		cin>>elem_num;
		for( int i=0;i<La.length;i++ )
		{
			if( elem_num==La.elem[i] )
			{
				index=i+1;
				find_flag=0;
				break;	
			}
		}
		//找到,index就会被初始化,否则就是没找到 
		if( !find_flag )
		{
			cout<<"该元素所在的位置为:" <<index<<endl;
			index=0;
			cout<<endl;
		}
		else
		{
			cout<<"线性表A中没有此元素!"<<endl;
			cout<<endl;
		}
	}
	else if( list==2 )
	{
		cout<<"请输入你要查询的元素:" ;
		cin>>elem_num;
		for( int i=0;i<Lb.length;i++ )
		{
			if( elem_num==Lb.elem[i] )
			{
				index=i+1;
				find_flag=0;
				break;	
			}
		}
		//找到,index就会被初始化,否则就是没找到 
		if(! find_flag )
		{
			cout<<"该元素所在的位置:" <<index<<endl;
			index=0;
			cout<<endl;
		}
		else
		{
			cout<<"线性表B中没有此元素!"<<endl;
			cout<<endl;
		}
	}
	else
		cout<<"输入有误,请正确输入!"<<endl<<endl; 
}
void Getfront( List &La,List &Lb )
{
	if( a_success==0 )
	{
		cout<<"线性表A还未初始化!请先初始化!"<<endl;
		return;
	}
	if( b_success==0 )
	{
		cout<<"线性表B还未初始化!请先初始化!"<<endl;
		return;
	}
	int list=0;
	int elem_num;
	int find_flag=1;
	int findex=0;
	cout<<"1:线性表A"<<endl;
	cout<<"2:线性表B"<<endl; 
	cout<<"请输入你要查询的线性表的序号:"<<endl;
	cin>>list;
	if( list==1 )
	{
		cout<<"输入元素即可得到前驱元素:" ;
		cin>>elem_num;
		for( int i=0;i<La.length;i++ )
		{
			if( elem_num==La.elem[i] )
			{
				findex=i;
				if( findex==0 )
					cout<<"该元素无前驱元素!"<<endl;
				else
					cout<<"该元素的前驱元素为:"<<La.elem[findex-1]<<endl;
				find_flag=0;
				break;	
			}
		}
		//找到,index就会被初始化,否则就是没找到 
		if( find_flag )
		{
			cout<<"线性表A中没有此元素!"<<endl;
			cout<<endl;
		}
	}
	else if( list==2 )
	{
		cout<<"输入元素即可得到前驱元素:" ;
		cin>>elem_num;
		for( int i=0;i<Lb.length;i++ )
		{
			if( elem_num==Lb.elem[i] )
			{
				findex=i;
				if( findex==0 )
					cout<<"该元素无前驱元素!"<<endl;
				else
					cout<<"该元素的前驱元素为:"<<Lb.elem[findex-1]<<endl;
				find_flag=0;
				break;	
			}
		}
		//找到,index就会被初始化,否则就是没找到 
		if( find_flag )
		{
			cout<<"线性表B中没有此元素!"<<endl;
			cout<<endl;
		}
	}
	else
		cout<<"输入有误,请正确输入!"<<endl<<endl;
}
void Getbehind( List &La,List &Lb )
{
	if( a_success==0 )
	{
		cout<<"线性表A还未初始化!请先初始化!"<<endl;
		return;
	}
	if( b_success==0 )
	{
		cout<<"线性表B还未初始化!请先初始化!"<<endl;
		return;
	}
	int list=0;
	int elem_num;
	int find_flag=1;
	int bindex=0;
	cout<<"1:线性表A"<<endl;
	cout<<"2:线性表B"<<endl; 
	cout<<"请输入你要查询的线性表的序号:"<<endl;
	cin>>list;
	if( list==1 )
	{
		cout<<"输入元素即可得到前驱元素:" ;
		cin>>elem_num;
		for( int i=0;i<La.length;i++ )
		{
			if( elem_num==La.elem[i] )
			{
				bindex=i;
				if( bindex==La.length-1 )
					cout<<"该元素无后继元素!"<<endl;
				else
					cout<<"该元素的后继元素为:"<<La.elem[bindex+1]<<endl;
				find_flag=0;
				break;	
			}
		}
		//找到,index就会被初始化,否则就是没找到 
		if( find_flag )
		{
			cout<<"线性表A中没有此元素!"<<endl;
			cout<<endl;
		}
	}
	else if( list==2 )
	{
		cout<<"输入元素即可得到前驱元素:" ;
		cin>>elem_num;
		for( int i=0;i<Lb.length;i++ )
		{
			if( elem_num==Lb.elem[i] )
			{
				bindex=i;
				if( bindex==Lb.length )
					cout<<"该元素无前驱元素!"<<endl;
				else
					cout<<"该元素的前驱元素为:"<<Lb.elem[bindex+1]<<endl;
				find_flag=0;
				break;	
			}
		}
		//找到,index就会被初始化,否则就是没找到 
		if( find_flag )
		{
			cout<<"线性表B中没有此元素!"<<endl;
			cout<<endl;
		}
	}
	else
		cout<<"输入有误,请正确输入!"<<endl<<endl;
}
void InsertElem( List &La,List &Lb )
{
	if( a_success==0 )
	{
		cout<<"线性表A还未初始化!请先初始化!"<<endl;
		return;
	}
	if( b_success==0 )
	{
		cout<<"线性表B还未初始化!请先初始化!"<<endl;
		return;
	}
	int index=0;
	int insert_num=0;
	int list=0;
 	cout<<"1:线性表A"<<endl;
	cout<<"2:线性表B"<<endl; 
	cout<<"请输入你要插入的线性表的序号:"<<endl;
	cin>>list;
	if( list==1 )
	{
		cout<<"请输入你要插入的位置:" <<"(范围是:1 - "<<La.length+1<<")"<<endl;
		cin>>index;
		cout<<"请输入你要插入的元素值:";
		cin>>insert_num;
		if( index<1 || index>La.length+1 )
			cout<<"插入位置无效,插入失败!"<<endl;
		else{
			//开辟增容后的内存空间 
			if( La.length>=La.listsize )
			{	//存储空间不够用 
			   //申请新的空间,newbase为基地址 
				ElemType *newbase=(ElemType*)malloc((La.listsize+list_increment)*sizeof(ElemType));
				if( !newbase )
				{
					cout<<"新开辟空间失败!"<<endl;
					exit(overflow);
				}
				else{
					La.elem=newbase;
					La.listsize+=list_increment;
				} 
			}
			//元素插入,index位置的元素对应 elem[index -1] 
			//即最后一个元素的位置为 [index-1] 
			
			//q 为插入元素的位置 地址 
			int *q=&(La.elem[index-1]);
			//P 开始指向最后一个元素的地址,循环向前移动  使 index 位置及后面的所有元素依次向后,
			//直到p移动到 插入元素的位置 ,把需要插入的元素 覆盖 当前插入位置 的元素即可 
			for( int *p=&(La.elem[La.length-1]);p>=q;--p )
				*(p + 1) = *p;
			*q=insert_num;
			La.length++;
			cout<<"插入成功!"<<endl<<endl; 
		}
		 
	}
	else if( list==2 )
	{
		cout<<"请输入你要插入的位置:"<<"(范围:1 - "<<Lb.length + 1 <<")"<<endl;
		cin>>index;
		cout<<"请输入你要插入的元素值:";
		cin>>insert_num;
		if( index<1 || index>Lb.length+1 )
			cout<<"插入位置无效,插入失败!"<<endl;
		else{
			//开辟增容后的内存空间 
			if( Lb.length>=Lb.listsize )
			{//存储空间不够用 
			   //申请新的空间,newbase为基地址 
				ElemType *newbase = (ElemType *)malloc((Lb.listsize + list_increment) * sizeof(ElemType));
				if(!newbase) {
					cout<<"新开辟空间失败!";
					return;
				}
				else{
					Lb.elem = newbase;
					Lb.listsize+=list_increment;
				}
			}
			//元素插入,index位置的元素对应 elem[index -1] 
			//即最后一个元素的位置为 [index-1] 
			
			//q 为插入元素的位置 地址 
			int *q = &(Lb.elem[index-1]) ;
			//P 开始指向最后一个元素的地址循环向前移动使 index 位置及后面的所有元素依次向后,
			//直到p移动到插入元素的位置 ,把需要插入的元素覆盖当前插入位置的元素即可 
			for(int *p = &(Lb.elem[Lb.length - 1]);p >= q;p--)
				*(p + 1) = *p;
			*q=insert_num;
			Lb.length++;
			cout<<"插入成功!" <<endl<<endl;
		}
	}
	else
	cout<<"输入有误,请重新进行操作!" <<endl;
}
void DeleteElem( List &La,List &Lb )
{
	if( a_success==0 )
	{
		cout<<"线性表A还未初始化!请先初始化!"<<endl;
		return;
	}
	if( b_success==0 )
	{
		cout<<"线性表B还未初始化!请先初始化!"<<endl;
		return;
	}
	int index=0;
	int del_num; 
	int list=0;
	cout<<"请输入你要删除元素的线性表的序号:"<<endl;
 	cout<<"1:线性表A"<<endl;
	cout<<"2:线性表B"<<endl; 
	cin>>list;
	if( list==1 )
	{
		cout<<"请输入你要删除的元素位置:"<<"(范围:1 - "<<La.length<<")"<<endl;
		cin>>index;
		if( index<1 || index>La.length )
			cout<<"删除元素的位置无效,删除失败!"<<endl;
		else
		{
			//p指向删除元素的位置 
			ElemType *p=&(La.elem[index-1]);
			//q 指向最后的元素 
			del_num=*p;
			ElemType *q=La.elem+La.length-1;
			//元素的移动
			for( p++;p<=q;++p )
				*(p-1)=*p;
			La.length--;
			cout<<"删除元素"<<del_num<<"成功!"<<endl<<endl;
		}
	}
	else if( list==2 )
	{
		cout<<"请输入你要删除的元素位置:"<<"(范围:1 - "<<Lb.length<<")"<<endl;
		cin>>index;
		if( index<1 || index>Lb.length )
			cout<<"删除元素的位置无效,删除失败!"<<endl;
		else{
			//p指向删除元素的位置 
			ElemType *p=&(Lb.elem[index-1]);
			//q 指向最后的元素 
			del_num=*p;
			ElemType * q=Lb.elem+Lb.length-1;
			//元素的移动
			for( p++;p<=q;++p)
				*(p-1) = *p;
			Lb.length--;
			cout<<"删除元素"<<del_num<<"成功!"<<endl<<endl;
		}
	}
	else
		cout<<"输入有误,请重新进行操作!"<<endl;
}
void PrintElem( List &La,List &Lb )
{
	if( a_success==1 || b_success==1)
	{
		int list=0;
		cout<<"请输入你要删除元素的线性表的序号:"<<endl;
	 	cout<<"1:线性表A"<<endl;
		cout<<"2:线性表B"<<endl; 
		cin>>list;
		if( list==1 )
		{
			cout<<"线性表A:"; 
			for(int i=0;i<La.length;i++)
				printf("%4d",La.elem[i]);
			cout<<endl;
		}
		else if( list==2 )
		{
			cout<<"线性表B:"; 
			for(int i=0;i<Lb.length;i++)
				printf("%4d",Lb.elem[i]);
			cout<<endl;
		}
		else
			cout<<"输入有误,请重新输入!"<<endl;
	}
	else
		cout<<"未成功开辟空间,请先在线性表当中输入数据!"<<endl;
}
Satus CombineList( List &La,List &Lb,List &Lc )
{
	if( a_success==0 )
	{
		cout<<"线性表A还未初始化!请先初始化!"<<endl;
		return false;
	}
	if( b_success==0 )
	{
		cout<<"线性表B还未初始化!请先初始化!"<<endl;
		return false;
	}
	//合并表C开辟空间 
	Lc.elem=(ElemType *)malloc(list_init_size*sizeof(ElemType));
	//开辟未成功 
	if( !Lc.elem)
	{
		cout<<"合并的线性表C的存储空间分配失败!请重新操作"<<endl; 
		exit(overflow);
	}
	//成功开辟空间 
	else
	{
		//分配空间成功的标记 
		c_success=1;
		Lc.length=La.length+Lb.length;
		Lc.listsize=list_init_size;
		cout<<"线性表C的存储空间分配成功!"<<endl;
	}
	//定义指针,方便向后移动比较线性表元素大小 
	ElemType *pa_head=La.elem;
	ElemType *pb_head=Lb.elem;
	ElemType *pc_head=Lc.elem;
	//定义尾指针,方便判断 头指针 是否移动到尾部 
	ElemType *pa_last=&La.elem[La.length-1];
	ElemType *pb_last=&Lb.elem[Lb.length-1];
	//开始移动指针,比较插入
	//还没指针移动到结尾 
	while( pa_head<=pa_last && pb_head<=pb_last)
	{
		if( *pa_head<*pb_head )
			*pc_head++=*pa_head++;
		else
			*pc_head++=*pb_head++;
	}
	//pb指针移动到了结尾,就把剩下的pa指针依次后移插入
	while( pa_head<=pa_last )
		*pc_head++=*pa_head++;
	while( pb_head<=pb_last )
		*pc_head++=*pb_head++;
	cout<<"线性表合并完毕:";
	for(int j=0;j<Lc.length;j++)
	{
		//发现重复的 
		if( Lc.elem[j]==Lc.elem[j+1] )
		{
			//后面的 依次 覆盖前值 
			//建议在纸上画画 
			for( int i=j+1;i<Lc.length-1;i++ )
				Lc.elem[i]=Lc.elem[i+1];
			Lc.length--;
		} 
	}
	for( int i = 0;i<Lc.length;i++ )
		cout<<" "<<Lc.elem[i];
	cout<<endl<<endl;
}

;