线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
这里用C语言的一位数组来实现顺序存储结构。
·
线性表的数据对象集合为{a1,a2,a3......an},每个元素的类型均为一样的。其实,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个后继元素。数据元素之间的关系是一对一的关系。
Operation
InitList(*L); 初始化操作
ListEmpty(L);若线性表为空,返回true,否则返回false
ClearList(*L);将线性表清空
GetElem(L,i,*e);将线性表L中的第i个位置元素值返回给e
LocateElem(L,e);在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败
ListInsert(*L,i,e);在线性表L中的第i个位置插入新元素e
ListDelete(*L,i,*e);删除线性表L中的第i个元素,并用e返回其值
OutputList(L);输出线性表的内容
具体代码如下:
#include <stdio.h>
#define MAXSIZE 50
int i;
typedef struct//定义顺序存储结构体
{
char data[MAXSIZE];
int length;
}List;
void InitList(List *P)//初始化空表
{
int n;
for(i=0;i<P->length;i++)//初始化所有内容为\0
P->data[i] = '\0';
P->length = 0;
printf("请输入存入字符的个数:");
scanf("%d",&n);
getchar();//接收一个字符防止回车对内容的影响
printf("请输入内容:");
for(i=0;i<n;i++)
{
scanf("%c",&P->data[i]);
P->length++;
}
printf("存入完毕!\n\n");
}
int ListEmpty(List L)//空表返回0,非空表返回1
{
if(L.length == 0)//空表
return 0;
else
return 1;
}
void ClearList(List *P)//清空线性表
{
for(i=0;i<P->length;i++)
P->data[i] = '\0';
P->length=0;
printf("线性表已清空!\n\n");
}
char GetElem(List L,int x,char e)//得到第x个位置的元素并赋值给e返回
{
if(x<1 || x>L.length)//查找的位置超出范围
{
printf("位置异常!\n\n");
return 0;
}
else
{
e = L.data[x-1];
return e;
}
}
int LocateElem(List L,char e)
{
for(i=0;i<L.length;i++)//查找e的位置
if(L.data[i] == e)
return i+1;
return 0;
}
int ListInsert(List *P,int x,char e)//删除位置x上的数据,成功返回1,失败返回0
{
printf("在第%d个位置插入%c\n",x,e);
if(P->length == MAXSIZE)//表满了
{
printf("线性表已满,插入失败!\n");
return 0;
}
if(x<1 || x>P->length+1)//超出范围,超出最后一位异常才是异常
{
printf("插入位置异常,插入失败!\n");
return 0;
}
if(x <= P->length)//插入位置不再尾部
{
for(i=P->length-1;i>=x-1;i--)
P->data[i+1] = P->data[i];
P->data[x-1] = e;
P->length++;
printf("插入成功!\n");
return 1;
}
if(x == P->length+1)//插入位置在尾部
{
P->data[x] = e;
P->length++;
printf("插入成功!\n\n");
return 1;
}
}
char ListDelete(List *P,int x,char e)//删除位置x上的数据,成功返回e,失败返回0
{
printf("删除第%d位置上的数据\n",x);
if(P->length == 0)//空表
{
printf("线性表为空表,删除失败!\n");
return 0;
}
if(x<1 || x>P->length)//范围异常
{
printf("删除位置异常,删除失败!\n");
return 0;
}
if(x < P->length)//删除位置不是尾部
{
e = P->data[x-1];
for(i=x;i<P->length;i++)
P->data[i-1] = P->data[i];
P->data[P->length-1] = '\0';
P->length--;
printf("删除成功!\n");
return e;
}
if(x == P->length)//删除位置在尾部
{
e = P->data[x-1];
P->data[x-1] = '\0';
P->length--;
printf("删除成功!\n\n");
return e;
}
}
void OutputList(List L)//输出线性表中内容
{
if(L.length == 0)
printf("线性表中没有内容,为空表!");
else
{
printf("线性表内容如下:\n");
for(i=0;i<L.length;i++)
printf("%c",L.data[i]);
printf("\n\n");
}
}
int main()
{
List L;
InitList(&L);//测试初始化
if(ListEmpty(L))
printf("线性表非空!\n\n");
else printf("线性表为空!\n\n");
OutputList(L);
char E;
printf("请输入查找的位置:");//测试按位置查找
scanf("%d",&i);
E = GetElem(L,i,E);
if(E != 0)
printf("第%d个位置上是:%c\n\n",i,E);
printf("请输入要查找的元素:");//测试按元素查找
getchar();
scanf("%c",&E);
i = LocateElem(L,E);
if(i)
printf("%c在线性表中的位置是:%d\n\n",E,i);
else printf("没有在线性表中找到%c\n\n",E);
printf("请输入插入字符:");//测试插入
getchar();
scanf("%c",&E);
printf("请输入插入的位置:");
scanf("%d",&i);
ListInsert(&L,i,E);
OutputList(L);
int j;
printf("请输入删除的元素位置:");//测试删除
scanf("%d",&j);
E = ListDelete(&L,j,E);
if(E != 0)
printf("线性表第%d个位置的%c已删除!\n\n",j,E);
OutputList(L);
ClearList(&L);//测试清空
if(ListEmpty(L))
printf("线性表非空!\n\n");
else printf("线性表为空!\n\n");
OutputList(L);
return 0;
}