/**************************************************
* 文件名称:sqlist.c
* 文件描述:线性表顺序存储的实现
* 文件做者:by Wang.J,in 2013.11.16
* 文件版本:1.0
* 修改记录:
***************************************************/#include"sqlist.h"
#if 0
#define ERR_NONE_ERROR 0
#define ERR_FUNC_EXEC 1
#define ERR_FILE_OPEN 2
char *error_msg[] ={/*0*/ "成功执行,无错误",/*1*/ "函数执行错误",/*2*/ "文件打开错误",
};int my_errno = 0;#endif
int main(void)
{int ret = 0;int i = 0;
sqlist slist;
elemtype e;
memset(&slist, 0, sizeof(slist));
printf("length:%d\n", slist.len);
ret= init_list(&slist);if (OK !=ret)return -1;
ret=list_empty(slist);
printf("长度:%d\n", slist.len);if (OK ==ret)
printf("顺序表为空\n");if (ERR ==ret)
printf("顺序表不为空\n");for (i = 0; i < 10; i++) {
e=(elemtype)i;
list_insert(&slist, i, e);
}
printf("插入数据\n");
ret=list_empty(slist);if (OK ==ret)
printf("顺序表为空\n");if (ERR ==ret)
printf("顺序表不为空\n");
printf("after length%d\n", list_length(slist));
disp_list(slist);
destroy_list(&slist);return 0;
}/*=====================================================
* 函数名称:init_list
* 函数功能:初始化一个顺序表,建立一个空的顺序表
* 函数参数:sqlist *L 负责返回一个建立好的顺序表,若是建立
失败则返回NULL
* 返 回 值:成功返回0并经过指针返回一个建立好的空表
失败返回-1指针返回NULL
* 创 建 人:by Wang.J,in 2013.11.16
* 修改记录:
======================================================*/
int init_list(sqlist *L)
{
L= (sqlist *)malloc(sizeof(sqlist));if (NULL ==L) {
L=NULL;return -1;
}
L->len = 0;return 0;
}/*=====================================================
* 函数名称:destroy_list
* 函数功能:销毁建立好的顺序表,释放顺序表的空间
* 函数参数:sqlist *L,已经存在的线性表
* 返 回 值:成功 0
失败 -1
一般free不会失败,其实这个函数能够直接使用void
的,这里只是本身顺手写的,看到代码就知道不会返回0
* 创 建 人:by Wang.J,in 2013.11.16
* 修改记录:
======================================================*/
int destroy_list(sqlist *L)
{
free(L);return 0;
}/*=====================================================
* 函数名称:list_empty
* 函数功能:判断sqlist顺序表是否为空
* 函数参数:sqlist L,已存在的线性表
* 返 回 值:空 0
不空 -1
* 创 建 人:by Wang.J,in 2013.11.16
* 修改记录:
======================================================*/
intlist_empty(sqlist L)
{if (0 ==L.len)return 0;return -1;
}/*=====================================================
* 函数名称:list_length
* 函数功能:取得线性表的长度,返回顺序表中元素个数
* 函数参数:sqlist L,已经存在的线性表
* 返 回 值:L的长度
* 创 建 人:by Wang.J,in 2013.11.16
* 修改记录:
======================================================*/
intlist_length(sqlist L)
{returnL.len;
}/*=====================================================
* 函数名称:disp_list
* 函数功能:显示顺序表中全部的元素
* 函数参数:sqlist L,已经存在的线性表
* 返 回 值:成功 0
失败 -1
* 创 建 人:by Wang.J,in 2013.11.16
* 修改记录:
======================================================*/
intdisp_list(sqlist L)
{int i = 0;if (0 >=L.len)return -1;for (i = 0; i < L.len; i++)
printf("%d\t", L.data[i]);/** 这个地方我本身是有异议的,首先你可能不知道输出的类型为
* %d,再就是求长度是使用list_length函数仍是使用L.len方式,
* list_length是函数调用有着函数调用的额外开销,在PC上这点
* 开销不算什么,可是在嵌入式系统就不得不考虑这种开销了,
* 这基本上算是良好的移植性和代码效率之间的问题,为了提升
* 移植性能够多添加几层抽象层,实现各类判断.除非是极其庞大
* 的项目或是为了匹配各类这样的设备,我认为像代码定义类型这
* 种小事,团队沟通就能解决.工做是避免问题,学习是自找问题.
* 因此怎么取舍只能看我的了.*/printf("\n");return 0;
}/*=====================================================
* 函数名称:get_elem
* 函数功能:获取i位置元素的值域,为了方便对应i从0开始与
数组下标一致,用e返回获取的值
* 函数参数:sqlite L 存在的顺序表
int i 位置
elemtype *e 返回值域
* 返 回 值:成功 0
失败 -1
* 创 建 人:by Wang.J,in 2013.11.16
* 修改记录:
======================================================*/
int get_elem(sqlist L, int i, elemtype *e)
{if (i < 0 || i >=L.len) {
e=NULL;return -1;
}*e =L.data[i];/** 这个地方要注意
* 看看与e = &(L.data[i])区别*/
return 0;
}/*=====================================================
* 函数名称:local_elem
* 函数功能:按元素值查找,返回第一个与e相匹配的元素位置
* 函数参数:sqlist L,已经存在的顺序表
* 返 回 值:存在返回位置
失败返回-1
* 创 建 人:by Wang.J,in 2013.11.16
* 修改记录:
======================================================*/
intlocal_elem(sqlist L, elemtype e)
{int i = 0;for (i = 0; i < L.len; i++) {if (e ==L.data[i])returni;
}return -1;
}/*=====================================================
* 函数名称:list_insert
* 函数功能:在sqlite的i位置插入元素
* 函数参数:sqlist *L 已存在的顺序表
int i 位置
elemtype e 元素
* 返 回 值:成功 0
失败 -1
* 创 建 人:by Wang.J,in 2013.11.16
* 修改记录:
======================================================*/
int list_insert(sqlist *L, inti, elemtype e)
{int j = 0;if (i < 0 || i > MAXSIZE-1)return -1;for (j = L->len; j > i; j--)
L->data[j] = L->data[j-1];
L->data[i] =e;
L->len++;return 0;
}/*=====================================================
* 函数名称:list_delete
* 函数功能:删除i位置的元素,元素经过e返回
* 函数参数:sqlite *L 已存在的顺序表
int i 位置
elemtype *e 删除位置的元素
* 返 回 值:成功 0
失败 -1
* 创 建 人:by Wang.J,in 2013.11.16
* 修改记录:
======================================================*/
int list_delete(sqlist *L, int i, elemtype *e)
{int j = 0;if (i < 0 || i >=L->len)return -1;*e = L->data[i];for (j = i; j < (L->len-1); j++)
L->data[j] = L->data[j+1];
L->len--;return 0;
}