顺序表可以说是最基础的数据结构,在此用C++实现,代码可能会有瑕疵,还请大神指正。
#include <iostream>
#define Status int
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define MAX_LENGTH 3
using namespace std;
typedef int (*pf)(const int& a,const int& b);
typedef struct ElemType{
int id;
int key;
}ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SQ_LIST;
/**
* 比较两个整数值
*/
Status cmp(const int& a,const int& b){
return a==b;
}
/**
* 初始化顺序表
*/
void InitList(SQ_LIST *L){
L->elem = new ElemType[MAX_LENGTH];
L->length = 0;
L->listsize = MAX_LENGTH;
}
/**
* 清空顺序表
*/
Status ClearList(SQ_LIST *L){
L->length = 0;
L->listsize = 0;
}
/**
* 销毁顺序表
*/
void DestroyList(SQ_LIST *L){
delete []L->elem;
ClearList(L);
}
/**
* 返回顺序表长度
*/
Status ListLength(SQ_LIST L){
return L.length;
}
/**
* 判断顺序表是否为空
*/
Status IsEmpty(SQ_LIST L){
return 0 == L.length;
}
/**
* 获取指定位序的元素
*/
ElemType * GetElem(SQ_LIST L, int i){
if(i<1 || i>L.length) return FALSE;
return &L.elem[i];
}
/**
* 定位关键字所在的位序
*/
Status LocateElem(SQ_LIST *L, int key, pf cmp){
for(int i = 1; i<= L->length; i++){
if(cmp(key, L->elem[i].key)){
return L->elem[i].id;
}
}
return FALSE;
}
/**
* 插入新元素
*/
Status ListInsert(SQ_LIST *L, int i, ElemType elem){
if(L->length >= L->listsize) return OVERFLOW;
if(i<1 || i> L->length) return FALSE;
for(int n = L->length; n>i; n--){
L->elem[n] = L->elem[n-1];
}
elem.id = i;
L->elem[i] = elem;
L->length++;
return TRUE;
}
/**
* 删除元素
*/
Status ListDelete(SQ_LIST *L, int i, ElemType *elem){
if(i<1 || i> L->length) return FALSE;
elem = &L->elem[i];
for(int n = i;n< L->length; n++){
L->elem[n] = L->elem[n+1];
}
L->length--;
return TRUE;
}
/**
* 对顺序表关键字逆置
*/
void ListReverse(SQ_LIST *L){
int i = 1, j = L->length;
ElemType temp;
while(i < j) {
temp = L->elem[i];
L->elem[i].key = L->elem[j].key;
L->elem[j].key = temp.key;
i++; j--;
}
}
/**
* 输出表数据
*/
void ListOutput(SQ_LIST L){
cout<<"表中数据为:"<<endl;
cout<<"id\tkey"<<endl;
for(int i = 1; i<= L.length; i++){
cout<<L.elem[i].id<<"\t"<<L.elem[i].key<<endl;
}
}
/**
*追加数据(用于初始化数据)
*/
Status ListAppend(SQ_LIST *L, ElemType elem){
L->elem[++L->length] = elem;
if(L->length >= L->listsize) return OVERFLOW;
return TRUE;
}
int main(){
ElemType elem;
SQ_LIST L;
InitList(&L);
int i = 1;
do{
cout<<"请输入数据"<<endl;
elem.id = i;
cin>>elem.key;
if(OVERFLOW == ListAppend(&L, elem)){
cout<<"数据插入完成"<<endl;
break;
}
i++;
} while(TRUE);
ElemType *nelem = GetElem(L, 2);
if(nelem){
cout<<"位序为2的元素为, id: "<<nelem->id<<", key: "<<nelem->key<<endl;
}else{
cout<<"没有此元素"<<endl;
}
// 逆置
ListReverse(&L);
ListOutput(L);
if(TRUE == LocateElem(&L, 2, &cmp)){
cout<<"位序为2的id为 "<< LocateElem(&L, 2,&cmp)<<endl;
}
// 删除元素(删除第一个元素)
int flag = ListDelete(&L, 1, &elem);
if(flag){
cout<<"删除成功, id: "<<elem.id<<",key: "<<elem.key<<endl;
}else{
cout<<"删除元素失败,此位置未定义元素"<<endl;
}
// 插入元素
elem.key = 7;
flag = ListInsert(&L, 1, elem);
if(flag){
cout<<"插入成功,id: "<<elem.id<<",key: "<<elem.key<<endl;
}
// 清空表
if(! IsEmpty(L) && ClearList(&L)){
cout<<"表已被清空,当前表长度为 "<<ListLength(L)<<endl;
}
// 释放元素
DestroyList(&L);
return 0;
}