1定义:由零个或多个数据元素组成的有限序列,强调是有限的。
ADT 抽象数据类型名Data数据元素之间逻辑关系的定义Operation操作endADT
2.线性表的抽象数据类型定义
Data线性表的数据对象集合为{a1,a2,…,an},每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。OperationInitList(*L): 初始化操作,建立一个空的线性表L。ListEmpty(L): 判断线性表是否为空表,若线性表为空,返回true,否则返回false。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
3代码
#include<stdlib.h>#include<stdio.h>#include<iostream>using namespace std;#define InitSize 10 //定义最大长度//静态分配//typedef struct {// int data[InitList];// int length;//}SqlList;//动态分配typedef struct { int *data; int length; //当前长度 int MaxSize;//最大长度}SqlList;//初始化顺序表void InitList(SqlList &L) { L.data = (int *)malloc(InitSize * sizeof(int)); L.length = 0; L.MaxSize = InitSize;}//增加顺序表的长度void IncreaseSize(SqlList &L, int len) { int* p = L.data; L.data = (int*)malloc((L.MaxSize + len) * sizeof(int)); for (int i = 0; i < L.length; i++) { L.data[i] = p[i]; } L.MaxSize += len; free(p);}//插入元素,在位序i的位置插入元素ebool ListInsert(SqlList& L, int i, int e) { if (i<1 || i>L.length + 1) return false; //i的范围是否有效 if (L.length >= L.MaxSize) return false; //当前存储空间已满,不能插入 for (int j = L.length; j >= i; j--) { L.data[j] = L.data[j - 1]; } L.data[i - 1] = e; L.length++; return true;}//删除操作,删除位序i个位置上的元素,e是删除的元素bool ListDelete(SqlList& L, int i, int& e) { if (i<1 || i>L.length) return false; e = L.data[i - 1]; for (int j = i; j < L.length; j++) { L.data[j-1] = L.data[j]; } L.length--; return true;}//按位查找 返回位序i的元素int GetElem(SqlList L, int i) { if (i<1 || i>L.length) return -1; return L.data[i - 1];}//查找第一个元素值等于e的元素,并返回其位序int LocateElem(SqlList L, int e) { for (int i = 0; i < L.length; i++) { if (L.data[i] == e) return i + 1; } return -1;}//删除值位于s和t之间的数bool Delete_s_t(SqlList& L, int s, int t) { if (L.length == 0 || s >= t) return false; int k = 0; for (int i = 0; i < L.length; i++) { if (L.data[i]<s || L.data[i]>t) { L.data[k++] = L.data[i]; } } L.length = k; return true;}int main() { SqlList L; InitList(L); ListInsert(L, 1, 1); ListInsert(L, 2, 6); ListInsert(L, 3, 3); ListInsert(L, 4, 8); ListInsert(L, 5, 2); for (int i = 0; i < L.length; i++) { cout << L.data[i] << " "; } cout << endl; Delete_s_t(L, 2, 3); for (int i = 0; i < L.length; i++) { cout << L.data[i] << " "; } cout << endl; return 0;}