顺序表的操作

实现功能: 创建顺序表、判断是否为空、判断有没有满、测量长度、数据替换 、尾插数据、按位置插入、按位置修改、按位置删除、清空、释放。
测试代码请到文章末尾下载。

#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;
}