数据结构的生活开始啦!先来张顺序表吧!
时刻纪念我的学习小森活!
#include <iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status ;
typedef int ElemType;
#define ListMaxSize 100
typedef struct {
ElemType *elem ;
int length ;
int listsize;
} SqList ;
int InitListSq(SqList &L);
Status GetListSq(SqList L, int i, ElemType &e);
int LocateListSq(SqList L, ElemType e);
Status InsertListSq(SqList &L, int i, ElemType e);
Status DeleteListSq(SqList &L, int i, ElemType &e);
void TraverseListSq(SqList L);
int LengthListSq(SqList L);
Status EmptyListSq(SqList L);
void ClearListSq(SqList &L);
void DestroyListSq(SqList &L);
int compare(int a,int b);
Status DeleteESq(SqList &L,ElemType &e);
int InitListSq(SqList &L)
{
L.elem=new ElemType[ListMaxSize];
if (!L.elem ) return OVERFLOW;
L.length = 0 ;
L.listsize=ListMaxSize;
return OK;
}
Status GetListSq(SqList L, int i, ElemType &e)
{
if (i < 1 || i > L.length) return ERROR ;
e = *(L.elem + i - 1) ;
return OK ;
}
int LocateListSq(SqList L, ElemType e)
{
int i ;
ElemType *p ;
i = 1 ;
p = L.elem ;
while (i <= L.length && *p++ != e) i++ ;
if (i <= L.length) return i ;
else return 0 ;
}
Status InsertListSq(SqList &L, int i, ElemType e)
{
ElemType *p, *q ;
if (i < 1 || i > L.length + 1) return ERROR ;
if (L.length >= L.listsize) return OVERFLOW ;
q = L.elem + i - 1 ;
for(p = L.elem + L.length - 1; p >= q; p --) *(p + 1) = *p ;
*q = e ;
L.length ++ ;
return OK ;
}
Status DeleteListSq(SqList &L, int i, ElemType &e)
{
ElemType *p, *q ;
if (i < 1 || i > L.length) return ERROR ;
p = L.elem + i - 1 ;
e = *p ;
q = L.elem + L.length - 1 ;
for (++ p; p <= q; p ++) *(p - 1) = *p ;
L.length -- ;
return OK ;
}
void TraverseListSq(SqList L)
{
ElemType *p ;
p = L.elem ;
while(p <= L.elem + L.length - 1)
cout << *p++ << " " ;
cout << endl ;
}
int LengthListSq(SqList L)
{
return L.length ;
}
Status EmptyListSq(SqList L)
{
return L.length==0;
}
void ClearListSq(SqList &L)
{
L.length=0;
}
void DestroyListSq(SqList &L)
{
L.length=L.listsize=0;
delete [] L.elem;
L.elem==NULL;
}
void InverseListSq(SqList &L)
{
ElemType *p, *q, temp ;
for (p = L.elem, q = L.elem + L.length - 1; p < q; p ++,q --){
temp = *p ;
*p = *q ;
*q = temp ;
}
}
void Inverse(SqList &L, int start, int end)
{
int i, j;
ElemType temp;
for(i=start,j=end; i<j; i++,j--)
{
temp = L.elem[i-1];
L.elem[i-1] = L.elem[j-1];
L.elem[j-1] = temp;
}
}
void CycMoveListSq(SqList &L, int m)
{
if (m < 0)
{
cout << "输入的左移位个数错误!" << endl;
return;
}
if (L.length <= 1) return;
m %= L.length;
Inverse(L, 1, L.length);
Inverse(L, 1, L.length-m);
Inverse(L, L.length-m+1, L.length);
}
void SortListSq(SqList &L)
{
int i, j, k ;
ElemType temp ;
for (i = 0; i < L.length - 1; i++){
k = i ;
for (j = i + 1; j < L.length; j++)
if (*(L.elem + k) > *(L.elem+j)) k = j;
if (k != i) {
temp = *(L.elem + i) ;
*(L.elem + i) = *(L.elem + k) ;
*(L.elem + k) = temp ;
}
}
}
int compare(int a,int b){
if(a!=b)
return 0;
return 1;
}
Status DeleteESq(SqList &L,ElemType &e)
{
int *n,*m,*p;
int count=0;
for(int i=0;i<L.length;i++){
if (L.elem[i]==e)
count++;
}
while(count--!=0){
int i=0;
p=L.elem;
while(i<L.length && !compare(*p++,e))
i++;
m=&(L.elem[i]);
n=L.elem+L.length-1;
for(m;m<n;++m)
*m=*(m+1);
--L.length;
}
return OK;
}
void Josephus(SqList &L, int n,int m,int s)
{
L.length=n;
for(int i=0;i<n;i++)
L.elem[i]=i+1;
cout<<"圆桌初始状态:"<<endl;
TraverseListSq(L) ;
int len=n;
int p=(s-1)%len;
while(len>1)
{
p=(p+m-1)%len;
int t=L.elem[p];
for(int i=p+1;i<len;i++)
L.elem[i-1]=L.elem[i];
L.elem[len-1]=t;
len--;
}
InverseListSq(L);
cout<<"离开圆桌的顺序为:"<<endl;
TraverseListSq(L) ;
}
int main(void){
int i, n, m, s ;
ElemType e ;
SqList L ;
if(InitListSq(L)==OK) cout<<"顺序表初始化成功!"<<endl ;
else {
cout<<"顺序表初始化失败!,程序将退出。"<<endl ;
return 0;
}
cout << "请输入要创建的顺序表长度:";
cin >> n;
cout << "请输入要创建的顺序表数据:\n";
for (i=1; i<=n; i++){
cin>>e ;
InsertListSq(L, i, e) ;
}
cout << "\n创建后的顺序表为:\n";
TraverseListSq(L) ;
cout << "请输入要删除的元素位置:";
cin >> i;
if (DeleteListSq(L, i, e))
{
cout << "被删除的元素为:"<< e << endl;
cout << "删除元素后的顺序表为:\n";
TraverseListSq(L) ;
}
else
cout << "删除的元素位置错误!\n";
cout << "请输入要插入的元素位置:";
cin >> i;
cout << "请输入要插入的元素值:";
cin>>e;
switch(InsertListSq(L, i, e))
{
case OK:
cout << "插入元素后的顺序表为:\n";
TraverseListSq(L) ;
break;
case ERROR:
cout << "插入的元素位置错误!\n";
break;
case OVERFLOW:
cout << "顺序表已满,无法插入元素!\n";
break;
}
cout << "请输入要取得的元素位序:";
cin >> i;
if (GetListSq(L, i, e))
{
cout << "取得的元素为:"<< e << endl;
}
else
cout << "元素位序错误!\n";
cout << "请输入要查找的元素值:";
cin >> e;
n = LocateListSq(L, e);
if (n != 0)
cout << "查找成功!查找到的位置为" << n << endl ;
else
cout << "查找失败!\n";
cout << "排序前顺序表为:\n";
TraverseListSq(L) ;
SortListSq(L) ;
cout << "排序后顺序表为:\n";
TraverseListSq(L) ;
InverseListSq(L) ;
cout << "逆置后顺序表为:\n";
TraverseListSq(L) ;
cout<<"请输入向左循环移位的个数:";
cin>>n;
CycMoveListSq(L, n);
cout << "向左循环移位"<<n<<"个元素后顺序表为:\n";
TraverseListSq(L) ;
cout<<"输入圆桌人数(n):";cin>>n;
cout<<"输入开始报数位置(s):";cin>>s;
cout<<"输入报到几的人离开(m):";cin>>m;
Josephus(L, n, m, s);
DestroyListSq(L);
}