代码是自己写的。
我的顺序表是以1为开始的下标,和书上的不一样。其中习题部分的代码是我自己写的,和书中答案不太一样,比如习题第8题,觉得书上答案用三次倒置操作很智障,自己写的代码多消耗了点空间,但时间效率比答案好。
#include <bits/stdc++.h>
#define MAX_SIZE 50
using namespace std;
//顺序表
typedef int ElemType;
typedef struct SqList
{
ElemType data[MAX_SIZE];
int length;
} SqList;
//插入节点
bool ListInsert(SqList &L, int i, ElemType e)
{
if(i<1||i>L.length+1)
return false;
if(L.length>=MAX_SIZE)
return false;
for(int j=L.length+1; j>i; j--)
{
L.data[j]=L.data[j-1];
}
L.data[i]=e;
L.length++;
return true;
}
//删除
bool ListDelete(SqList &L, int i, ElemType &e)
{
if(i<1||i>L.length+1)
return false;
e=L.data[i];
for(int j=i; j<L.length; j++)
{
L.data[j]=L.data[j+1];
}
L.length--;
return true;
}
//按值查找
int LocateElem(SqList &L,ElemType e)
{
for(int i=1; i<=L.length; i++)
{
if(L.data[i]==e)
return i;
}
return 0;
}
//打印表
void PrintList(SqList &L)
{
for(int i=1; i<=L.length; i++)
{
cout<<L.data[i]<<' ';
}
cout<<endl;
}
//应用题1:删除最小值元素
bool DeleteMin(SqList &L,ElemType &e)
{
ElemType Min;
int index;
if(L.length==0)
return false;
index=1;
Min=L.data[1];
for(int i=2; i<=L.length; i++)
{
if(Min>L.data[i])
{
Min=L.data[i];
index=i;
}
}
e=L.data[index];
L.data[index]=L.data[L.length];
L.length--;
return true;
}
//应用题2表的逆置
bool Reverse(SqList &L)
{
for(int i=1,j=L.length; i<j; i++,j--)
{
swap(L.data[i],L.data[j]);
}
}
//应用题3删除表中的x
bool Deletex(SqList &L,ElemType x)
{
int k=0;
for(int i=1; i<=L.length; i++)
{
if(L.data[i]!=x)
{
L.data[++k]=L.data[i];
}
}
L.length=k;
}
//应用题4删除s和t之间的数(无序)
bool Deletest1(SqList &L,ElemType s,ElemType t)
{
int k=0;
for(int i=1; i<=L.length; i++)
{
if(L.data[i]<s||L.data[i]>t)
{
L.data[++k]=L.data[i];
}
}
L.length=k;
}
//应用题5删除s和t之间的数(有序)
bool Deletest2(SqList &L,ElemType s,ElemType t)
{
if(s>t)
return false;
int index1=1,index2=L.length;
while(L.data[index1]<s)
index1++;
while(L.data[index2]>t)
index2--;
int i,j;
for(i=index1,j=index2+1; j<=L.length; j++,i++)
{
L.data[i]=L.data[j];
}
L.length=i-1;
return true;
}
//应用题6删除重复的数
bool Unique(SqList &L)
{
int k=0;
for(int i=1; i<=L.length; i++)
{
if(L.data[i]!=L.data[i-1])
{
L.data[++k]=L.data[i];
}
}
L.length=k;
return true;
}
//应用题7合并顺序表
bool Merge(SqList &A, SqList &B, SqList &C)
{
if(A.length+B.length>MAX_SIZE)
return false;
int i=1,j=1,k=0;
while(i<=A.length&&j<=B.length)
{
if(A.data[i]<B.data[j])
{
C.data[++k]=A.data[i++];
}
else
{
C.data[++k]=B.data[j++];
}
}
while(i<=A.length)
{
C.data[++k]=A.data[i++];
}
while(j<=B.length)
{
C.data[++k]=B.data[j++];
}
C.length=k;
return true;
}
//应用题8 调换次序
void Exchange(SqList &L, int m, int n)
{
int *temp;
temp=(int *)malloc(sizeof(int)*m);
for(int i=0;i<m;i++)
{
temp[i]=L.data[i+1];
}
for(int i=1;i<=n;i++)
{
L.data[i]=L.data[i+m];
}
for(int i=1;i<=m;i++)
{
L.data[i+n]=temp[i-1];
}
}
//应用题9
void SearchExchangeInsert(SqList &L,ElemType e)
{
int l=1,r=L.length;
int mid;
while(l<r)
{
mid=(l+r)/2;
if(L.data[mid]<e)
{
l=mid+1;
}
else
r=mid;
}
if(L.data[mid]==e)
{
swap(L.data[mid],L.data[L.length]);
L.length--;
}
else
{
ListInsert(L,mid,e);
}
}
int main()
{
return 0;
}
版权声明:本文为Eknight123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。