/**
------------------------------------------------
| 0无值 |1 |…………|length-1 |…………|MaxSize-1 |
------------------------------------------------
*/
#include <stdio.h>
#define MaxSize 100
#define NULL 0
typedef char Element;
typedef struct{
int length;
Element data[MaxSize];//_从data[0]到data[MaxSize-1]
}Sqlist;
int init(Sqlist& L)
{//初始化
L.length=0;
return 0;
}
int getLength(Sqlist L)
{//获取长度
return L.length;
}
int createSqlist(Sqlist &L,Element e[],int n)
{//创建初始元素
if(n<MaxSize)
{
for(int i=0;i<n;++i)
L.data[i+1]=e[i];
L.length=n;
}
return 0;
}
int insert(Sqlist& L,int p,char e)
{// 在位置p插入元素e
if(p<1||p>L.length+1||L.length==MaxSize-1)
{//这里,空出data[0],以方便位置操作,即让data[1]到data[length]为存储空间
//当到达上界或者不在存储范围内
return 0;
}
for(int i=L.length;i>=p;--i)
L.data[i+1]=L.data[i];
//从末尾元素开始,到原始p位置,向右移动,
//1并非从p开始因为会对原始元素覆盖
//2 并不会产生越界问题,因为条件限制了length+1始终要<MaxSize
//3 没有createList时,当第一次插入,而主函数没有给L.data 赋值,L.length=0 <p
L.data[i+1]=e;
//4 原来的代码是L.data[i]执行最后一个的时候,,如p=1,length=1时(i=1;i>=1;--i;)i=0
++(L.length);//插入元素之后,顺序表长度随之增加,但要始终保证length<MaxSize
return 1;
}
int del(Sqlist &L,int p)
{//按位置删除
Element e;
if(p<1||p>L.length)
{
return 0;
}
else
{
e=L.data[p];
//保护现场,别事后再赋值
// 1 其实不要这句也可以,可万一以后这东西有用呢,
// 要是再用本函数体内第一句声明的e要放在函数头的形参列表内
/* for(int i=L.length;i>=p;--i)
L.data[i]=L.data[i+1];
//这样,从p到length的都被L.data[length+1]覆盖掉,
//而L.length+1并未对应元素,因而出现I烫烫烫烫烫
*/
for(int i=p;i<L.length;++i)
L.data[i]=L.data[i+1];
--(L.length);
}
return 1;
}
int displaySqlist(Sqlist L)
{//输出顺序表
for(int i=1;i<L.length;++i)
printf("%c",L.data[i]);
printf("\n");
return 0;
}
int locateElement(Sqlist L,Element e)
{//定位首次出现元素e的位置,若顺序表中未出现该元素,返回表尾的下一位置
for(int i=1;i<L.length;++i)
{
if(e==L.data[i])
{
return i;
}
}
return i;//循环完成时,i=L.length,是当前顺序表表尾元素右边的第一个位置
}
int main()
{
/*
解决3 的方法一
Sqlist L;
init(L);//形参为引用型时,实参前不用再加引用符号
L.data[0]='d';
L.length=sizeof(L.data[1])/sizeof(char);
printf("%d",L.length);//1
insert(L,1,'b');
insert(L,2,'c');
printf("%d",L.length);//3
for(int i=1;i<L.length;i++)
printf("%c",L.data[i]);//bc
*/
/*解决3的方法二*/
Sqlist L;
init(L);
Element e[]={"Chinese"};
createSqlist(L,e,sizeof(e));
displaySqlist(L);
insert(L,1,'I');
insert(L,2,'\'');
insert(L,3,'m');
insert(L,4,' ');
insert(L,5,' ');
insert(L,5,'a');
displaySqlist(L);
del(L,2);
displaySqlist(L);
int index;
index=locateElement(L,'a');
printf("%d\n",index);
return 0;
}