- SeqList.h
- main.c
- SeqList.c
用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); #endifmain.c
简单的插入五个数 输出并删除
#includeSeqList.c#include #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 int* p = (int*)SeqList_Get(list,index); printf("%dn",*p); } printf("n"); //换个行 //删除每个元素 while( SeqList_Length(list)>0 ) { int* p = (int*)SeqList_Delete(list,0); printf("%dn",*p); } //释放空间 SeqList_Destroy(list); return 0; }
#include#include #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 length;i++) //从pos开始,后面的元素往前移动一位 { sList->node[i-1] = sList->node[i]; } sList->length--; } return ret; }



