用c语言指针建立顺序表,C语言顺序表的实现

/**************************************************

* 文件名称: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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值