顺序存储线性表的实现
时间:2022-04-27
本文章向大家介绍顺序存储线性表的实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最近复习数据结构,写了一个顺序存储的线性表,代码粘在这里:)
代码下载:git@github.com:Wang-Sen/algorithm.git
/*
* Simple array implementation.
*/
#include <stdbool.h>
#define MAX_SIZE 50
#define data_t int
#define array_length_t int
#define ERR_OUT_OF_RANGE -1
#define ERR_EMPTY_ARRAY -2
#define ERR_INVALID_ARGS -3
typedef struct {
data_t data[MAX_SIZE];
array_length_t length;
} array;
static inline void array_init(array *arr)
{
for (int i = 0; i < MAX_SIZE; i++) {
arr->data[i] = 0;
}
arr->length = 0;
}
static inline void show_array(array *arr)
{
for (int i=0; i < arr->length; i++) {
printf("%d ", arr->data[i]);
}
printf("n");
}
static inline bool is_array_empty(array *arr)
{
if (!arr) {
return ERR_INVALID_ARGS;
}
return !arr->length;
}
static inline array_length_t len(array *arr) {
if (!arr) {
return ERR_INVALID_ARGS;
}
return arr->length;
}
static inline int locate_entry(array *arr, data_t entry) {
if (!arr) {
return ERR_INVALID_ARGS;
}
int ret = -1;
for (int i = 0; i < MAX_SIZE; i++) {
if (arr->data[i] == entry) {
ret = i;
return ret;
}
}
return ret;
}
static inline int array_push(array *arr, data_t entry)
{
if (!arr) {
return ERR_INVALID_ARGS;
}
if ((arr->length + 1) > MAX_SIZE) {
return ERR_OUT_OF_RANGE;
}
arr->data[arr->length] = entry;
(arr->length)++;
return 0;
}
static inline int array_pop(array *arr, data_t *p_entry)
{
if (arr->length <= 0) {
return ERR_EMPTY_ARRAY;
}
if (!p_entry || !arr) {
return ERR_INVALID_ARGS;
}
*p_entry = arr->data[arr->length - 1];
(arr->length)--;
return 0;
}
static inline int array_insert(array *arr, int loc, data_t entry)
{
if (!arr) {
return ERR_INVALID_ARGS;
}
if ((arr->length + 1) > MAX_SIZE || loc < 0 || loc >= MAX_SIZE) {
return ERR_OUT_OF_RANGE;
}
for (int i = arr->length; i > loc; i--) {
arr->data[i] = arr->data[i - 1];
}
arr->data[loc] = entry;
(arr->length)++;
return 0;
}
static inline int array_delete(array *arr, int loc, data_t *entry)
{
if (!arr || !entry) {
return ERR_INVALID_ARGS;
}
if (loc < 0 || loc >= arr->length) {
return ERR_OUT_OF_RANGE;
}
*entry = arr->data[loc];
for (int i = loc; i < (arr->length) - 1; i++) {
arr->data[i] = arr->data[i + 1];
}
(arr->length)--;
return 0;
}
static inline int array_update(array *arr, int loc, data_t entry)
{
if (!arr) {
return ERR_INVALID_ARGS;
}
if (!arr->length) {
return ERR_EMPTY_ARRAY;
}
if (loc < 0 || loc >= arr->length) {
return ERR_OUT_OF_RANGE;
}
arr->data[loc] = entry;
return 0;
}
static inline int array_reverse(array *arr)
{
if (!arr) {
return ERR_INVALID_ARGS;
}
int i, j, tmp;
for (i = 0, j = (arr->length - 1); j - i > 0; i++, j--) {
if (arr->data[i] == arr->data[j]) {
tmp = arr->data[i];
arr->data[i] = arr->data[j];
arr->data[j] = tmp;
} else {
arr->data[i] ^= arr->data[j];
arr->data[j] ^= arr->data[i];
arr->data[i] ^= arr->data[j];
}
}
return 0;
}
测试代码:
#include <stdio.h>
#include <unistd.h>
#include "array.h"
int main(int argc, char **argv) {
int ret = 0, i;
array list;
array_init(&list);
/* test is_empty_array */
printf("Empty array: %dn", is_array_empty(&list));
list.data[0] = 2400;
list.length += 1;
printf("Empty array: %dn", is_array_empty(&list));
/* end test is_empty_array */
/* test push */
for (i = list.length; i < MAX_SIZE; i++) {
if ((ret = array_push(&list, i))) {
printf("Err: %dn", ret);
printf("length: %dn", list.length);
printf("Entry: %dn", i);
}
}
show_array(&list);
if ((ret = array_push(&list, 20))) {
printf("Err: %dn", ret);
printf("length: %dn", list.length);
printf("Entry: %dn", 20);
}
/* end test push */
/* test insert */
array_init(&list);
for (i = list.length; i < MAX_SIZE-1; i++) {
if ((ret = array_push(&list, i))) {
printf("Err: %dn", ret);
printf("length: %dn", list.length);
printf("Entry: %dn", i);
}
}
array_insert(&list, 3, 5);
show_array(&list);
array_insert(&list, 3, 6);
show_array(&list);
array_init(&list);
for (i = list.length; i < MAX_SIZE-1; i++) {
if ((ret = array_push(&list, i))) {
printf("Err: %dn", ret);
printf("length: %dn", list.length);
printf("Entry: %dn", i);
}
}
array_insert(&list, MAX_SIZE, 5);
show_array(&list);
/* end test insert */
/* test locate_entry */
array_init(&list);
for (i = list.length; i < MAX_SIZE; i++) {
if ((ret = array_push(&list, i))) {
printf("Err: %dn", ret);
printf("length: %dn", list.length);
printf("Entry: %dn", i);
}
}
printf("location of 5 is: %dn", locate_entry(&list, 5));
printf("location of 10 is: %dn", locate_entry(&list, 10));
printf("location of 100 is: %dn", locate_entry(&list, 100));
printf("location of -100 is: %dn", locate_entry(&list, -100));
/* end test locate_entry */
/* test len*/
array_init(&list);
for (i = 0; i < 38; i++) {
if ((ret = array_push(&list, i))) {
printf("Err: %dn", ret);
printf("length: %dn", list.length);
printf("Entry: %dn", i);
}
}
printf("len : %dn", len(&list));
/* end test len */
/* test pop */
array_init(&list);
int j = 0;
for (i = 0; i < 26; i++) {
array_push(&list, j);
j += 2;
}
show_array(&list);
for (i = 0; i < 27; i++) {
array_pop(&list, &j);
printf("Pop Entry: %dn", j);
show_array(&list);
}
/* end test pop */
/* test delete*/
array_init(&list);
for (i = 0; i < 26; i++) {
array_push(&list, j);
j += 2;
}
show_array(&list);
for (i = 0; i < 27; i++) {
if (array_delete(&list, i, &j) != 0) {
printf("Delete %dth entry error!n", i);
break;
}
printf("Deleted Entry: %dn", j);
show_array(&list);
}
/* end test delete */
/* test update*/
array_init(&list);
for (i = 0, j = 0; i < 26; i++) {
array_push(&list, j);
j += 2;
}
show_array(&list);
for (i = 0; i < 28; i++) {
if (array_update(&list, i, 99) != 0) {
printf("Update %dth entry error!n", i);
break;
}
printf("Updated %dth Entry: %dn", i, j);
show_array(&list);
}
/* end test update */
/* test reverse*/
array_init(&list);
for (i = 0; i < MAX_SIZE; i++) {
array_push(&list, i);
}
show_array(&list);
array_reverse(&list);
show_array(&list);
/* end test reverse */
}
- IronPython资料
- WordPress免插件仅代码实现“返回顶部、返回底部、评论”效果(样式一)
- encodeURIcomponent编码和ASP.NET之间编码转换
- WordPress免插件仅修改代码去掉评论/留言里的链接
- 阅读Ext 学习Javascript(一)Core/Ext.js
- 利用腾讯的ip地址库做ip地址定位
- WordPress登陆不了后台的原因及解决方法(登陆界面不断返回)
- select元素的options.add 与 insertbefore的区别
- 如何去理解 拓扑排序算法
- WordPress免插件仅代码实现文章归档(模板页面)I
- Bing Map App 开发 还没入门遇见错误无法继续
- 使用MongoDB的支持Linq 驱动NoRM
- Ext的组件模型印象
- 2018年预计仍将持续活跃走高的数字货币都有哪些?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android实现系统消息推送
- Android仿微信QQ聊天顶起输入法不顶起标题栏的问题
- Android实现倒计时的按钮效果
- 腾讯位置服务实现轨迹回放
- 有一种遗憾,是跑程序却没用上_______
- Android使用注解代替枚举节省系统内存开销的方法
- Android实现自定义验证码输入框效果(实例代码)
- flutter 实现多布局列表的示例代码
- flutter TextField换行自适应的实现
- 如何造个android Flow流式响应的轮子
- Flutter混合开发详解
- Android 单双击实现的方法步骤
- Android多渠道打包时获取当前渠道的方法
- Flutter Dio二次封装的实现
- android开发通过Scroller实现过渡滑动效果操作示例