所谓数据结构,就是定义一组有关系的数据以及在这些数据上的操作,也就是ADT(抽象数据类型)。
包括三个方面;
ADT List{ 数据对象: 数据关系:基本运算:}
以顺序表为例,它的顺序存储类型:
typedef struct
{
ElemType data[MaxSize]; // ElemType存放数据类型
int length;
}SqList;
数据对象是一个长度为MaxSize类型为ElemType的数组,一个整形length。MaxSize,ElemType通过宏定义自己设置。
数据关系就是,数组表示顺序表的元素,length表示数组长度。
并定义了几个基本运算:
void CreateList(SqList *&L,ElemType a[],int n); //创建顺序表并赋值
void DispList(SqList *L); //输出顺序表
void InitSqList(SqList *&L); //初始化顺序表
void DestroyList(SqList *&L); //销毁顺序表
int ListEmpty(SqList *L); //判断顺序表是否为空
int ListLength(SqList *L); //求顺序表长度
int GetElem(SqList *L,int i,ElemType &e); //获取第i个元素的值,并赋值给e
int LocateElem(SqList *L,ElemType e); //返回等于元素e的元素序号
int ListInsert(SqList *&L,int i,ElemType e); //插入元素
int ListDelete(SqList *&L,int i,ElemType &e); //删除元素
#include
#include
#include
#define MaxSize 1000
#define ElemType int
#define GET_ARRAY_LEN(array) (sizeof(array)/sizeof(array[0]))
using namespace std;
typedef struct
{
ElemType data[MaxSize];
int length;
}SqList;
void CreateList(SqList *&L,ElemType a[],int n); //创建顺序表并赋值
void DispList(SqList *L); //输出顺序表
void InitSqList(SqList *&L); //初始化顺序表
void DestroyList(SqList *&L); //销毁顺序表
int ListEmpty(SqList *L); //判断顺序表是否为空
int ListLength(SqList *L); //求顺序表长度
int GetElem(SqList *L,int i,ElemType &e); //获取第i个元素的值,并赋值给e
int LocateElem(SqList *L,ElemType e); //返回等于元素e的元素序号
int ListInsert(SqList *&L,int i,ElemType e); //插入元素
int ListDelete(SqList *&L,int i,ElemType &e); //删除元素
void CreateList(SqList *&L,ElemType a[],int n){
if(L==NULL)L=(SqList *)malloc(sizeof(SqList));
for(int i=0;idata[i]=a[i];
L->length=n;
}
void DispList(SqList *L){
if(ListEmpty(L))
return;
for(int i=0;ilength;i++){
cout<data[i]<<" ";
}
printf("\n");
}
void InitSqList(SqList *&L){
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
void DestroyList(SqList *&L){
free(L);
}
int ListEmpty(SqList *L){
return(L->length==0);
}
int ListLength(SqList *L){
return(L->length);
}
int GetElem(SqList *L,int i,ElemType &e){
if(i<1||i>L->length)return -1;
else{
e=L->data[i-1];
return 1;
}
}
int LocateElem(SqList *L,ElemType e){
int i=0;
while(L->data[i]!=e&&ilength)i++;
if(i==L->length)
return -1;
else
return i+1;
}
int ListInsert(SqList *&L,int i,ElemType e){
if(i<1||i>L->length+1){
return -1;
}
i--;
for(int j=L->length;j>i;j--){
L->data[j]=L->data[j-1];
}
L->data[i]=e;
L->length++;
return 1;
}
int ListDelete(SqList *&L,int i,ElemType &e){
if(i<1||i>L->length)return -1;
i--;
e=L->data[i];
for(int j=i;jlength-1;j++){
L->data[j]=L->data[j+1];
}
L->length--;
return 1;
}
int main()
{
ElemType e;
ElemType a[8]={12,35,23,89,1,4,43,24};
SqList * L=NULL;
InitSqList(L);
CreateList(L,a,GET_ARRAY_LEN(a));
DispList(L);
GetElem(L,4,e);
cout<
可以通过改ElemType换成别的类型的顺序表很方便。