数据结构-线性表的顺序表示实现
程序员文章站
2024-03-20 14:46:40
...
1、线性表的定义和特点
线性表:由零个或者多个数据元素组成的有限序列。
长度为零的线性表成为空表。
非空线性表的特点是
- 存在唯一的第一个元素
- 存在唯一的最后一个元素
- 除第一个元素外,每一个数据元素均只有一个前驱
- 除去最后一个元素,每一个数据元素均只有一个后继
线性表的抽象数据类型为
ADT{
数据对象
数据关系
基本操作:
initList();//初始化
DestroyList();//摧毁线性表
CleatList();//清除数据
ListEmory();//判断线性表是否为空
GetElem();//获取第i个元素
....
}
2、线性表的顺序表示和实现
//定义指向int类型的指针
typedef int ElemType;
typedef ElemType* PEmle;
int sqListSize = 20;
//枚举返回类型
typedef enum Status{
OK,ERROR
};
class sqList{
public:
PEmle elem;
int length;
int listSize;
}
//基本操作
Status intoList(){
elem = (PEmle)malloc(sizeof(elem)*listSize);
if(elem == NULL){
return ERROR;
}
length = 0;
listSize = sqListSize;
}
Status ListInsert(int i,ElemType e){
if (i > length || i < 0 ){
return ERROR;
}
if(length >= listSize){
listSize += sqListSize;
elem = (PEmle)realloc(elem, sizeof(elem)*listSize);
if(elem == NULL){
return ERROR;
}
}
int j ;
for(j = length ; j > i ; ++j){
elem[j] = elem[j-1];
}
elem[i] = e;
length++;
return OK;
}
void ListTraverse(void (*visit)(ElemType)){
int i;
for(i = 0 ; i < length; i++){
visit(elem[i]);
}
}
Status GetElem(int i, ElemType& e){
if(i < 0 || i >= length){
return ERROR;
}
e = elem[i];
return OK;
}
Status deleteList(int i,ElemType& e){
if(i < 0 || i >= length){
return ERROR;
}
e = elem[i];
int j;
for (j = i; j < length ; j++){
elem[j] = elem[j+1];
}
length--;
return OK;
}
Status priorElem(ElemType e,ElemType& pre_e,int (*cmp)(ElemType,ElemType)){
int i;
for(i = 0 ; i < length;i++){
if(cmp(elem[i],e)==0){
break;
}
}
if(i != 0 && i < length){
pre_e = elem[i-1];
return OK;
}
return ERROR;
}
Status NextElem(ElemType e,ElemType& next_e,int (*cmp)(ElemType,ElemType)){
int i;
for(i = 0 ; i < length;i++){
if(cmp(elem[i],e)==0){
break;
}
}
if(i != length - 1 && i < length){
next_e = elem[i+1];
return OK;
}
return ERROR;
}
void printinfo(ElemType e){
cout<< e <<endl;
};
int intp(int x,int y){
return x - y;
}
int main()
{
sqList sqlist;
sqlist.intoList();
for(int i = 0 ; i < 20; i++ ){
sqlist.ListInsert(i,i*i);
}
int abc;
//sqlist.deleteList(2,abc);
sqlist.ListTraverse(printinfo);
sqlist.priorElem(9,abc,intp);
cout<< abc << endl;
return 0;
}