1、线性表的定义
- 线性表( List)是零个或多个数据元素的集合
- 线性表中的数据元素之间是有顺序的
- 线性表中的数据元素个数是有限的
- 线性表中的数据元素的类型必须相同
2、线性表的性质
- a0为线性表的第一个元素,只有一个后继
- an为线性表的最后一个元素,只有一个前驱
- 除a0和an外的其它元素ai,既有前驱,又有后继
- 线性表能够逐项访问和顺序存取
3、顺序存储结构
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
4、插入元素
算法描述:
- 判断线性表是否合法
- 判断插入位置是否合法
- 把最后一个元素到插入位置的元素后移一个位置
- 将新元素插入
- 线性表长度加1
操作示意:
5、删除元素
算法描述:
- 判断线性表是否合法
- 判断删除位置是否合法
- 将元素取出
- 将删除位置后的元素分别向前移动一个位置
- 线性表长度减1
操作示意:
6、可复用顺序线性表 代码实例
相关操作的定义
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include <stdio.h>
/*
对外做数据封装,屏蔽线性表的实现
*/
typedef void Seqlist;
typedef void SeqlistNode;
/*
该方法用于创建并且返回一个空的线性表
*/
Seqlist* List_Create(int capacity);
/*
该方法用于销毁一个线性表list
*/
void List_Destroy(Seqlist* list);
/*
该方法用于将一个线性表list中的所有元素清空
使得线性表回到创建时的初始状态
*/
void List_Clear(Seqlist* list);
/*
该方法用于返回一个线性表list中的所有元素个数
*/
int List_Length(Seqlist* list);
/*
该方法用于返回一个线性表list中的最大元素个数
*/
int List_Capacity(Seqlist* list);
/*
该方法用于向一个线性表list的pos位置处插入新元素node
返回值为1表示插入成功,0表示插入失败
*/
int List_Insert(Seqlist* list, SeqlistNode* node, int pos);
/*
该方法用于获取一个线性表list的pos位置处的元素
返回值为pos位置处的元素,NULL表示获取失败
*/
SeqlistNode* List_Get(Seqlist* list, int pos);
/*
该方法用于删除一个线性表list的pos位置处的元素
返回值为被删除的元素,NULL表示删除失败
*/
SeqlistNode* List_Delete(Seqlist* list, int pos);
#endif
相关方法的实现:
#include "seqlist.h"
#include <malloc.h>
/*
Windows 下和linux下void*的指针长度不一样
*/
#ifdef WIN32
typedef unsigned int TSeqlistNode;
#else
typedef unsigned long TSeqlistNode;
#endif
/*
length 记录线性表的当前元素个数
capacity 记录线性表的最大元素个数
TSeqlistNode 该数组用于保存被插入元素的地址值
*/
typedef struct _struct_Seqlist
{
int length;
int capacity;
TSeqlistNode *list;
}TSeqlist;
/*
该方法用于创建并且返回一个空的线性表
*/
Seqlist* List_Create(int capacity)
{
TSeqlist *tlist = NULL;
if (capacity > 0)
{
tlist = (TSeqlist*)malloc(sizeof(TSeqlist) + sizeof(TSeqlistNode) * capacity);
}
if (tlist != NULL)
{
tlist->length = 0;
tlist->capacity = capacity;
tlist->list = (TSeqlistNode*)(tlist + 1);
}
return tlist;
}
/*
该方法用于销毁一个线性表list
*/
void List_Destroy(Seqlist* list)
{
if (list != NULL)
{
free(list);
}
}
/*
该方法用于将一个线性表list中的所有元素清空
使得线性表回到创建时的初始状态
*/
void List_Clear(Seqlist* list)
{
TSeqlist *tlist = (TSeqlist*)list;
if (tlist != NULL)
{
tlist->length = 0;
}
}
/*
该方法用于返回一个线性表list中的所有元素个数
*/
int List_Length(Seqlist* list)
{
int iret = -1;
TSeqlist *tlist = (TSeqlist*)list;
if (tlist != NULL)
{
iret = tlist->length;
}
return iret;
}
/*
该方法用于返回一个线性表list中的最大元素个数
*/
int List_Capacity(Seqlist* list)
{
int iret = -1;
TSeqlist *tlist = (TSeqlist*)list;
if (tlist != NULL)
{
iret = tlist->capacity;
}
return iret;
}
/*
该方法用于向一个线性表list的pos位置处插入新元素node
返回值为1表示插入成功,0表示插入失败
*/
int List_Insert(Seqlist* list, SeqlistNode* node, int pos)
{
int iret = 1;
TSeqlist *tlist = (TSeqlist*)list;
iret = (tlist != NULL) && (node != NULL);
if (iret)
{
iret = iret && (pos >= 0 && pos < tlist->capacity);
iret = iret && (tlist->length < tlist->capacity);
if (iret)
{
//移动元素
for (int i = tlist->length; i > pos; i--)
{
tlist->list[i] = tlist->list[i - 1];
}
//插入元素
tlist->list[pos] = (TSeqlistNode)node;
//更改元素个数
tlist->length++;
}
}
return iret;
}
/*
该方法用于获取一个线性表list的pos位置处的元素
返回值为pos位置处的元素,NULL表示获取失败
*/
SeqlistNode* List_Get(Seqlist* list, int pos)
{
TSeqlistNode *node = NULL;
TSeqlist *tlist = (TSeqlist*)list;
if (tlist != NULL)
{
if (pos >= 0 && pos < tlist->length)
{
node = (TSeqlistNode*)tlist->list[pos];
}
}
return node;
}
/*
该方法用于删除一个线性表list的pos位置处的元素
返回值为被删除的元素,NULL表示删除失败
*/
SeqlistNode* List_Delete(Seqlist* list, int pos)
{
TSeqlistNode *node = NULL;
TSeqlist *tlist = (TSeqlist*)list;
if (tlist != NULL)
{
if (pos >= 0 && pos < tlist->length)
{
//得到即将被删除的元素
node = (TSeqlistNode*)tlist->list[pos];
//移动元素,达到删除元素的目的
for (int i = pos; i < tlist->length - 1; i++)
{
tlist->list[i] = tlist->list[i + 1];
}
//更改元素个数
tlist->length--;
}
}
return node;
}
测试程序:
#include <stdio.h>
#include "seqlist.h"
//定义线性表的最大元素个数
#define MAXSIZE 5
/*
该函数用于输出线性表中的所有元素
*/
void printlist(Seqlist *list)
{
if (List_Length(list) <= 0)
{
printf("list is empty!\n");
return;
}
for (int i = 0; i < List_Length(list); i++)
{
printf("%d\t", *((int*)List_Get(list, i)));
}
printf("\n");
}
int main()
{
//创建新线性表
Seqlist *list = List_Create(MAXSIZE);
int i = 10, j = 5, m = 2, x = 6, p = 8, z = 100;
//插入一下新的元素
List_Insert(list, &i, 0);
List_Insert(list, &j, 0);
List_Insert(list, &m, 0);
List_Insert(list, &x, 0);
List_Insert(list, &p, 0);
List_Insert(list, &z, 0); //不会插入此元素
printlist(list);
//删除已有元素
SeqlistNode *temp = List_Delete(list, 3);
printf("被删除的元素为:%d\n",*((int*)temp));
printlist(list);
//插入元素
List_Insert(list, &j, 3);
printlist(list);
//清空线性表
List_Clear(list);
printlist(list);
//销毁线性表
List_Destroy(list);
list = NULL;
printf("线性表已销毁!\n");
return 0;
}
7、源码下载
文件名:seqlist-1.0.tar.gz
链接: http://pan.baidu.com/s/1c0fQ61U 密码: a8cu
编译步骤:
0.1 解压缩:tar -zxvf seqlist-1.0.tar.gz
0.2 进入目录:./configure
0.3 生成Seqlist:make
0.4 运行程序:./Seqlist