利利用用C语语言言实实现现顺顺序序表表的的实实例例操操作作
本文实例讲述了C语言实现顺序表(线性表)的方法。分享给大家供大家参考 具体如下:
一一::顺顺序序表表代代码码实实现现
#ifndef _SEQ_LIST_H
#define _SEQ_LIST_H
#include
#include
#include
#include
#define ElemTy e float //以float类型测试算法通用性 而不是以惯用的int
#define INIT_SIZE 10 //顺序表默认初始化大小
#define LIST_INCREMENT 5 //顺序表容量增量 容量不够使用malloc申请
#define list_full(list) ((list)->size >= (list)->ca acity ? 1 : 0) //顺序表判满
#define list_em ty(list) ((list)->size == 0 ? 1 : 0) //判空
ty edef ElemTy e value_ty e; //元素类型
ty edef value_ty e* value_ tr; //元素指针类型
ty edef enum {false, true}bool; //为C语言增加bool量
ty edef enum {POSITION, VALUE}DELETE_MODE; //删除元素模式选择 分别为按位置删除和按值删除
ty edef struct sequelize_list{
ElemTy e *base; //顺序表基址
int size; //顺序表元素大小
int ca acity; //顺序表容量
} seq_list, *list_ tr;
void init_list(list_ tr l ) //初始化
{
assert(l != NULL);
l ->base = (value_ tr)malloc(sizeof(value_ty e)*INIT_SIZE); //free
assert(l ->base != NULL);
memset(l ->base, 0, sizeof(value_ty e)*INIT_SIZE);
l ->size = 0;
l ->ca acity = INIT_SIZE;
}
bool insert_elem(list_ tr l , const int os, const value_ty e elem) //插入元素
{
assert(l != NULL && os >= 1 && os <= l ->size+1);
if(list_full(l )){ //如果表满 追加申请空间
value_ tr new_base = (value_ tr)realloc(l ->base,
sizeof(value_ty e)*(l ->ca acity+LIST_INCREMENT));//此处注意realloc用法 用新地址接收是为
了防止realloc失败 原地址有效内容被释放
assert(new_base != NULL); //并且realloc填写的申请空间大小必须是之前的大小+增量的大小 而不是
只写增量 否则如果原地址内存不够 在新地址申请增量大小的空间 将之前的内容挪至新空间 内存溢出 将
发生段错误
l ->base = new_base; //再赋回给原地址
l ->base[l ->ca acity] = elem;
l ->ca acity += LIST_INCREMENT;
++l ->size;
}
else{ //未满 插入元素
for(int i=l ->size-1; i>= os-1; --i){ //将元素后移 腾出位置
l ->base[i+1] = l ->base[i];
}
l ->base