用C语言实现可复用的顺序线性表,进行了数据封装,可以直接使用
SeqList.h
#ifndef SEQLIST_H
#define SEQLIST_H
typedef void SeqList;
typedef void SeqListNode;
//创建线性表
SeqList* List_Create(int capacity);
//获取线性表的最大长度
int SeqList_Capacity(SeqList* list);
//销毁线性表
void SeqList_Destroy(SeqList* list);
//清空线性表
void SeqList_Clear(SeqList* list);
//获取线性表的长度
int SeqList_Length(SeqList* list);
//元素插入线性表;在线性表list的pos位置插入新元素node
//返回值为1表示插入成功,0表示插入失败
int SeqList_Insert(SeqList* list,SeqListNode* node,int pos);
//获取线性表中某个位置的元素;获取线性表list的pos位置处的元素
//返回值为pos位置处的元素,NULL表示获取失败
SeqListNode* SeqList_Get(SeqList* list,int pos);
//将某个元素从线性表中删除;删除线性表list的pos位置处的元素
//返回值为删除的元素,NULL表示获取失败
SeqListNode* SeqList_Delete(SeqList* list,int pos);
#endif
main.c
简单的插入五个数 输出并删除
#include <stdio.h>
#include <stdlib.h>
#include"SeqList.h"
int main(int argc,char *argv[])
{
SeqList* list = List_Create(5);
int i = 0;
int j = 1;
int k = 2;
int x = 3;
int y = 4;
int z = 5;
int index = 0;
//每次都插入首位,把之前的数字后移
SeqList_Insert(list,&i,0);
SeqList_Insert(list,&j,0);
SeqList_Insert(list,&k,0);
SeqList_Insert(list,&x,0);
SeqList_Insert(list,&y,0);
SeqList_Insert(list,&z,0);
//查找
for(index = 0;index<SeqList_Length(list);index++)
{
int* p = (int*)SeqList_Get(list,index);
printf("%d\n",*p);
}
printf("\n"); //换个行
//删除每个元素
while( SeqList_Length(list)>0 )
{
int* p = (int*)SeqList_Delete(list,0);
printf("%d\n",*p);
}
//释放空间
SeqList_Destroy(list);
return 0;
}
SeqList.c
#include<stdio.h>
#include<malloc.h>
#include"SeqList.h"
//在.h文件里用void定义,把数据封装起来
typedef unsigned int TSeqListNode;
typedef struct Tag_SeqList
{
int capacity; //最大长度
int length; //当前长度
TSeqListNode* node;
}TSeqList;
//创建线性表
SeqList* List_Create(int capacity)
{
TSeqList* ret = NULL; //先创建指针
if(capacity >= 0)
{
ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode)*capacity);
}
if(ret != NULL)
{
ret->capacity = capacity;
ret->length = 0;
ret->node = (TSeqListNode*)(ret + 1);
}
return ret;
}
//销毁线性表
void SeqList_Destroy(SeqList* list)
{
free(list);
}
//清空线性表
void SeqList_Clear(SeqList* list)
{
TSeqList* sList = (TSeqList*)list; //list本身是void*类型的,先做个强制类型转换
if(sList !=NULL)
{
sList->length = 0;
}
}
//获取线性表的长度
int SeqList_Length(SeqList* list)
{
TSeqList* sList = (TSeqList*)list; //list本身是void*类型的,先做个强制类型转换
int ret = -1;
if(sList !=NULL)
{
ret = sList->length;
}
return ret;
}
//获取线性表的最大长度
int SeqList_Capacity(SeqList* list)
{
TSeqList* sList = (TSeqList*)list; //list本身是void*类型的,先做个强制类型转换
int ret = -1;
if(sList !=NULL)
{
ret = sList->capacity;
}
return ret;
}
//元素插入线性表;在线性表list的pos位置插入新元素node
//返回值为1表示插入成功,0表示插入失败
int SeqList_Insert(SeqList* list,SeqListNode* node,int pos)
{
TSeqList* sList = (TSeqList*)list;
//1,判断线性表是否合法
int ret = (sList != NULL);
int i = 0; //循环变量
ret = ret && ((sList->length+1) <= (sList->capacity));
//2,判断插入位置是否合法
ret = ret && (0<= pos);
if(ret)
{
if(pos >= sList->length)
{
pos = sList->length;
}
//3.从最后一个元素开始向前遍历到第pos个位置
// 分别将他们都向后移动一个位置
for(i=sList->length;i>pos;i--)
{
sList->node[i] = sList->node[i-1];
}
//4.将新元素插入
sList->node[i] = (TSeqListNode)node;
sList->length++;
}
return ret;
}
//获取线性表中某个位置的元素;获取线性表list的pos位置处的元素
//返回值为pos位置处的元素,NULL表示获取失败
SeqListNode* SeqList_Get(SeqList* list,int pos)
{
TSeqList* sList = (TSeqList*)list;
SeqListNode* ret = NULL;
//1.判断线性表是否合法
//2.判断位置是否合法
if((sList != NULL)&&(0<=pos)&&(pos<=sList->length))
{
ret = (TSeqListNode*)sList->node[pos];
}
return ret;
}
//将某个元素从线性表中删除;删除线性表list的pos位置处的元素
//返回值为删除的元素,NULL表示获取失败
SeqListNode* SeqList_Delete(SeqList* list,int pos)
{
TSeqList* sList = (TSeqList*)list;
SeqListNode* ret = SeqList_Get(list,pos); //在Get函数里有合法性测试了
int i=0;
if(ret !=NULL) //说明取出了真实的元素
{
for(i=pos+1;i<sList->length;i++) //从pos开始,后面的元素往前移动一位
{
sList->node[i-1] = sList->node[i];
}
sList->length--;
}
return ret;
}