//线性表之顺序表
//对顺序表的操作可以近似看成对有序数组的操作
#include <stdio.h>
#define MIXSIZE 100
#define OK 0
#define ERROR -1
typedef int ElemType; //注: 此处不能用#define int ElemType;
typedef int Status;
typedef struct
{
ElemType data[MIXSIZE]; //MIXSIZE 是数组的长度,data[]用来存放数据
int length; //线性表的长度
}Sqlist;
//初始化
//注:当对顺序表进行长度或值的改变时,应该用指针进行操作
void Initlist(Sqlist *L) //在对顺序表的初始化时,即对组成顺序表的元素:data[MIXSIZE],length进行初始化
{ //因为data[MIXSIZE]是一个数组,而且大小已经确定,即MIXSIZE,故不需要再对数组初始化
L->length = 0; //只需要对顺序表的长度进行初始化,即将length赋值为0
}
//插入算法的思路
// 1、首先判断插入的位置是否合理
// 2、然后判断顺序表的长度大于或等于数组的长度,则抛出异常或动态增加容量
// 3、从最后一个元素开始向前遍历至第index个位置,并将它们都向后移一个位置,将要插入的元素放在第index位
// 4、表长加1
Status Insert_list(Sqlist *L,int index,int num)
{
if(L->length == MIXSIZE || index < 1 || index > (L->length+1))
{
printf("此时插入的位置不合理\n");
return ERROR;
}
int i;
for(i = L->length; i >= index; i--)
{
L->data[i+1] = L->data[i];
}
L->data[index] = num;
L->length++;
return OK;
}
//获得顺序表中某个位置的元素
//思路;
//1、判断要获得的元素位置是否在顺序表中
//2、直接返回要获得的元素
Status Getelem(Sqlist L,int index)
{
if(index > L.length)
{
printf("要获取元素的位置不存在\n");
return ERROR;
}
printf("第%d位的元素为%d\n",index,L.data[index]);
return OK;
}
//删除操作
//思路:
// 1、如果删除位置不合理,则发出警告
// 2、取出删除元素
// 3、从删除元素位置开始遍历到最后一个元素,并将它们都向前移一个位置
// 4、顺序表的长度减一
Status Delete_list(Sqlist *L,int index)
{
if(0 == L->length)
{
printf("线性表为空\n");
return ERROR;
}
if(index > L->length)
{
printf("要删除元素的位置不合理\n");
return ERROR;
}
//Getelem(L,index);
printf("被删除的元素为:%d\n",L->data[index]);
int i;
for(i = index; i < L->length; i++)
{
L->data[i] = L->data[i+1];
}
L->length--;
return OK;
}
//输出顺序表
void Print(Sqlist L)
{
int i;
printf("下面便是顺序表中的内容\n");
for(i = 1; i <= L.length; i++)
{
printf("%d ",L.data[i]);
}
printf("\n");
}
int main()
{
Sqlist L;
//ElemType e;
Initlist(&L);
printf("初始化后长度为:%d\n",L.length);
//插入
Insert_list(&L,1,1);
printf("初始化第一个数据后长度为:%d\n",L.length);
Print(L);
Insert_list(&L,2,6);
printf("初始化第二个数据后长度为:%d\n",L.length);
Print(L);
Insert_list(&L,3,9);
printf("初始化第三个数据后长度为:%d\n",L.length);
Print(L);
Delete_list(&L,1);
printf("删除第1个数据后长度为:%d\n",L.length);
Print(L);
Getelem(L,1);
return 0;
}
//输出:
初始化后长度为:0
初始化第一个数据后长度为:1
下面便是顺序表中的内容
1
初始化第二个数据后长度为:2
下面便是顺序表中的内容
1 6
初始化第三个数据后长度为:3
下面便是顺序表中的内容
1 6 9
被删除的元素为:1
删除第1个数据后长度为:2
下面便是顺序表中的内容
6 9
第1位的元素为6