一、主要操作
Initlist(Sqlist* L)// 初始化
AddSize(Sqlist* L, int len)//线性表增加len个长度
ListInsert(Sqlist* L, int i, char e)//插入元素
GetList(Sqlist L, int i)//按位查找
GetList1(Sqlist L, char e)//按值查找
DeleteList(Sqlist *L,int i)//删除元素
outlist(Sqlist* L)//输出顺序表
ListEmpty(Sqlist L)//判线性表是否为空表
FreeList(Sqlist *L)//释放顺序表
二、实现过程
//Written by Z_bin
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define InitSize 5 //顺序表初始长度
typedef struct
{
char* data; //存放数据
int MaxSize;//最大长度
int length; //当前长度
}Sqlist;
//顺序表初始化
void InitList(Sqlist *L)
{
(*L).data = (char *)malloc(InitSize*sizeof(char));
L->length = 0;
// for(int i = 0;i<InitSize;i++)
// {
// L->data[i] = 0;//所有元素初始化为0
// L->length++;
// }
L->MaxSize = InitSize;
}
//增加表长
void AddList(Sqlist *L,int len)
{
char *p = L->data;
L->data=(char *)malloc((L->MaxSize+len)*sizeof(char));
for(int i = 0;i < L->length;i++)
{
L->data[i] = p[i];
}
L->MaxSize += len;
free(p);
}
//1).将已存在的数据先备份;
//2).用malloc()开辟出新的空间
//3).将备份的数据存回新空间中,同时增加新表的长度
//4).用free()释放备份的数据
//插入元素
void ListInsert(Sqlist *L,int i,char e)
{
if (i < 1 || i > L->MaxSize)
{
printf("插入失败,逻辑位序不对!\n");
return;
}
for(int j = L->length;j >= i;j--)
{
L->data[j] = L->data[j-1];
}
L->data[i-1] = e;
L->length++;
}
//1).对插入的位置进行判断;
//2).从最后一个元素开始向后移动一个位置,直到空出插入的位置停止移动;
//3).将要插入的元素存于该空位,同时表长+1;
//删除元素
void DeleteList(Sqlist *L,int i)
{
if (i < 1 || i > L->length)
{
printf("删除失败,逻辑位序不对!\n");
return;
}
for(int j = i;j < L->length;j++)
{
L->data[j-1] = L->data[j];
}
L->length--;
}
//1).对删除的位置进行判断;
//2).从要删除元素的后一个位置开始向前移动一个位置,直到最后位置向前移一位;
//3).同时表长+1;
//按位查找
char GetList(Sqlist L,int i)
{
return L.data[i-1];
}
//按值查找
int GetList1(Sqlist L,char e)
{
for(int i = 0;i < L.length;i++)
{
if(L.data[i] == e)
return i+1;
}
}
//判线性表是否为空表
void ListEmpty(Sqlist L)
{
if(L.length != 0) printf("非空表\n");
else printf("空表\n");
}
void OutList(Sqlist *L)
{
for(int i = 0;i < L->length;i++)
{
printf("%c ",L->data[i]);
}
}
//释放顺序表
void FreeList(Sqlist *L)
{
free((*L).data);
}
int main(void)
{
Sqlist L;
InitList(&L);
ListInsert(&L,1,'A');
ListInsert(&L,2,'B');
ListInsert(&L,3,'C');
ListInsert(&L,4,'D');
ListInsert(&L,5,'E');//插入ABCDE
OutList(&L);//遍历输出顺序表
printf("\n插入元素A,B,C,D,E后表长:%d\n",L.length);
ListEmpty(L);//判断顺序表是否为空
printf("第4个元素:%c\n",GetList(L,4));//输出顺序表的第4个元素
printf("元素B的位置:%d\n",GetList1(L,'B'));//输出元素B的位置
printf("第2个位置插入F:");
AddList(&L,1);//顺序表已达最大长度,增加一个长度,再插入‘F’
ListInsert(&L,2,'F');//在第2个元素位置插入元素F
OutList(&L);//遍历输出顺序表
printf("\n删除第4个元素:");
DeleteList(&L,4);//删除第4个元素
OutList(&L);//遍历输出顺序表
FreeList(&L);//释放顺序表
return 0;
}