实现功能: 创建顺序表、判断是否为空、判断有没有满、测量长度、数据替换 、尾插数据、按位置插入、按位置修改、按位置删除、清空、释放。
测试代码请到文章末尾下载。
#include <stdio.h>
#include <stdlib.h>
#include "sequence_list.h"
/*#define LEN 50
#define sequence_list_t List_t
typedef int data_t;
typedef struct sequence_list
{
data_t data_arry[LEN];
int last;
}sequence_list_t;*/
/******************
* @b 创建顺序表
* ***************/
List_t* list_creat(void)
{
List_t* list = NULL;
if((list = (List_t*)malloc(sizeof(List_t))) == NULL)
{
printf("Failed malloc to creat sequence list\n");
return NULL;
}
list->last = -1;
return list;
}
/************************
* @b 判断顺序表是否为空
* *********************/
int list_empty(List_t* list)
{
return (list->last) < 0 ? -1:0;
}
/**************************
* @b 判断顺序表是否为满
* ***********************/
int list_full(List_t* list)
{//为什么要写成>=LEN - 1? 排除last=-1的情况,last作为数组的下标最大为LEN-1
return (list->last) >= LEN - 1 ? -1:0;
}
/************************
* @b 测量顺序表元素个数
* *********************/
int list_sizeof(List_t* list)
{
if(list_empty(list))
return 0;
return (list->last) + 1;
}
/**************************
* @b 插入一个数据
* ***********************/
int list_insert(List_t* list,data_t data)
{
if(list_full(list))
{
printf("Failed insert,list is full\n");
return -1;
}
list->last ++;
list->data_arry[list->last] = data;
return 0;
}
/**************************
* @b 替换旧数据
* ***********************/
int list_change(List_t* list,data_t old,data_t new)
{
if(list_empty(list))
{
printf("Failed change,list is empty\n");
return -1;
}
int i;
for(i = 0;i <= list->last;i++)
{
if(list->data_arry[i] == old)
{
list->data_arry[i] = new;
}
}
return 0;
}
/**************************
* @b 按照位置读取数据
* ***********************/
int list_pos_read(List_t* list,int pos,data_t* data)
{
if(list_empty(list))
{
printf("Failed read,list is empty\n");
return -1;
}
if(!(pos > -1 && pos <= list->last))//等同于pos <= 0 || pos >=list->last,这样写效率高,因为&&的短路原则
{
printf("Failed read,pos illegal\n");
return -1;
}
*data = list->data_arry[pos];
return 0;
}
/**************************
* @b 按照位置修改数据
* ***********************/
int list_pos_set(List_t* list,int pos,data_t data)
{
if(list_empty(list))
{
printf("Failed set,list is empty\n");
return -1;
}
if(!(pos > -1 && pos <= list->last))//等同于pos <= 0 || pos >=list->last,这样写效率高,因为&&的短路原则
{
printf("Failed set,pos illegal\n");
return -1;
}
list->data_arry[pos] = data;
return 0;
}
/**************************
* @b 按照位置插入数据
* ***********************/
int list_pos_insert(List_t* list,int pos,data_t data)
{
int i;
if(list_full(list))
{
printf("Failed insert,list is full\n");
return -1;
}
//等同于pos <= 0 || pos > list->last+1,这样写效率高,因为&&的短路原则
//又因为当last是最后第二个时,最后的位置也是可以插入的
if(!(pos > -1 && pos <= list->last + 1))
{
printf("Failed insert,pos illegal\n");
return -1;
}
for(i = list->last;i >= pos;i--) //将pos到last的数据往后挪一格
{
list->data_arry[i+1] = list->data_arry[i];
}
list->data_arry[pos] = data;//把数据放入pos的位置
list->last++; //因为插入了一个数据所以顺序表的last+1
return 0;
}
/**************************
* @b 按照位置删除数据
* ***********************/
int list_pos_delete(List_t* list,int pos)
{
int i;
if(list_empty(list))
{
printf("Failed delete,list is empty\n");
return -1;
}
//等同于pos <= 0 || pos > list->last+1,这样写效率高,因为&&的短路原则
//又因为当last是最后第二个时,最后的位置也是可以插入的
if(!(pos > -1 && pos <= list->last + 1))
{
printf("Failed delete,pos illegal\n");
return -1;
}
for(i = pos;i < list->last;i++) //将pos+1到last的数据往前挪一格
{
list->data_arry[i] = list->data_arry[i+1];
}
list->last--; //因为插入了一个数据所以顺序表的last+1
return 0;
}
/**************************
* @b 置空顺序表
* ***********************/
void list_clean(List_t* list)
{
list->last = -1;
}
/**************************
* @b 释放顺序表
* ***********************/
int list_free(List_t* list)
{
if(list == NULL)
{
printf("Failed free list,list was freed\n");
return -1;
}
free(list);
list = NULL;
return 0;
}