// 顺序表的创建以及增删改函数的实现.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<process.h>
using namespace std;
void ErrorMessage() //出错信息处理函数
{
cout<<"对不起,您输入的值不符,请重新运程序"<<endl;
exit(1);
}
const int LIST_INIT_SIZE=100; //初始分配最大空间
const int LISTINCREMANT=10; //增补空间量
struct SqList{
int *elem; //存储数据元素的一维数组
int length; //长度线性表的当前
int listsize; //当前分配的数组容量
int incrementsize; //约定的增补空间量
};
void InitList_sq (SqList &L) //构造一个空线性表
{
L.elem=new int[LIST_INIT_SIZE]; //分配一个最大容量为100的空间
L.length=0; //当前元素个数为0
L.listsize=LIST_INIT_SIZE; //该顺序表可以容纳100个数据元素
L.incrementsize=LISTINCREMANT;//需要时每次可以扩充10个元素空间
}
int LocateElem_sq(SqList L,int e){ //查找元素操作
int i=1; //i的初值为第一个元素的位序
int *p=L.elem; //指针p指向线性表第一个元素的地址
while(i<=L.length && *p++!=e)++i;
if(i<=L.length) return i;
else return 0;
}
void increase(SqList &L) //顺序表追加空间
{
int *a;
a=new int[L.incrementsize+L.listsize]; //a为临时过渡的辅助数组
for(int i=0;i<L.length;i++)a[i]=L.elem[i]; //腾出原空间数据
delete[]L.elem; //释放数据元素所占原空间首L.elem
L.elem=a; //移交空间首地址
L.listsize+=L.incrementsize; //扩容后的顺序表的最大空间
}
void ListInsert_sq(SqList &L,int i,int e) //插入元素
{
if(i<1||i>L.length+1) ErrorMessage() ; //插入位置在第一个之前或是在最后加一之后则不合法
if(L.length>=L.listsize) increase(L); //若当前的存储空间已满,则增加分配空间
int *q=&(L.elem[i]); //指针q指向线性表第i-1个数
for(int *p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p; //插入位置及之后的元素又移一位
*q=e; //插入e
++L.length; //表长增加1
}
void DestroyList_sq(SqList &L) //销毁顺序表L所占空间
{
//释放顺序表L所占存储空间
delete[] L.elem;
L.listsize=0;
L.length=0;
}
void Listdelete_sq(SqList &L,int i,int &e) //删除元素操作
{
//在顺序表L中删除第i个元素,并用e返回其值
//i的合法值为1<=i<=L.length
if(i<1||i>L.length)ErrorMessage();
int *p=&(L.elem[i-1]);
e=*p;
int *q=L.elem+L.length-1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
}
int _tmain(int argc, _TCHAR* argv[])
{
SqList s;
InitList_sq(s);
int n;
cout<<"请输入线性表s的长度length:";
cin>>n;
cout<<"请输入线性表的"<<n<<"个数"<<endl;
for(int i=0;i<n;i++)
cin>>s.elem[i];
s.length=n;
//查找
int x;
cout<<"请输入你要查找的数值:";
cin>>x;
cout<<LocateElem_sq(s,x)<<endl;
//插入
int a,b;
cout<<"请分别输入要插入的位置和数:";
cin>>a;
cin>>b;
ListInsert_sq(s,a,b);
for(int i=0;i<n+1;i++ )
cout<<s.elem[i]<<" ";
cout<<endl;
increase(s);
cout<<"请输入要删除数的位置"<<endl;
int i,k;
cin>>i;
Listdelete_sq(s,i,k);
cout<<"你删除的数是"<<k<<endl;
DestroyList_sq(s);
return 0;
}