什么叫线性表
关于线性表,百度百科中有如下定义
线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。
线性表的实现
下面,我们通过 C 语言来实现线性表的 创建,增,删,查,改,销毁 操作。
SeqList.h
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include <stdbool.h>
/*
* 定义线性表结构体
*/
typedef struct SeqList_def
{
int* pointer;
int length;
int capacity;
}SeqList;
/*
* 函数名称:creat_seqlist
* 功能描述:创建一个线性表
* 输入参数:capacity-线性表容量
* 返 回 值:SeqList* 线性表结构体指针
*/
SeqList* creat_seqlist(int capaticy);
/*
* 函数名称:seqlist_inset
* 功能描述:向线性表插入数据
* 输入参数:index-表中位置索引,value-要插入的值
* 返 回 值:true-成功,false-失败
*/
bool seqlist_inset(SeqList* pList_t, const int index, int value);
/*
* 函数名称:seqlist_remove
* 功能描述:删除某个数据
* 输入参数:index-需要删除数据表中位置索引
* 返 回 值:true-成功,false-失败
*/
bool seqlist_remove(SeqList* pList_t, const int index);
/*
* 函数名称:seqlist_set
* 功能描述:设置某一位的数据
* 输入参数:index-需要修改数据表中位置索引, value-需要修改的数值
* 返 回 值:true-成功,false-失败
*/
bool seqlist_set(SeqList* pList_t, const int index, int value);
/*
* 函数名称:seqlist_get
* 功能描述:获取某个位置的数值
* 输入参数:index-位置索引
* 返 回 值:数值
*/
int seqlist_get(SeqList* pList_t, const int index);
/*
* 函数名称:seqlist_print
* 功能描述:线性表的打印
* 输入参数:pList_t-线性表指针
*/
void seqlist_print(SeqList* pList_t);
/*
* 函数名称:seqlist_destroy
* 功能描述:销毁线性表
* 输入参数:pList_t-线性表指针
*/
void seqlist_destroy(SeqList* pList_t);
#endif
SeqList.c
#include <stdlib.h>
#include <stdio.h>
#include "SeqList.h"
/*
* 函数名称:creat_seqlist
* 功能描述:创建一个线性表
* 输入参数:capacity-线性表容量
* 返 回 值:SeqList* 线性表结构体指针
*/
SeqList* creat_seqlist(int capaticy)
{
SeqList *seql;
seql->pointer = (int*)malloc(capaticy);
seql->capacity = capaticy;
seql->length = 0;
return seql;
}
/*
* 函数名称:seqlist_inset
* 功能描述:向线性表插入数据
* 输入参数:index-表中位置索引,value-要插入的值
* 返 回 值:true-成功,false-失败
*/
bool seqlist_inset(SeqList* pList_t, const int index, int value)
{
int i = 0;
if((index >= 0) && (index <= pList_t->length))
{
pList_t->length++;
for(i=pList_t->length; i>= index; i--)
{
pList_t->pointer[i] = pList_t->pointer[i-1];
}
pList_t->pointer[index] = value;
return true;
}
return false;
}
/*
* 函数名称:seqlist_remove
* 功能描述:删除某个数据
* 输入参数:index-需要删除数据表中位置索引
* 返 回 值:true-成功,false-失败
*/
bool seqlist_remove(SeqList* pList_t, const int index)
{
int i = 0;
if((index >=0) && (index < pList_t->length))
{
for(i=index; i<pList_t->length; i++)
{
pList_t->pointer[i] = pList_t->pointer[i+1];
}
pList_t->length--;
return true;
}
return false;
}
/*
* 函数名称:seqlist_set
* 功能描述:设置某一位的数据
* 输入参数:index-需要修改数据表中位置索引, value-需要修改的数值
* 返 回 值:true-成功,false-失败
*/
bool seqlist_set(SeqList* pList_t, const int index, int value)
{
if((index >=0) && (index < pList_t->length))
{
pList_t->pointer[index] = value;
return true;
}
return false;
}
/*
* 函数名称:seqlist_get
* 功能描述:获取某个位置的数值
* 输入参数:index-位置索引
* 返 回 值:数值
*/
int seqlist_get(SeqList* pList_t, const int index)
{
if((index >=0) && (index < pList_t->length))
{
return pList_t->pointer[index];
}
return 0;
}
/*
* 函数名称:seqlist_print
* 功能描述:线性表的打印
* 输入参数:pList_t-线性表指针
*/
void seqlist_print(SeqList* pList_t)
{
int i = 0;
printf("SeqList: ");
for(i=0; i<pList_t->length; i++)
printf("%d ", pList_t->pointer[i]);
printf("\r\n");
}
/*
* 函数名称:seqlist_destroy
* 功能描述:销毁线性表
* 输入参数:pList_t-线性表指针
*/
void seqlist_destroy(SeqList* pList_t)
{
free(pList_t->pointer);
pList_t->length = 0;
pList_t->capacity = 0;
}
下面,我们在main.c中测试线性表的功能:
main.c
#include <stdio.h>
#include <stdbool.h>
#include "SeqList.h"
int main(void)
{
/* 创建线性表 */
SeqList* list_t = creat_seqlist(10);
int i = 0;
/* 增 */
for(i=0; i<list_t->capacity; i++)
{
seqlist_inset(list_t, 0, i);
}
seqlist_print(list_t);
/* 删 */
seqlist_remove(list_t, 5);
seqlist_print(list_t);
/* 查 */
int ret = seqlist_get(list_t, 5);
printf("array[5] = %d\n", ret);
/* 改 */
seqlist_set(list_t, 5, 5);
printf("array[5] = %d\n", list_t->pointer[5]);
/* 销毁线性表 */
seqlist_destroy(list_t);
return 0;
}
运行结果: