数据结构笔记之顺序表

来源:互联网 发布:ios网络视频播放代码 编辑:程序博客网 时间:2024/05/22 10:52

顺序表

1.定义:用一组地址连续的存储单元依次存储线性表的数据元素的表。

这里写图片描述
由上图可以看出元素地址满足以下关系:这里写图片描述

2.类型定义

以图书数据举例,其类型定义如下:

#define MAXSIZE 100 //最大长度typedef struct      {    char no[20];    //图书ISBN    char name[20];  //图书名字    float price;    //图书价格}Book;              //图书结构类型typedef struct{     Book *elem;     //基地址    int length;     //图书个数}SqList;            //图书表结构类型

3.顺序表操作

3.1初始化

步骤
①为L分配一个预定义大小的数组空间,elem指向这段空间的基地址。
②将表的长度置为0。

Status InitList(SqList &L){    L.elem = new ElemType[MAXSIZE];    if(!L.elem) exit(OVERFLOW);    L.length = 0;    return OK;}

3.2取值

步骤
①判断i值合不合理。
②将第i个元素即L.elem[i-1]赋给e。

Status GetElem(SqList L,int i,ElemType &e){        if(i<1 || i>L.length)    return ERROR;        e = L.elem[i-1];        return OK;}

3.3查找

步骤
①从第一个元素开始,依次比较,若相等返回i+1,若比较到最后也没有找到则查找失败,返回0。

Status LocateElem(SqList L,ElemType e){    for(i=0;i<L.length;i++)        if(L.elem[i] == e)    return i+1;    return 0;}

查找平均时间复杂度O(n)

3.4插入

这里写图片描述
步骤
①判断插入位置是否合法。
②判断存储空间是否已满。
③从后往前从第n至i依次往移动,空出第i各位置。
④将元素插入第i个位置。

Status ListInsert(SqList &L,int i;ELemType e){    if((i<1) || (i>L.length+1))    return ERROR;    if(L.length == MAXSIZE)    return ERROR;    for(j=L.length-1;j>=i-1;j--)        L.elem[j+1] = L.elem[j];    L.elem[i-1] = e;    ++L.length;    return OK;}

平均时间复杂度O(n)

3.5删除

这里写图片描述
步骤
①判断i是否合法。
②将第i+1个至n依次前移。
③表长减1。

Status ListDelete(SqList &L, int i){    if(i<1 || i>L.length)    retrun ERROR;    for(j=i;j<Length-1;j++)        L.elem[j-1]=L.elem[j];    --L.length;    return OK;}

平均时间复杂度O(n)

3.6销毁线性表L

