数据结构之——C++顺序表

来源:互联网 发布:淘宝商城收费标准 编辑:程序博客网 时间:2024/06/15 02:22

顺序表可以说是最基础的数据结构,在此用C++实现,代码可能会有瑕疵,还请大神指正。

#include <iostream> #define Status int#define TRUE 1#define FALSE 0#define OVERFLOW -1#define MAX_LENGTH 3using 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;}


1 0
原创粉丝点击