C++顺序表操作代码演示
/*
*建立一个顺序表,插入n个元素并输出
*Author :CplusHua PurpleHua
*Date:2012-10-06
*/
#include<iostream>
#include "malloc.h"
#include <stdio.h>
#define ElemType int //宏定义
#define LIST_INT_SIZE 10 //改为1,改用ListInsert增加空间
using namespace std;
//定义一个顺序表
struct SqList{
ElemType * elem;
int length;
int listsize;
}L={NULL,0,0};
//返回状态定义
//这里修改了课本里的宏定义,全部在一个enum中定义完毕,
//让所有的函数返回一个枚举类型的结果
enum Status
{
OK,FAILED,EMPTY,NOTINIT,OVERFLOW1//OVERFLOW在visual studio无法使用,改为OVERFLOW1
};
//初始化一个顺序表,成功返回OK,n是申请空间的大小
Status InitList_Sq(SqList &L,int n=LIST_INT_SIZE)
{
if(L.elem) free(L.elem);//如果已经建立顺序表,则释放重新建立
if(0==n)return FAILED;
L.elem=(ElemType *)malloc(n*sizeof(ElemType));//为指针申请空间
if(!L.elem) exit(OVERFLOW1);
L.length=0;
L.listsize=n;
return OK;
}
//在线性表第i个元素之前插入一个元素
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{//如果LIST_INT_SIZE设置为100,则在此加入判断,L.lisesize>100时增加空间
if(L.length<=0||i<=0)return FAILED;//空表,返回失败
if(!L.elem) return NOTINIT;//顺序表未初始化
if(i>L.length) return OVERFLOW1;//溢出,返回溢出(输入越界)
if(L.length>=L.listsize)
{
//每插入一个元素重新申请增加空间
ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+1)*sizeof(ElemType));
L.elem=newbase;
L.listsize++;
}
int *p,*q;
p=L.elem+L.length;//最后一个位置
q=L.elem+i-1;//要插入元素的位置
for(;p>q;p--)
*p=*(p-1);
*q=e;
L.length++;
return OK;
}
//删除顺序表中的元素
Status ListDelete_Sq(SqList &L,int i,ElemType *e=0)
{
if(L.length<0||i>L.length||i<=0) return FAILED;
if(!L.elem) return NOTINIT;//顺序表未初始化
if(0==L.length) return EMPTY;
int *p;
p=L.elem+i-1;//定位到要删除的元素位置
if(e)
*e=*p;//返回要删除元素的值
for(;p<=L.elem+L.length;p++)
{
*p=*(p+1);
}
L.length--;
return OK;
}
//要输入元素的线性表L,要输入的元素个数n
Status ListInput_Sq(SqList &L,int n)
{
int *p=L.elem;
for(int i=0;i<n;i++)
{
cin>>*(p++);
L.length++;
}
return OK;
}
//顺序输出顺序表中的元素
Status ListOutput_Sq(SqList &L)
{
if(!L.elem) return NOTINIT;//顺序表未初始化
int *p;
p=L.elem;
cout<<"顺序表中的元素为:";
for(int i=0;i<L.length;i++)
{
cout<<*(p++)<<" ";
}
cout<<endl;
return OK;
}
//查找最大元素
Status ListMax_Sq(SqList &L,ElemType *e)
{
if(!L.elem) return NOTINIT;//顺序表未初始化
int max;
int *p;
p=L.elem;
max=*p;
for(int i=0;i<L.length;i++)
{
if(max<*p)
max=*p;
p++;//最后溢出了会怎样?
}
*e=max;
return OK;
}
//升序排序
Status ListSort_Sq(SqList &L)
{
if(!L.elem) return NOTINIT;//顺序表未初始化
int tmp;
int i,j;
int *p;
p=L.elem;
for(i=0;i<L.length-1;i++)
{
for(j=0;j<L.length-i-1;j++)
{
if(*(p+j)>*(p+j+1))
{
tmp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=tmp;
}
}
}
return OK;
}
//逆序(使用一个暂存空间)
Status ListRevorder_Sq(SqList &L)
{
if(!L.elem) return NOTINIT;//顺序表未初始化
int tmp;
int *p;
p=L.elem;
for(int i=0;i<L.length/2;i++)
{
tmp=*(p+i);
*(p+i)=*(p+L.length-i-1);
*(p+L.length-i-1)=tmp;
}
return OK;
}
//逆序(不使用暂存空间)
Status ListRevorder1_Sq(SqList &L)
{
if(!L.elem) return NOTINIT;//顺序表未初始化
int *p;
p=L.elem;
for(int i=0;i<L.length/2;i++)
{
*(p+i)=(*(p+L.length-i-1))^(*(p+i));
*(p+L.length-i-1)=(*(p+L.length-i-1))^(*(p+i));
*(p+i)=(*(p+L.length-i-1))^(*(p+i));
}
return OK;
}
//主函数
int main()
{
int opt;
// SqList L;
// L.elem=NULL;//初始化
int i,res,e,n;
n=0;
while(1)
{
if(n)
{
while(getchar()!='\n'&&getchar()!=' ');
while(getchar()!='\n'&&getchar()!=' ');
}
cout<<"************请输入您要进行的操作的编号************"<<endl<<endl;
cout<<"1.建立一个顺序表,输入n个数字元素并输出"<<endl;
cout<<"2.查找线性表中的最大元素并输出"<<endl;
cout<<"3.在线性表的第i个元素前插入一个正整数x"<<endl;
cout<<"4.删除线性表中的第j个元素"<<endl;
cout<<"5.将线性表中的元素按升序排列"<<endl;
cout<<"6.将线性表中的元素就地逆序(只允许用一个暂存单元)"<<endl;
cout<<"7.将线性表中的元素就地逆序(不使用暂存单元)"<<endl;
cout<<"8.退出"<<endl<<endl;
cout<<"***************************************************"<<endl;
cin>>opt;
switch (opt)
{
case 1:
cout<<"***************请输入要输入元素的个数**************"<<endl;
cin>>n;
InitList_Sq(L,n);//建立顺序表
cout<<"*****************请输入线性表元素******************"<<endl;
ListInput_Sq(L,n);//进入输入元素的函数
ListOutput_Sq(L);//输出顺序表中的元素
break;
case 2:
if(!L.elem)
{
cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
break;
}
ListMax_Sq(L,&e);
cout<<"最大元素为:"<<e<<endl;
break;
case 3:
if(!L.elem)
{
cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
break;
}
cout<<"请分别输入要插入的元素和要插入元素的位置"<<endl;
cout<<"元素:";
cin>>e;
cout<<"位置:";
cin>>i;
ListInsert_Sq(L,i,e);
ListOutput_Sq(L);//输出顺序表中的元素
break;
case 4:
if(!L.elem)
{
cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
break;
}
cout<<"请输入要删除的元素的位置"<<endl;
cin>>i;//位置
ListDelete_Sq(L,i,&res);
cout<<"删除的元素为:"<<res<<endl;
ListOutput_Sq(L);//输出顺序表中的元素
break;
case 5:
if(!L.elem)
{
cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
break;
}
ListSort_Sq(L);//升序排序
ListOutput_Sq(L);//输出顺序表中的元素
break;
case 6:
if(!L.elem)
{
cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
break;
}
ListRevorder_Sq(L);//使用一个暂存空间逆序
ListOutput_Sq(L);//输出顺序表中的元素
break;
case 7:
if(!L.elem)
{
cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
break;
}
ListRevorder1_Sq(L);//不使用暂存空间逆序
ListOutput_Sq(L);//输出顺序表中的元素
break;
case 8:
return 0;
default:
cout<<"ERROR"<<endl;
}
}
return 0;
}
