一、线性表
- 线性表:零个或多个数据元素的有限序列。
- 首先它是一个序列,也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最以后一个元素无后继,其他每个元素都有且一个前驱和后继。
二、线性表的顺序存储结构
- 线性表的顺序存储结构,指的是用一段地址连续的 存储单元依次存储线性表的数据元素。
- 简单说就是在内存中找了一块地方,通过占位的形式,把一定内存空间给占了。
- 顺序存储结构的三个属性:
- 存储空间的起始位置
- 线性表的最大存储空间
- 线性表当前长度(元素的个数)
三、顺序存储结构的实现
#include <stdio.h>
#include <stdlib.h>
#define LIST_LENGTH 100
#define LIST_CREMENT 20
typedef int tElem;
typedef tElem * pElem;
typedef struct List {
pElem elem;
int listLength;
int listSize;
} List;
typedef enum Status
{
ok = 1,Error = 0
} Status;
Status InitList(List * l)
{
l->elem = (pElem) malloc(sizeof(tElem) * LIST_LENGTH);
if(l->elem == 0)
{
printf("空间申请失败!");
return Error;
}
l->listLength = 0;
l->listSize += LIST_LENGTH;
}
void ListEmpty(List * l)
{
if(l->listLength == 0)
{
printf("线性表为空 \n");
}
else
{
printf("线性表的长度为 %d\n",l->listLength);
}
}
Status ListInsert(List * l,int i,tElem e)
{
if(i < 0 || i > l->listLength)
{
printf("ListInsert() 参数错误!\n");
return Error;
}
if(l->listLength >= l->listSize)
{
l->elem = (pElem) realloc(l,sizeof(tElem) * LIST_CREMENT);
if(l->elem == 0)
{
printf("空间申请失败!");
return Error;
}
else
{
l->listSize += LIST_CREMENT;
}
}
for(int j = l->listLength; j > i; j++)
{
l->elem[j] = l->elem[j - 1];
}
l->elem[i] = e;
l->listLength++;
return ok;
}
Status GetElem(List * l,int i)
{
if(i < 0 || i > l->listLength)
{
printf("ListInsert() 参数错误!\n");
return Error;
}
printf("线性表第 %d 个元素是 %d\n",i,l->elem[i]);
return ok;
}
Status PriorElem(List * l,tElem e)
{
int i = -1;
for(int j = 0; j < l->listLength; j++)
{
if(l->elem[j] == e) i = j;
}
if(i == -1)
{
printf("元素 %d 不在线性表中!\n",e);
return Error;
}
else if (i == 0)
{
printf("元素 %d 是线性表的第一个元素,无前一个元素!\n",e);
return Error;
}
else
{
printf("元素 %d 的前一个元素是:%d\n",e,l->elem[i-1]);
return ok;
}
}
Status NextElem(List * l,tElem e)
{
int i = -1;
for(int j = 0; j < l->listLength; j++)
{
if(l->elem[j] == e) i = j;
}
if(i == -1)
{
printf("元素 %d 不在线性表中!\n",e);
return Error;
}
else if (i == l->listLength - 1)
{
printf("元素 %d 是线性表的最后一个元素,无后一个元素!\n",e);
return Error;
}
else
{
printf("元素 %d 的后一个元素是:%d\n",e,l->elem[i+1]);
return ok;
}
}
void ListTraverse(List * l)
{
if(l->listLength > 0)
{
for(int i = 0; i < l->listLength; i++)
{
printf("线性表的第 %d 个元素是:%d\n",i,l->elem[i]);
}
}
else
{
printf("线性表为空!\n");
}
}
Status ListDelete(List * l,int i)
{
if(i < 0 || i > l->listLength)
{
printf("ListInsert() 参数错误!\n");
return Error;
}
for(int j = i; j < l->listLength; j++)
{
l->elem[j] = l->elem[j + 1];
}
l->listLength --;
return ok;
}
void ClearList(List * l)
{
l->listLength = 0;
}
void DestroyList(List * l)
{
free(l->elem);
l->listLength = 0;
l->listSize = 0;
}
int main() {
List plist;
InitList(&plist);
printf("第一次判断线性表的长度:");
ListEmpty(&plist);
printf("\n");
ListInsert(&plist,0,12);
ListInsert(&plist,1,23);
ListInsert(&plist,2,34);
printf("第二次判断线性表的长度:");
ListEmpty(&plist);
printf("\n");
GetElem(&plist,1);
printf("\n");
PriorElem(&plist,10);
PriorElem(&plist,12);
PriorElem(&plist,34);
printf("\n");
NextElem(&plist,10);
NextElem(&plist,34);
NextElem(&plist,12);
printf("\n");
ListTraverse(&plist);
printf("\n");
ListDelete(&plist,0);
ListTraverse(&plist);
printf("\n");
ClearList(&plist);
ListTraverse(&plist);
printf("\n");
DestroyList(&plist);
ListTraverse(&plist);
printf("\n");
return 0;
}