一.准备工作做好:
对于需要建构顺序线性表的必备变量和结构体
- 状态量
- 内存大小量、内存增加量
- 重定义整形(int)类型变量
#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
#define LIST_INIT_SIZE 10
#define LIST_INCREAMENT 10
#define ERROR -2
#define OK 1
#define TRUE 1
#define FLASE 0
#define OVERFLOW -1
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType *elem;
int length;
int Listsize;
}Sqlist;
二、构建初始化函数
- 分配空间(void×)malloc(LIST_INIT_SISE * sizeof(ElemType))
- 对于内存是否分配成功的容错性检查(特殊返回值)
- 对于线性表空表的长度进行初始化为0
- 定义内存大小(方便以后比较是否需要扩容)
Status InitList(Sqlist &L)
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem)
{
printf("硬盘存储空间有限,无法开辟空间\n");
return ERROR;
}
L.length = 0;
L.Listsize = LIST_INIT_SIZE;//对于内存大小不纠结于字节数,而是能存储的元素个数
return OK;
}
三、对线性表进行初值填充
1.判断当前的存储空间是否大于赋值的空间(内存大小判断检查)
(2. 新开辟空间容错性检查
(2. 循环赋值
- 对线性表的长度赋值
Status ValueList(Sqlist &L)
{
int i,j;
printf("请输入线性表表单个数:");
scanf("%d",&i);
if(i > L.Listsize)//输入表单数,大于开辟内存大小时
{
while(1)//开辟空间直到大于需要的范围为止
{
if(i > L.Listsize)
{
L.elem = (ElemType *)realloc(L.elem,LIST_INCREAMENT*sizeof(ElemType));
L.Listsize += LIST_INCREAMENT;
}
else break;
}
}
for(j = 0 ;j < i; j++)
scanf("%d",&L.elem[i]);
L.length = i;//表单长度进行赋值,保存
printf("赋值成功!!!\n");
return OK;
}
三、重置空表
空表的定义:线性表中元素个数n(n>=0)定义为线性表的长度,n = 0时称为空表。
- 空表时指针存在,线性表个数归零。
Status ClearList(Sqlist &L)
{
if(L.elem)
{
L.length = 0;
printf("线性表重置成功!!!\n");
return OK;
}
else
printf("重置失败,线性表不存在!!!\n");
return FLASE;
}
##四、判断空表
1. 空表时指针存在,判断线性表个数是否为零。
Status ListEmpty(Sqlist L)
{
if(L.elem)
{
if(L.length == 0){printf("此表为空表!!!\n"); return TRUE;}
printf("此表不为空表!!!\n");
return FLASE;
}
else
printf("判断失败,线性表不存在!!!\n");
return ERROR;
}
五、线性表长度
- 直接返回值L.length
Status ListLength(Sqlist L)
{
printf("%d",L.length);
return OK;
}
六、获取线性表元素
- 确定传输参数类型
- 判断获取的索引号是否出边界
Status GetElem(Sqlist L ,int index )
{
int e;
if(index < 1 || index > L.length)
{
printf("获取值失败!!!索引超出边界。\n");
return ERROR;
}
e = L.elem[index];
return e;
}
七、查找线性表元素
- 遍历元素,找到输出返回
- 找不到,返回ERROR。
Status Search(Sqlist L,ElemType e)
{
int j = 0;
for(;j < L.length; j++)
{
if(L.elem[j] == e)
{
printf("找到索引元素!!!其编号是%d号\n",j+1);
return j+1;
}
else
printf("未找到元素!!!\n");
return FLASE;
}
return OK;
}
八、删除线性表元素
- 判断删除索引是否大于线性表最大元素索引
- 找到指定位置,向前一位赋值。
Status DeleteList(Sqlist &L,int index)
{
if(index < 1 || index > L.length)
{
printf("删除失败!!!索引超出边界。\n");
return ERROR;
}
else
{
int j = index- 1;
for(; j >= L.length-1 ; j++)
L.elem[j+1] = L.elem[j];
L.length--;
return OK;
}
}
九、插入线性表
- 插入值的范围[ 1 ~ L.length+1 ] (在每一位的前面插入元素)
- 判断是否出了索引边界
Status DeleteList(Sqlist &L,int index)
{
if(index < 1 || index > L.length)
{
printf("删除失败!!!索引超出边界。\n");
return ERROR;
}
else
{
int j = index- 1;
for(; j >= L.length-1 ; j++)
L.elem[j+1] = L.elem[j];
L.length--;
return OK;
}
}
十、主菜单
int main()
{
Sqlist L;
int e = 0,index;
while(1)
{
printf("1.初始化线性表,开辟空间\n");
printf("2.对线性表进行赋值\n");
printf("3.对线性表进行重置\n");
printf("4.判断线性表是否为空表\n");
printf("5.获取线性表长度\n");
printf("6.获取线性表对应元素\n");
printf("7.查找线性表对应元素\n");
printf("8.删除线性表对应元素\n");
printf("9.插入线性表\n");
printf("10. 打印\n");
printf("11. 退出\n");
int x;
scanf("%d",&x);
switch(x)
{
case 1: InitList(L); break;
case 2: ValueList(L); break;
case 3: ClearList(L); break;
case 4: ListEmpty(L); break;
case 5: ListLength(L); break;
case 6:
{
printf("请输入想要查找元素的索引号:\n");
scanf("%d",&index);
GetElem(L,index);
}break;
case 7:
{
printf("请输入想要查找的元素:\n");
scanf("%d",&e);
Search(L,e);
}break;
case 8:
{
printf(" 请输入删除元素的索引号:\n");
scanf("%d",&index);
DeleteList(L,index);
}break;
case 9:
{
printf("请输入插入元素的位置索引号:\n");
scanf("%d",&index);
printf("请输入想要插入的元素:\n");
scanf("%d",&e);
InsertList(L,index,e);
}break;
case 10: PrintList(L);
case 11: exit(0);
}
}
return 0;
}