线性表的定义:
线性是零个或多个数据元素的集合。
线性表中的数据元素之间是有顺序的。
线性表中的数据元素的个数是有限的。
线性表中的数据元素的类型必须相同。
线性表的定义:
线性表是具有相同类型的n(n>0)个数据元素的有限序列。
实现代码:
相关头文件的定义:
#ifndef _SEQLIST_H_ #define _SEQLIST_H_ typedef void SeqList; typedef void SeqListNode; SeqList *SeqList_Create(int capacity); void SeqList_Destory(SeqList *list); void SeqList_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
实现的c文件:
#include <stdio.h> #include <malloc.h> #include "SeqList.h" typedef unsigned int TSeqListNode; typedef struct _tag_SeqList { int capacity; //容量 int length; //长度 TSeqListNode* node; }TSeqList; //创建顺序表 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 SeqList_Destory(SeqList *list) { free(list); } //顺序表清空 void SeqList_Clear(SeqList *list) { TSeqList *sList = (TSeqList*)list; if(sList != NULL) { sList->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; } //向顺序表中插入一个元素 int SeqList_Insert(SeqList *list,SeqListNode *node,int pos) { TSeqList *sList = (TSeqList*)list; int ret = (sList != NULL); int i = 0; //判断插入位置是否合法 ret = ret && (sList->length+1 <= sList->capacity); ret = ret && (0<=pos); if(ret) { if(pos >= sList->length) { pos = sList->length; } for(i=sList->length;i>pos;i--) { sList->node[i] = sList->node[i-1]; } sList->node[i] = (TSeqListNode)node; sList->length++; } return ret; } //查找顺序表中的元素 SeqListNode *SeqList_Get(SeqList *list,int pos) { TSeqList *sList = (TSeqList*)list; TSeqListNode *ret = NULL; //位置合法性判断 if( (sList != NULL) && (0<=pos) && (pos < sList->length) ) { ret = (SeqListNode*)(sList->node[pos]); } return ret; } //删除顺序表中的元素 SeqListNode *SeqList_Delete(SeqList *list,int pos) { TSeqList *sList = (TSeqList*)list; SeqListNode *ret = SeqList_Get(list,pos); int i = 0; if(ret != NULL) { for(i=pos+1;i<sList->length;i++) { sList->node[i-1] = sList->node[i]; } sList->length--; } return ret; }
测试代码:
#include <stdio.h> #include "SeqList.h" #include <stdlib.h> int main(int argc, char *argv[]) { SeqList *list = SeqList_Create(10); int i = 1; int j = 2; int k = 3; int x = 4; int y = 5; int z = 6; 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); SeqList_Delete(list,5); printf("%x\n",SeqList_Get(list,5)); SeqList_Destory(list); printf("Press enter to continue ..."); getchar(); return 0; } //测试代码 /* SeqList *list = SeqList_Create(10); int i = 1; int j = 2; int k = 3; int x = 4; int y = 5; int z = 6; 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); } SeqList_Delete(list,0); SeqList_Delete(list,0); printf("\n"); for(index=0; index<SeqList_Length(list); index++) { int *p = (int*)SeqList_Get(list,index); printf("%d\n",*p); } SeqList_Destory(list); */