线性表的抽象数据类型
ADT 线性表(LIST)
DATA
线性表的数据集合为{a1,...an},每个元素类型均为DataType,
其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,
除了最后一个元素外,每个元素都有一个直接后继元素。
数据元素之间的关系是一对一的关系。
OPERATION
InitList(*L);/*初始化操作,建立一个空的线性表L*/
ListEmpty(L);/*若线性表为空,返回true*/
ClearList(*L);/*将线性表清空*/
GetElem(L,i,e);/*将线性表L中第i的位置返回给e*/
LocateElem(L,e);/*在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素表中的序号,否则,返回0失败*/
ListInsert(*L,i,e);/*在线性表L中的第i个位置插入新元素e*/
ListDelete(*L,i,*e);/*删除线性表L中第i个元素,并用e返回其值*/
ListLength(L);/*返回线性表L的元素个数*/
ENDADT
线性表的顺序存储结构
定义
- 线性表的顺序结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素
特点
- 结点中只有自身的信息域,没有关联信息域。因此,顺序存储结构的存储密度大、存储空间利用率高。
- 通过计算地址直接访问任何数据元素,即可以随机访问。
- 插入和删除操作会引起大量元素的移动。
顺序表的头文件定义
#ifndef Seq_LIST_H
#define Seq_List_H
extern Status;
# define MAXSIZE 20 /*STORAGE INITIAL SIZE*/
typedef int ElemType;/*Depend on your solution*/
typedef struct SQ
{
ElemType data[MAXSIZE];/*data array,maxsize is MAXSIZE.*/
int length;/*SeqList current length.*/
}SqList;
/*declaration*/
void InitList(SqList *);
bool ListEmpty(SqList);/*assert the structure is empty*/
bool ClearList(SqList *);/*clear the List*/
Status GetElem(SqList,int,ElemType *);
int LocateElem(SqList,int);
bool ListInsert(SqList *,int,ElemType);
Status ListDelete(SqList *,int,ElemType *);
int ListLength(SqList);
#endif
顺序表的函数实现
#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"
#define ERROR 0
#define OK 1
typedef int Status;
/*implement the declaration*/
void InitList (SqList *sqlist)
{
sqlist->data[0]=NULL;
sqlist->length=0;
}
bool ListEmpty(SqList sqlist)
{
return sqlist.length==0?true:false;
}
Status ClearList(SqList &sqlist)
{
return ((&sqlist)->length=0)&&((&sqlist)->data[0]=NULL) ? OK:ERROR;
}
/*take the index i value into e in sqlist*/
Status GetElem(SqList sqlist,int i,ElemType *e)
{
if(sqlist.length==0||i<1||i>sqlist.length)
return ERROR;
*e=sqlist.data[i-1];
return OK;
}
int LocateElem(SqList sqlist,int e)
{
int index;
if(sqlist.data[0]==NULL||sqlist.length==0)
{
return 0;
}
else
{
for(index=0;index<sqlist.length-1;index++)
{
if(sqlist.data[index]==e)
{
break;
}
else
{
return 0;
}
}
return index+1;
}
}
bool ListInsert(SqList *sqlist,int i,ElemType e)
{
int k;
if(sqlist->length==MAXSIZE)
{
return false;
}
if(i<1||i>sqlist->length+1)
{
return false;
}
if(i<=sqlist->length)
{
for(k=sqlist->length-1;k>i-1;k++)
{
sqlist->data[k+1]=sqlist->data[k];
}
}
sqlist->data[i-1]=e;
sqlist->length++;
return true;
}
Status ListDelete(SqList *sqlist,int i,ElemType *e)
{
int k;
if(sqlist->length==0)
return ERROR;
if(i<1||i>sqlist->length+1)
return ERROR;
*e=sqlist->data[i-1];
if(i<sqlist->length)
{
for(k=i;k<sqlist->length;k++)
{
sqlist->data[k-1]=sqlist->data[k];
}
}
sqlist->length--;
return OK;
}
int ListLength(SqList sqlist)
{
return sqlist.length;
}
代码是基于c语言对数据结构进行阐述。代码逻辑不难,有什么看不透的欢迎留言,指正,交流。