void DestroyList(SqList &L){  if (L.elem) delete[]L.elem;    //释放存储空间}

3.7清空线性表

void ClearList(SqList &L) {   L.length=0;                //将线性表的长度置为0}

4.完整代码

#include<iostream>#include<fstream>#include<string>#include<iomanip>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型#define MAXSIZE 100         //顺序表可能达到的最大长度struct Book {    string id;//ISBN    string name;//书名    double price;//定价};typedef struct {    Book *elem; //存储空间的基地址    int length; //当前长度} SqList;Status InitList_Sq(SqList &L) { //算法2.1 顺序表的初始化    //构造一个空的顺序表L    L.elem = new Book[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间    if (!L.elem)        exit(OVERFLOW); //存储分配失败退出    L.length = 0; //空表长度为0    return OK;}Status GetElem(SqList L, int i, Book &e) {//算法2.2 顺序表的取值    if (i < 1 || i > L.length)        return ERROR; //判断i值是否合理,若不合理,返回ERROR    e = L.elem[i - 1]; //elem[i-1]单元存储第i个数据元素    return OK;}int LocateElem_Sq(SqList L, double e) { //算法2.3 顺序表的查找    //顺序表的查找    for (int i = 0; i < L.length; i++)        if (L.elem[i].price == e)            return i + 1;//查找成功,返回序号i+1    return 0;//查找失败,返回0}Status ListInsert_Sq(SqList &L, int i, Book e) { //算法2.4 顺序表的插入    //在顺序表L中第i个位置之前插入新的元素e    //i值的合法范围是1<=i<=L.length+1    if ((i < 1) || (i > L.length + 1))        return ERROR; //i值不合法    if (L.length == MAXSIZE)        return ERROR; //当前存储空间已满    for (int j = L.length - 1; j >= i - 1; j--)        L.elem[j + 1] = L.elem[j]; //插入位置及之后的元素后移    L.elem[i - 1] = e; //将新元素e放入第i个位置    ++L.length; //表长增1    return OK;}Status ListDelete_Sq(SqList &L, int i) { //算法2.5 顺序表的删除    //在顺序表L中删除第i个元素,并用e返回其值    //i值的合法范围是1<=i<=L.length    if ((i < 1) || (i > L.length))        return ERROR; //i值不合法    for (int j = i; j <= L.length; j++)        L.elem[j - 1] = L.elem[j]; //被删除元素之后的元素前移    --L.length; //表长减1    return OK;}int main() {    SqList L;    int i = 0, temp, a, c, choose;    double price;    Book e;    string head_1, head_2, head_3;    cout << "1. 建立\n";    cout << "2. 输入\n";    cout << "3. 取值\n";    cout << "4. 查找\n";    cout << "5. 插入\n";    cout << "6. 删除\n";    cout << "7. 输出\n";    cout << "0. 退出\n\n";    choose = -1;    while (choose != 0) {        cout << "请选择:";        cin >> choose;        switch (choose) {        case 1://创建顺序表            if (InitList_Sq(L))                cout << "成功建立顺序表\n\n";            else                cout << "顺序表建立失败\n\n";            break;        case 2: {//顺序表信息输入            i = 0;            L.elem = new Book[MAXSIZE];            if (!L.elem)                exit(OVERFLOW);            L.length = 0;            fstream file;            file.open("book.txt");            if (!file) {                cout << "错误!未找到文件!" << endl;                exit(ERROR);            }            file >> head_1 >> head_2 >> head_3;            while (!file.eof()) {                file >> L.elem[i].id >> L.elem[i].name >> L.elem[i].price;                i++;            }            cout << "输入 book.txt 信息完毕\n\n";            L.length = i;            file.close();        }            break;        case 3://顺序表的取值            cout << "请输入一个位置用来取值:\n";            cin >> i;            temp = GetElem(L, i, e);            if (temp != 0) {                cout << "查找成功\n";                cout << "第" << i << "本图书的信息是:\n";                cout << left << setw(15) << e.id << "\t" << left << setw(50)                        << e.name << "\t" << left << setw(5) << e.price << endl                        << endl;            } else                cout << "查找失败!位置超出范围\n\n";            break;        case 4: //顺序表的查找            cout << "请输入所要查找价格:";            cin >> price;            temp = LocateElem_Sq(L, price);            if (temp != 0) {                cout << "查找成功\n";                cout << "该价格对应的书名为:" << L.elem[temp - 1].name << endl << endl;            } else                cout << "查找失败!没有这个价格对应的书籍\n\n";            break;        case 5: //顺序表的插入            cout << "请输入插入的位置和书本信息,包括:编号 书名 价格(用空格隔开):";            cin >> a;            cin >> e.id >> e.name >> e.price; //输入a和b,a代表插入的位置,b代表插入的数值(书本信息)            if (ListInsert_Sq(L, a, e))                cout << "插入成功.\n\n";            else                cout << "插入失败.\n\n";            break;        case 6: //顺序表的删除            cout << "请输入所要删除的书籍的位置:";            cin >> c;            if (ListDelete_Sq(L, c))                cout << "删除成功.\n\n";            else                cout << "删除失败.\n\n";            break;        case 7: //顺序表的输出            cout << "当前图书系统信息(顺序表)读出:\n";            for (i = 0; i < L.length; i++)                cout << left << setw(15) << L.elem[i].id << "\t" << left                        << setw(50) << L.elem[i].name << "\t" << left                        << setw(5) << L.elem[i].price << endl;            cout << endl;            break;        }    }    return 0;}

5.顺序表的优缺点

这里写图片描述

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老公有外遇老婆不想离婚怎么办 结婚十年妻子出轨该怎么办 初生儿眼睛多眼屎怎么办 被丝袜脚摩擦过瘾了怎么办 老公在卧室装摄像头怎么办 听了鬼故事害怕怎么办 看完鬼片害怕睡不着怎么办 晚上看了鬼片怎么办 说话不经过大脑考虑怎么办 我太受欢迎了怎么办动漫结局 狗胃不好总呕吐怎么办 比格犬晚上叫怎么办 玻尿酸隆鼻变宽了怎么办 打玻尿酸鼻子变宽怎么办 鼻炎的人感冒了怎么办 小孩上幼儿园反复感冒怎么办 3岁宝宝感冒鼻炎怎么办 鼻炎犯了鼻子不通气怎么办 食物呛到鼻子里怎么办 胃疼引起的焦虑怎么办 泰迪犬发生口腔亏痒怎么办? 俩鼻子都堵了怎么办 2岁宝宝鼻甲肿大怎么办 感冒10多天不好怎么办 宝妈鼻炎犯了怎么办 鼻炎犯了好多黄鼻涕怎么办 空调吹多了上火怎么办 宝宝感冒鼻塞流鼻涕口臭怎么办 怀孕了有鼻息肉怎么办 孕晚期鼻炎犯了怎么办 孕妇鼻炎犯了头疼怎么办 一岁宝宝有鼻炎怎么办 蒸馒头的面酸了怎么办 dnf点券充错账号了怎么办 英雄联盟点券充错区了怎么办 文玩鼻烟壶盖子松了怎么办 文胸磨腋下的肉怎么办 荷兰在窝里拉屎怎么办 宝宝把泡沫吃了怎么办 荷兰猪一直叫该怎么办 人吃了缓冲泡沫怎么办