所谓数据结构,就是定义一组有关系的数据以及在这些数据上的操作,也就是ADT(抽象数据类型)。
包括三个方面;
ADT List{ 数据对象: 数据关系:基本运算:}
以顺序表为例,它的顺序存储类型:
typedef struct { ElemType data[MaxSize]; // <span style="font-family: Arial, Helvetica, sans-serif;">ElemType存放数据类型</span> 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<stdlib.h> #include<stdio.h> #include<iostream> #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;i<n;i++) L->data[i]=a[i]; L->length=n; } void DispList(SqList *L){ if(ListEmpty(L)) return; for(int i=0;i<L->length;i++){ cout<<L->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&&i<L->length)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;j<L->length-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<<e<<endl; cout<<LocateElem(L,23)<<endl; ListInsert(L,5,34); DispList(L); ListDelete(L,7,e); cout<<e<<endl; DispList(L); DestroyList(L); }
可以通过改ElemType换成别的类型的顺序表很方便。
时间: 2024-10-10 17:24:01