在数据结构里面,我们最先学习的就是表。
表包括以下两种
- 线性表
- 链表
今天我们实现的就是第一种线性表。
使用数组实现法。
首先定义数据结构。linear list github源码链接
// list.h
#define MAX_SIZE 1024
typedef enum
{
FALSE = 0,
TRUE = 1
}Status;
typedef int ElementType;
typedef struct
{
ElementType data[MAX_SIZE];
int length;// start from 0
}list_t;
然后列出我们想要实现表的那些功能(functions)呢?
最基本的就是插入(InsertElem)、删除(DeletElem)、读取元素(GetElem)、读取下标(GetIndex)。
此外最基本的还需要初始化(InitList)、清除一张表(ClearList)。
当然了,我们在实现上述函数的同时,还可能需要其他功能,比如获取表的长度(GetLength),插入元素前需要先判断表是否满了(IsListFull),删除元素前先判断表是否是空的(IsListEmpty)。
另外博主也加入了一下几个功能,压入元素(PushElem),类似入栈(stack)弹出,弹出元素(PopElem),类似出栈,其实线性表也可以算是广义的栈(stack)。复制一个表(CopyList),在一个表后面追加一个表(AppendList),与此类似还有一个两表拼接(AddList),可以理解为类似字符串拼接。
函数原型如下
// list.h
void InitList(list_t *list);
Status IsListEmpty(list_t *list);
Status IsListFull(list_t* list);
void ClearList(list_t* list);
Status GetElem(list_t* list, int index, ElementType * elem);
Status GetIndex(list_t* list, ElementType elem, int* index);
void GetLength(list_t* list, int* len);
Status InsertElem(list_t* list, int index, ElementType elem);
Status PushElem(list_t* list, ElementType elem);
Status DeletElem(list_t* list, int index);
Status PopElem(list_t* list);
Status CopyList(list_t* from, list_t* to);
Status AppendList(list_t* la, list_t* list);
Status AddList(list_t* la, list_t* lb, list_t* list);
void PrintList(list_t* list);//for debug
下面是具体实现
/*
************************************************************************
*File Name: list.c
*Author :
*Date : 2017年04月07日 星期五 11时22分48秒
*Brief : static linear list using array to store data
************************************************************************
*/
#include "list.h"
#include <stdio.h>
/*
* implementation
*/
void InitList(list_t *list)
{
list->length = -1;
}
Status IsListEmpty(list_t *list)
{
if (list->length == -1)
return TRUE;
else
return FALSE;
}
Status IsListFull(list_t* list)
{
if(list->length == MAX_SIZE-1)
return TRUE;
else
return FALSE;
}
void ClearList(list_t* list)
{
list->length = -1;
}
Status GetElem(list_t* list, int index, ElementType * elem)
{
if(IsListEmpty(list) || index <0 || index>list->length)
return FALSE;
*elem = list->data[index];
return TRUE;
}
Status GetIndex(list_t* list, ElementType elem, int* index)
{
int i = 0;
while(i <= list->length)
{
if(list->data[i] == elem)
{
*index = i;
return TRUE;
}
i++;
}
return FALSE;
}
void GetLength(list_t* list, int* len)
{
*len = list->length+1;
}
// put the elme at the index
Status InsertElem(list_t* list, int index, ElementType elem)
{
int i=0;
if(IsListFull(list) || index<0 || index>list->length+1)// list is full or index is elligal
return FALSE;
// insert not at length+1, move firstly
if(index <= list->length)
{
for(i=list->length+1; i>index; i--)
list->data[i] = list->data[i-1];
}
// insert
list->data[index] = elem;
list->length++;
return TRUE;
}
Status PushElem(list_t* list, ElementType elem)
{
return InsertElem(list, list->length+1, elem);
}
Status DeletElem(list_t* list, int index)
{
int i=0;
if(IsListEmpty(list) || index<0 || index>list->length)
return FALSE;
//delet not at length, move firstly
if(index < list->length)
{
for(i=index; i<list->length; i++)
list->data[index] = list->data[index+1];
}
list->length--;
return TRUE;
}
Status PopElem(list_t* list)
{
return DeletElem(list,list->length);
}
Status CopyList(list_t* from, list_t* to)
{
int i,len;
InitList(to);
GetLength(from, &len);
for(i=0; i<len; i++)
PushElem(to, from->data[i]);
return TRUE;
}
Status AppendList(list_t* la, list_t* list)
{
int i,la_len,len;
GetLength(la, &la_len);
GetLength(list, &len);
if(la_len+len > MAX_SIZE)
return FALSE;
for(i=0; i<len; i++)
PushElem(list, la->data[i]);
return TRUE;
}
// la+lb: put lb behind la
Status AddList(list_t* la, list_t* lb, list_t* list)
{
int i,la_len,lb_len;
GetLength(la, &la_len);
GetLength(lb, &lb_len);
if(la_len+lb_len > MAX_SIZE)
return FALSE;
CopyList(la, list);
for(i=0; i<lb_len; i++)
PushElem(list, lb->data[i]);
return TRUE;
}
void PrintList(list_t* list)
{
int i, len;
GetLength(list, &len);
for(i=0; i<len; i++)
printf("%d\n", list->data[i]);
}
最后是验证
/*
************************************************************************
*File Name: main.c
*Author :
*Date : 2017年04月07日 星期五 16时38分56秒
*Brief :
************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int main(int argc, char const *argv[])
{
int i=0;
int len;
int index;
list_t list;
list_t cp_list;
list_t add_list;
InitList(&list);
InitList(&cp_list);
InitList(&add_list);
for (i = 0; i < 10; i++)
{
PushElem(&list, i+10);
}
CopyList(&list, &cp_list);
AppendList(&list, &cp_list);
PrintList(&cp_list);
return 0;
}