一、顺序表概述
所谓的顺序,指的是线性结构的顺序存储。
所谓的顺序表,指的是采用连续存储空间存储数据元素,类似于C语言中的数组,可以通过存储空间的序号表示线性表中元素的关系。
二、顺序表的操作
顺序表的操作主要为增、删、改、查等,主要操作如下:
环境:Linux系统下
定义和创建:
common.h
#ifndef _COMMON_H_
#define _COMMON_H_
typedef int data_t;//定义数据的类型为int型
#define MAXN 10
typedef struct sqlist{
data_t data[MAXN];//构建顺序表的数据记录存储空间
int last;//顺序表中数据存储从序号为0位置开始存储,最后一条数据记录的存储位置使用last表示
} sqlist_t;
sqlist_t *CreateSqList(void);//创建
int InsertSqList(sqlist_t *list, int local, data_t mydata);//插入
void DisplaySqList(sqlist_t *list);//遍历
int DeleteSqList(sqlist_t *list, int local);//删除
int SearchSqList(sqlist_t *list,int local, data_t *mydata);//查询
int ChangeSqList(sqlist_t *list,int local, data_t mydata);//修改
void ClearSqList(sqlist_t *list);
void DestorySqList(sqlist_t **list);
int isFullSqList(sqlist_t *list);
int isEmptySqList(sqlist_t *list);
#endif
具体函数的实现如下:
sqlist.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "common.h"
//创建顺序表
sqlist_t *CreateSqList(void)
{
sqlist_t *list;//创建顺序表list
list = malloc(sizeof(sqlist_t));//分配空间
if(list == NULL)//判断表是否为空
return NULL;
memset(list,0,sizeof(sqlist_t));//初始化表
list->last = -1;
return list;
}
//向顺序表中插入元素
int InsertSqList(sqlist_t *list, int local, data_t mydata)
{
//没有表
if(list == NULL)
{
return -1;
}
//表满
if(list->last == MAXN-1)
{
return -1;
}
//表插入的位置不满足
if(local<0 || local>list->last+1)
{
return -1;
}
//找到要插入的位置,将插入位置后面的元素向后移,插入元素
for(int i = list->last;i>=local;i--)
{
list->data[i+1]=list->data[i];
}
list->data[local] = mydata;
list->last++;
return 0;
}
//遍历顺序表
void DisplaySqList(sqlist_t *list)
{
//没有表
if(list == NULL)
return -1;
//遍历表,打印数据
for(int i=0; i<list->last; i++)
printf("%d",list->data[i]);
printf("\n");
}
//删除顺序表中的某个元素
int DeleteSqList(sqlist_t *list, int local)
{
//没有表
if(list == NULL)
return -1;
//表为空,无法删除
if(list->last == -1)
{
return -1;
}
//删除位置不满足
if(local<0 || local>list->last)
return -1;
//删除位置后面的元素向前移,覆盖删除的位置
for(int i=local;i<list->last;i++)
list->data[i] = list->data[i+1];
list->last--;
return 0;
}
//查找顺序表中的某个元素
int SearchSqList(sqlist_t *list,int local, data_t *mydata)
{
//表为空,没有表
if(list == NULL)
return -1;
//表为空
if(list->last == -1)
return -1;
//没有在满足要求的位置
if(local<0 || local>list->last)
return -1;
*mydata = list->data[local];
return 0;
}
//修改顺序表中的某个元素
int ChangeSqList(sqlist_t *list,int local, data_t mydata)
{
//没有表
if(list == NULL)
return -1;
//表中没有元素
if(list->last == -1)
return -1;
//不满足要求的位置
if(local<0 || local>list->last)
return -1;
list->data[local] = mydata;
return 0;
}
//清空顺序表
void ClearSqList(sqlist_t *list)
{
list->last = -1;
}
//释放顺序表
void DestorySqList(sqlist_t **list)
{
free(*list);
*list = NULL;
}
//判断顺序表是否满
int isFullSqList(sqlist_t *list)
{
return (list->last == MAXN-1);
}
//判断顺序表是否空
int isEmptySqList(sqlist_t *list)
{
return (list->last == -1);
}
编写主函数,就可以调用定义好的函数了:
main.c
#include <stdio.h>
#include "common.h"
int main()
{
int i;
sqlist_t *list;
data_t mydata;
list = CreateSqList();
if (list == NULL)
return -1;
i = 5;
while(i) {
printf("insert %d - %d\n", i, InsertSqList(list, 0, i));
i--;
}
DisplaySqList(list);
DeleteSqList(list,4);
DisplaySqList(list);
......//可以自行调用
}
三、最后编译
gcc sqlist.c main.c
./a.out