#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
二、SeqList.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; //地址初始化爲NULL
if(capacity>=0) //最大容量大於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=(SeqList*)list; //將線性表強制轉化爲SeqList類型的
if(sList!=NULL) //判斷線性表是否爲空
{
sList->length=0; //將當前的長度置0,清空鏈表中的所有元素
}
}
int SeqList_Length(SeqList* list) //獲取線性表當前的長度
{
TSeqList* sList=(TSeqList*)list; //將線性表強制轉化爲SeqList類型的
if(sList!=NULL) //判斷線性表是否爲空
{
ret=sList->length; //將鏈表當前的長度的值賦給ret
}
return ret; //返回ret的值
}
int SeqList_Capacity(SeqList* list) //獲取線性表當前容量的最大值
{
TSeqList* sList=(TSeqList*)list; //將線性表強制轉化爲SeqList類型的
ret=-1; //ret置爲-1,當線性表爲null時,返回錯誤提示
if(sList!=NULL) //判斷鏈表是否爲null
{
ret=sList->capacity; //將線性表的最大容量值賦給ret
}
return ret;
}
int SeqList_Insert(SeqList* list,SeqListNode* node,int pos) //在某個位置插入某個元素
{
TSeqList* sList=(TSeqList*)list; //將線性表強制轉化爲SeqList類型的
int ret =(sList!=NULL); //判斷線性表是否合法(線性表不能爲null)
int i=0;
ret=ret&&(sList->length+1<=sList->capacity); //判斷插入位置是否合法(插入的位置應該從0開始,但不能大於最大的容量值)
ret=ret&&(0<=pos);
if(ret)
{
if(pos>=sList->length)
{
pos=sList->length; //如果插入的位置大於線性表當前的長度,則將視插入的位置爲最後一位
}
for(i=sList->length;i>pos;i--) //從最後一位開始,到pos的後一位進行循環依次向後移一位
{
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;
SeqListNode* ret = NULL;
if( (sList != NULL) && (0 <= pos) && (pos < sList->length) ) //判斷線性表的是否合法,以及獲取的位置是否合法
{
ret = (SeqListNode*)(sList->node[pos]); //將獲取的元素賦值給ret
}
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]; //將pos後面一位到最後一位依次向前移一個位置
}
sList->length--; //長度減一
}
return ret;
}
第一二部分創建了可複用的順序線性表,一個完整的順序線性表表達成功;
接着我們進行第三步,通過main函數進行編寫,也可稱爲線性表的操作;
三、main.c
#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);
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;
}
執行結果: