#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
using namespace std;
const int max_size=100;
/*********************************
*********************************/
/****线性表的定义*******/
typedef struct
{
int data[max_size];//存取关键字 大于等于0
int length; //当前长度
} SqList;
/********初始化*********/
bool InitList(SqList &sq)
{
memset(sq.data,0,sizeof(sq.data));
sq.length=0;
return true;
}
/********清空*********/
bool ClearList(SqList &sq)
{
memset(sq.data,0,sizeof(sq.data));
sq.length=0;
return true;
}
/*******随机生成线性表*****/
void Create(SqList &sq)
{
srand((unsigned int)time(NULL));
for(int i=0; i<10; i++)
{
sq.length++;
sq.data[i]=rand()%100;
}
}
/************************************插入********************************/
/** 插入数据data到第i个位置
** 说明i的取值为[1,sq.length+1],判断i是否在此范围,同时判断sq.length==max_size?
** 插入的时候如果不是在线性表的尾部插入,就需要移动原来的[i,sq.length]的数值
** 注意 存数据时是从0开始的
** 返回值:true表示插入成功,false表示插入失败
**/
bool InsertList(SqList &sq,int i,int data)
{
if(i<1||i>sq.length+1)return false; //判断范围
if(sq.length==max_size)return false; // 顺序线性表已经满
if(i<=sq.length) // 若插入数据位置不在表尾
{
for(int j=sq.length-1; j>=i-1; j--)
{
sq.data[j+1]=sq.data[j];
}
}
sq.data[i-1]=data;//直接插在表尾
sq.length++;
return true;
}
/********遍历**********/
void print(SqList sq)
{
for(int i=0; i<sq.length; i++)
{
cout<<sq.data[i]<<" ";
}
cout<<endl;
}
/********删除*********/
/** 删除第i个数据,并用data返回
** 说明 i的取值为[1,sq.length],判断i是否在此范围,并且判断是否为空
** 删除的时候如果不是在线性表的尾部删除,就需要移动原来的[i,sq.length]的数值
** 返回值:true表示删除成功,false表示删除失败
**/
bool DeleteList(SqList &sq,int i)//删除第i个并不返回data
{
if(sq.length==0)return false; //空表
if(i<1||i>sq.length)return false;//判断范围
if(i<sq.length)
{
for(int j=i; j<sq.length; j++)
{
sq.data[j-1]=sq.data[j];
}
}
sq.length--;
return true;
}
bool DeleteListReturn(SqList &sq,int i,int &data)//返回data
{
if(sq.length=0)return false; //空表
if(i<1||i>sq.length)return false;//判断范围
data=sq.data[i-1];
if(i<sq.length)
{
for(int j=i; j<sq.length; j++)
{
sq.data[j-1]=sq.data[j];
}
}
sq.length--;
return true;
}
/********判断是否为空*********/
bool ListEmpty(SqList sq)
{
return sq.length==0?true:false;
}
/********获取线性表的长度*********/
int GetListLength(SqList sq)
{
return sq.length;
}
/********获取指定位置的元素*********/
/** 获取第i个数据
** 判断i的合法性
** -1 表示错误,否则返回第i个data的值
**/
int GetData(SqList sq,int i)
{
if(i<1||i>sq.length||sq.length==0)return -1;
return sq.data[i-1];
}
/***********获取满足条件的第一个位置*************/
/** 在这儿默认为 >
** 获取第一个大于data的位置
** 成功返回第一个大于data的位置,反之返回-1
** 前提是sq存在,同时如果i的值等于length,表示没找到,返回-1
**/
int LocateData(SqList sq,int data)
{
int i;
if(sq.length==0)return -1;
for(i=0; i<sq.length; i++)
{
if(sq.data[i]>data)
{
break;
}
}
if(i>=sq.length)return -1;
return i+1;
}
/***********前驱***********/
/** 注意范围
** 前提是sq存在
** 返回成功第i个数据的前驱,失败返回-1
** 除了第一个元素,其他的元素都有前驱
** 除了最后一个元素,其他元素都有后继
**/
int GetPrior(SqList sq,int i)
{
if(sq.length==0||i==1)return -1;
if(i>sq.length)return -1;
return sq.data[i-2];
}
/***********后继*** *******/
int GetNext(SqList sq,int i)
{
if(sq.length==0||i==sq.length)return -1;
if(i>sq.length)return -1;
return sq.data[i];
}
/********合并*********/
/** 假设sqa和sqb都是升序存在,sqc升序存储
** 判断大小就行了
**/
void MergeList(SqList sqa,SqList sqb,SqList &sqc)
{
InitList(sqc);
int i=1,j=1,k=0;
while(i<=GetListLength(sqa)&&j<=GetListLength(sqb))
{
int a=GetData(sqa,i),b=GetData(sqb,j);
if(a<=b)
{
i++;
InsertList(sqc,k,a);
k++;
}
else
{
j++;
InsertList(sqc,k,b);
k++;
}
}
while(i<=sqa.length)
{
InsertList(sqc,k,GetData(sqa,i));
i++;
k++;
}
while(j<=sqb.length)
{
InsertList(sqc,k,GetData(sqb,j));
k++;
j++;
}
}
int main()
{
SqList sq;
SqList a,b,c;
InitList(sq);
Create(sq);
print(sq);
cout<<"List length is "<<GetListLength(sq)<<endl;
if(ListEmpty(sq)==true)cout<<"List empty"<<endl;
else cout<<"Has Item"<<endl;
if(InsertList(sq,5,19)==false)
{
cout<<"insert failed"<<endl;
}
else
{
print(sq);
cout<<"List length is "<<GetListLength(sq)<<endl;
}
if(DeleteList(sq,5)==false)
{
cout<<"delete failed"<<endl;
}
else
{
print(sq);
cout<<"List length is "<<GetListLength(sq)<<endl;
}
int tmp=GetData(sq,5);
if(tmp==-1)
{
cout<<"get failed"<<endl;
}
else cout<<"get data is "<<tmp<<endl;
tmp=LocateData(sq,56);
if(tmp==-1)cout<<"locate error"<<endl;
else cout<<tmp<<endl;
tmp=GetPrior(sq,3);
if(tmp==-1)cout<<"1 has not prior"<<endl;
else cout<<"prior is "<<tmp<<endl;
tmp=GetNext(sq,4);
if(tmp==-1)cout<<"sq.length has not next"<<endl;
else cout<<"next is "<<tmp<<endl;
InitList(a);
InitList(b);
for(int i=0;i<4;i++)
{
InsertList(a,i+1,i+1);
}
for(int i=0;i<5;i++)
{
InsertList(b,i+1,i+3);
}
print(a);
print(b);
MergeList(a,b,c);
print(c);
ClearList(a);
ClearList(b);
ClearList(c);
ClearList(sq);
cout<<"a length is "<<GetListLength(a)<<endl;
cout<<"b length is "<<GetListLength(b)<<endl;
cout<<"c length is "<<GetListLength(c)<<endl;
cout<<"sq length is "<<GetListLength(sq)<<endl;
return 0;
}
数据结构之线性表顺序实现
最新推荐文章于 2022-12-10 08:36:18 发布