仅供参考!
#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;
}