/*
Name: SeqList_Rel
Copyright:
Author: huowolf
Date: 06/07/15 21:49
Description: 顺序表的有关增强练习
*/
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef int ElemType;
struct SeqList
{
ElemType elems[MAXSIZE];
int last;
};
void InitList(SeqList &l);
int InsertList(SeqList &l,int i,ElemType e);
void CreateList(SeqList &l);
void Output(SeqList &l);
void OrderInsert(SeqList &l,ElemType x);
void MultyDelete(SeqList &l,int i,int k);
void Delsame(SeqList &L);
void Invert(SeqList &L);
SeqList L;
int main()
{
InitList(L);
CreateList(L);
Output(L);
/*
int x;
cout<<"请输入一个你要有序插入的元素:";
cin>>x;
OrderInsert(L,x);
Output(L);
int a,b;
cout<<"请输入你要开始删除的位置i,以及要删除的个数k:";
cin>>a>>b;
MultyDelete(L,a,b);
Output(L);
int item;
cout<<"请输入你要删除的元素";
cin>>item;
DeleteItem(L,item);
Output(L);
Delsame(L);
Output(L);
*/
Invert(L);
Output(L);
return 0;
}
void InitList(SeqList &l)
{
l.last = -1;
}
int InsertList(SeqList &l,int i,ElemType e) //1<=i<=L->last+2
{
if(i<1 || i>l.last+2)
{
cout<<"插入位置i非法!"<<endl;
return -1;
}
if(i>MAXSIZE-1)
{
cout<<"表已满,无法插入!"<<endl;
return -1;
}
for(int j=l.last+1;j>=i;j--)
l.elems[j]=l.elems[j-1];
l.elems[i-1] = e; //插入 (第i个元素的下标是i-1)
l.last++;
return 0;
}
void CreateList(SeqList &l)
{
cout<<"请依次输入数据,并以-1作为结束标记:"<<endl;
int n;
cin>>n;
while(n!=-1)
{
InsertList(l,l.last+2,n);
cin>>n;
}
}
void Output(SeqList &l)
{
cout<<"遍历该顺序表如下:"<<endl;
for(int i=0;i<=l.last;i++)
{
cout<<l.elems[i]<<" ";
}
cout<<endl;
}
/*
该函数实现以下功能:
已知顺序表L单调递增,将X插入线性表的适当位置
以保持线性表的有序性。
*/
void OrderInsert(SeqList &l,ElemType x)
{
int i=l.last;
while(i>=0&&x<l.elems[i])
{
l.elems[i+1]=l.elems[i];
i--;
}
l.elems[i+1]=x;
l.last++;
}
/*
从顺序表中删除自第i个元素开始的k个元素
*/
void MultyDelete(SeqList &l,int i,int k)
{
if(l.last+1-i+1<k)
cout<<"参数有误,你要删除的区间元素不足"<<k<<"个"<<endl;
int m,j;
for(m=i-1,j=k+i-1;j<=l.last;j++)
l.elems[m++]=l.elems[j];
l.last=m-1;
}
/*
编写一时间复杂度为O(n),空间复杂度为O(1)的算法,
删除线性表中所以值为item的元素
*/
void DeleteItem(SeqList &l,ElemType item)
{
int i=0,k=0;
while(i<=l.last)
{
if(l.elems[i]!=item) l.elems[k++]=l.elems[i];
i++;
}
l.last=k-1;
}
/*
编写一时间复杂度为O(n^2),空间复杂度为O(1)的算法,
删除所以值相等的多余元素
*/
void Delsame(SeqList &L)
{
int i=0,k;
for(int j=1;j<=L.last;j++)
{
//如果当前元素L.elems[j]和L.elems[0...i]中的某一元素相等,就break
for(k=0;k<=i;k++)if(L.elems[k]==L.elems[j])break;
//如果上面执行了break,也就是有相同元素..那么则有k<=i
//如果没有执行break..则一定有k>i
if(k>i)L.elems[++i]=L.elems[j];//把当前元素L.elems[j]追加到以完成的有序区中
}
L.last = i;
}
//实现顺序表的就地逆置算法
void Invert(SeqList &L)
{
int i,j,t;
i=0;j=L.last;
while(i<j)
{
t=L.elems[i]; L.elems[i]=L.elems[j]; L.elems[j]=t;
i++;j--;
}
}
顺序表的有关增强练习
最新推荐文章于 2021-01-16 09:04:20 发布