线性表的定义:
线性是零个或多个数据元素的集合。
线性表中的数据元素之间是有顺序的。
线性表中的数据元素的个数是有限的。
线性表中的数据元素的类型必须相同。
线性表的定义:
线性表是具有相同类型的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);
*/