#include <iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
int OK=1;
int OVERFLOW=0;
int ERROR=0;
/*线性表的定义*/
typedef struct
{
char *elem;
int length;//当前长度
int listsize;//线性表的长度
}SqList;
/*线性表的初始化*/
int Initlist(SqList &L)
{
L.elem=(char *)malloc(LIST_INIT_SIZE*sizeof(char));//或者可以写成:L.elem=new char[LIST_INIT_SIZE];
if(!L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
/*插入*/
int ListInsert_Sq(SqList &L,int i,char e)
{
/*特殊情况的处理*/
if(i<1||i>L.length)
return ERROR;
char * newbase;
char * p,* q;
if(L.length>=L.listsize)
{
newbase=(char *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(char));
if(!newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
/*插入操作*/
q=&(L.elem[i-1]);//q为第i个元素的位置
for(p=&(L.elem[L.length-1]); p>=q; p--)
*(p+1)=*p;//i-1之后的元素依次后移一位
*q=e;
L.length++;
return OK;
}
/*删除*/
int ListDelete_Sq(SqList &L,int i,char &e)
{
char * p;
char * 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=*(p+1);
}//i之后的元素依次左移
L.length--;
return OK;
}
/*确定表中元素位置*/
int LocateElem_Sq(SqList L, char x)
{
int i;
char *p;
i=1;
p=L.elem;
while(i<=L.length && *p++!=x)//必须的控制p不能无限制的加下去,所以得有i来限制,并且用i来返回位置
i++;
if(i>L.length)
return 0;
else
return i;
}
void main()
{
SqList L;
Initlist(L);
int i;
for(i=0;i<10;i++)
{
cin>>L.elem[i];
L.length++;
}
ListInsert_Sq(L,2,'a');//插入
for(i=0;i<L.length;i++)
{
cout<<L.elem[i]<<" ";
}
cout<<endl;
char e;
ListDelete_Sq(L,5,e);//删除
for(i=0;i<L.length;i++)
{
cout<<L.elem[i]<<" ";
}
cout<<endl;
cout<<LocateElem_Sq(L,'3')<<endl;//输出字符'3'在线性表的位置,该功能是顺序线性表的主要优点
}