#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define LIST_INIT_SIZE 100//表的初始空间分配量
#define LISTINCREMENT 10//表存储空间的增量
typedef struct
{
int *elem;//首地址
int length;//元素个数
int listsize;//表空间大小
}SqList;
void InitList_Sq(SqList &L)//线性表初始化
{
L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));//分配空间
if(!L.elem)//存储分配失败
{
cout<<"don't create list"<<endl;
exit(0);//退出程序
}
L.length=0;//空表长度
L.listsize=LIST_INIT_SIZE;//初始存储量
cout<<"initialize success"<<endl;//分配成功
}
void ListInsert_Sq(SqList &L,int i ,int e)//在顺序表L的滴i个位置插入元素e
{
int * newbase,*q,*p;
if (i<1||i>L.length +1)//位置i不符合规定
{
cout<<"insert defeat "<<endl;
exit(0);
}
if(L.length>=L.listsize)//增加分配空间
{
newbase=(int *)realloc((L.elem),(L.listsize+LISTINCREMENT)*sizeof(int ));
if(!newbase) //分配失败
{
cout<<"insert defeat"<<endl;
exit(0);
}
L.elem=newbase;//新基址
L.listsize +=LISTINCREMENT;//增加存储量
}
q=&(L.elem[i-1]);//q为插入地址
for(p=&(L.elem[L.length-1]);p>=q;--p) //插入位置后方的元素右移
*(p+1)=*p;
q[i-1]=e; //插入e
++L.length;//表长加1
cout<<"insert "<<e<<"in"<<i<<endl;
}
void ListDelete_Sq(SqList &L,int i )//删除i处的值
{
int e;
int *q,*p;
if ((i<1)||(i>L.length))//i值不合法
{
cout<<"delete defeat"<<endl;
exit(0);
}
else
{
p=&(L.elem[i-1]);
e=*p;//删除值
q=L.elem+L.length-1;// p为删除元素
for(++p;p<=q;++p) //删除后左移
*(p-1)=*p;
--L.length;//表长减1
cout<<"delete "<<e<<endl;
}
}
void ListRead_Sq(SqList &L,int i)//查看i处的值
{
if ((i<1)||(i>L.length))//i值错误
{
cout<<"input locate error"<<endl;
exit(0);
}
cout<<L.elem[i-1]<<endl;//输出该值
}
void ListShow_Sq(SqList &L)//输出表
{
cout<<"------------------------------------------------------"<<endl;
int i=0;
int *q;
for (q=L.elem;q<L.elem+L.length;i++,q++)//逐一输出
cout<<i+1<<": "<<L.elem[i]<<endl;
cout<<"------------------------------------------------------"<<endl;
}
void ListInput_Sq(SqList &L)//输入表
{
int i,e,amount;
string way;
cout<<"please choice assignment method(people or automate)"<<endl;//选择人工或者自动输入
cin>>way;
cout<<"please input how much number"<<endl;//输入元素个数
cin>>amount;
int *newbase;
while(amount>L.listsize)//个数超出存储空间,增加空间量
{
newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)
{
cout<<"input error "<<endl;
exit(0);
}
L.listsize=L.listsize+LISTINCREMENT;
}
srand((unsigned int)time(NULL));//随机种子
int *q;
q=L.elem;
if(way=="people")//人工输入
{
for(i=0;i<amount;i++)
{
cin>>e;
q[i]=e;
++L.length;
}
}
else if(way=="automate")//自动输入
{
for(i=0;i<amount;i++)
{
q[i]=rand();
++L.length;
}
}
else//指令不合法
{
cout<<"input error"<<endl;
exit(0);
}
cout<<"finish input"<<endl;//完成
}
void ListExtreme_Sq(SqList &L)//查找极值
{
int Max,Min,i=0;
int *q;
Max=Min=L.elem[i];//最值赋初值
for (q=L.elem;q<L.elem+L.length;i++,q++)
{
if(L.elem[i]>Max)//选最大值
Max=L.elem[i];
if(L.elem[i]<Min)//选最小值
Min=L.elem[i];
}
cout<<"max:"<<Max<<'\n'<<"min:"<<Min<<endl;
}
void ListFind_Sq(SqList &L,int e)//查找某个值
{
int *q;
for(q=L.elem;q<L.elem+L.length;q++)//遍历查找
if(*q==e)
{
cout<<"there are it"<<endl;//找到
q=q-1;
break;
}
if(q==L.elem+L.length)//查找失败
cout<<"there are not it"<<endl;
}
void ListSort_Sq(SqList &L)//排序
{
int *q;
q=L.elem;
int i,j,k,n;
n=L.length;
for(i=0;i<n;i++)//选择排序法
for(j=i+1;j<n;j++)
{
if(q[i]>q[j])
{
k=q[i];
q[i]=q[j];
q[j]=k;
}
}
for(i=0;i<L.length-1;i++)//检验排序是否正确
{
if((q[i]>q[i+1]))
break;
}
if(i==L.length-1)
cout<<"sorting right"<<endl;//正确
else
cout<<"sorting error"<<endl;//错误,
}
void ListInvertion_Sq(SqList &L)//倒置
{
int *q;
int k,i=0;
for(q=L.elem;i<L.length/2;i++)//对称互换
{
k=q[i];
q[i]=q[L.length-1-i];
q[L.length-1-i]=k;
}
}
void ListMerge_Sq(SqList &L1,SqList &L2,SqList &L3)//L1与L2合并为L3
{
L3.listsize=L1.length+L2.length;//初始空间大小
L3.elem=(int *)malloc(L3.listsize*sizeof(int));//创建表
if(!L3.elem)//创建失败
{
cout<<"L3 hasn't create"<<endl;
exit(0);
}
int *q1,*q2,*q3;
q1=L1.elem;
q2=L2.elem;
q3=L3.elem;
int i=0,j=0,k=0;
for(;i<L1.length&&j<L2.length;k++)//两两比较 取大值放入L3直至一方终结
{
if(q1[i]>q2[j])
{
q3[k]=q2[j];
j++;
}
else if(q1[i]<q2[j])
{
q3[k]=q1[i];
i++;
}
else if(q1[i]==q2[j])
{
q3[k]=q1[i];
i++;
j++;
}cout<<k;
}
while(i<L1.length)//将未放入L3的值放入
{
q3[k]=q1[i];
k++;
i++;
}
while(j<L2.length)
{
q3[k]=q2[j];
k++;
j++;
}
L3.length=k;
ListShow_Sq(L3);
}
int main()
{
SqList n1,n2,n3;//创建表n1.n2.n3
InitList_Sq(n1);//初始化n1
InitList_Sq(n2);//初始化n2
InitList_Sq(n3);//初始化n3
ListInput_Sq(n1);//输入n1值
cout<<"n1"<<endl;
ListShow_Sq(n1);//输出n1
ListInput_Sq(n2);//输入n2值
cout<<"n2"<<endl;
ListShow_Sq(n2);//输出n2
ListInsert_Sq(n1,1,2);//在位置1插入2
ListShow_Sq(n1);//输出表n1
ListDelete_Sq(n1,1);//删除位置i的值
ListShow_Sq(n1);//输出表n1
ListFind_Sq(n1,3);//在n1中寻找3
ListExtreme_Sq(n1);//查看n1极值
ListRead_Sq(n1,1);//查看表n1位置一的值
ListSort_Sq(n1);//对n1排序
cout<<"n1"<<endl;
ListShow_Sq(n1);//输出n1
ListSort_Sq(n2);//对n2排序
cout<<"n2"<<endl;
ListShow_Sq(n2);//输出n2
ListInvertion_Sq(n1);//倒置n1
cout<<"n1 invertion"<<endl;
ListShow_Sq(n1);//输出倒置后的n1
ListInvertion_Sq(n1);//还原n1
cout<<"n3"<<endl;
ListMerge_Sq(n1,n2,n3);//合并与输出n3
return 0;
}