#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[])
{
SeqList* list=SeqList_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);
//超过了长度,z=5是插不进去的
for(index=0;index<SeqList_Length(list);index++)
{
//Get函数得到的一个数据的地址,将这个地址做强制类型转换之后,
//通过指针取出该地址中保存的数据
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_Destory(list);
return 0;
}
#include <stdio.h>
#include <malloc.h>
#include "Seqlist.h"
//创建可复用的数据链表,保存它的地址,而不是具体数据
//这样子可以接受不同的数据类型,不用修改太多
//Insert(list,char c,int pos)
//Insert(list.int i,int pos)
//往数据表中插入的是指针,地址、 4个字节,32位。
//顺序表中存放的是各种数据的地址,是一个指针
typedef unsigned int TSeqListNode;
typedef struct _tag_SeqList
{
int capacity;
int length;
TSeqListNode*node;
}TSeqList;
/***********************
/功能:创建一个顺序表
/返回值: Seqlist*(void* ),是一个指针,指向真实的顺序表
/
/***********************/
SeqList* SeqList_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*,是一个地址,在其他调用函数中可以数据类型转换
}
}
/***********************
/功能:销毁顺序表
/返回值: none
/
/***********************/
void SeqList_Destory(SeqList* list)
{
free(list);
}
void SeqLsit_Clear(SeqList* list)
{
TSeqList*sList=(TSeqList*)list;
if(sList!=NULL)
{
sList->length=0;
//默认length==0时,该顺序表为空,不再需要考虑此时里面是否存有数据
}
}
/***********************
/功能:获得顺序表现在的长度
/返回值: 顺序表此时的长度
/
/***********************/
int SeqList_Length(SeqList* list)
{
TSeqList* sList=(TSeqList*)list;
int ret=-1;
if(sList!=NULL)
{
ret=sList->length;
}
return ret;
}
/***********************
/功能:获得顺序表的容量
/返回值: 顺序表的容量
/
/***********************/
int SeqList_Capacity(SeqList*list)
{
TSeqList*sList=(TSeqList*)list;
int ret=-1;
if(sList!=NULL)
{
ret=sList->capacity;
}
return ret;
}
/***********************
/功能:在顺序表插入一个元素,顺序表的下标从0开始,一分配的数组下标要区分
/返回值: int型
/ 参数:顺序表的地址,插入元素的地址,插入的位置
/***********************/
int SeqList_Insert(SeqList* list,SeqListNode* node,int pos)
{
//void*形参的顺序表强制类型转换成相应的顺序表数据类型
TSeqList*sList=(TSeqList*)list;
int ret=(sList!=NULL);
int i=0;
ret=ret&&(sList->length+1<=sList->capacity);
ret=ret&&(pos>=0);
if(ret)
{
//判断是否大于最后,是则修正为最后
if(pos>=sList->length)
{
pos=sList->length;
}
for(i=sList->length;i<pos;i--)
{
sList->node[i]=sList->node[i-1];
}
//node参数,一个指针值,地址,强制类型转换,将node数据元素的这个地址保存在node[]中
sList->node[i]=(TSeqListNode)node;
sList->length++;
}
return ret;
}
/***********************
/功能:获得顺序表下标pos的数据
/返回值: SeqListnode* _void*型,地址
/ 参数:顺序表,位置pos
/***********************/
SeqListNode* SeqList_Get(SeqList* list,int pos)
{
TSeqList*sList=(TSeqList*)list;
SeqListNode*ret=NULL;
if((sList!=NULL)&&(pos>=0)&&(pos<sList->length))
{
//node 中保存的是地址值,将它强制类型转换
ret=(SeqListNode*)(sList->node[pos]);
}
return ret;
}
/***********************
/功能:删除顺序表下边为pos位置的元素
/返回值: SeqListNode*—void*型,地址 ,返回删除的数据元素的地址
/ 参数:顺序表,要删除的位置pos
/***********************/
SeqListNode* SeqList_Delete(SeqList* list,int pos)
{
TSeqList*sList=(TSeqList*)list;
SeqListNode* ret=SeqList_Get(list,pos);
int i=0;
if(ret!=NULL)
{
//pos 后面的元素pos+1向前移动
for(i=pos+1;i<sList->length;i++)
{
sList->node[i-1]=sList->node[i];
}
sList->length--;
}
return ret;
}
#ifndef _SEQLIST_H
#define _SEQLIST_H
typedef void SeqList;
typedef void SeqListNode;
//void* 封装这两个数据类型的元素,
//void* 可以接收任何类型的数据元素的指针
//void* 可以赋值给任何类型的指针,但是需要做强制类型转换
SeqList* SeqList_Create(int capacity);
void SeqList_Destory(SeqList* list);
void SeqLsit_Clear(SeqList* list);
int SeqList_Length(SeqList* list);
int SeqList_Capacity(SeqList*list);
int SeqList_Insert(SeqList* list,SeqListNode* node,int pos);
SeqListNode* SeqList_Get(SeqList* list,int pos);
SeqListNode* SeqList_Delete(SeqList* list,int pos);
#endif