顺序表可以说是最基础的数据结构,在此用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; }