• 数据结构之顺序表(C++版)


    #include <iostream>
    #include <stdlib.h>
    #define MAXLISTSIZE 100 //预设的存储空间最大容量

    using namespace std;
    typedef string ElemType;
    typedef struct{
    ElemType *elem; //存储空间基址
    int length; //当前长度
    int listsize; //允许的最大存储容量(以sizeof(ElemType)为单位)
    }SqList; //俗称顺序表

    void InitList(SqList &L);
    void LocateElem(SqList L);
    void ListInsert(SqList &L);
    void ListDelete(SqList &L);
    void DestroyList(SqList &L);
    void ListLength(SqList L);
    void ListEmpty(SqList L);
    void GetElem(SqList L);
    void MergeList_Sq();

    int main(void)
    {
    SqList L;
    int z;
    cout << "+---------------------------+" << ' ';
    cout << "|----------顺序表-----------|" << ' ';
    cout << "+---------------------------+" << ' ';
    cout << "提示:为保证您的操作得到保存,请按正常顺序退出系统^_^" << ' ';
    do
    {
    cout << ' ' << ' ' << ' ' << ' ' <<"--------------------------------" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ 主菜单 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"+--------------------------------" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ [1]----顺序表初始化 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ [2]----顺序表的定位 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ [3]----顺序表的插入 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ [4]----顺序表的删除 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ [5]----顺序表的销毁 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ [6]----顺序表求表长 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ [7]----顺序表的判空 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ [8]----顺序表的存取 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ [9]----顺序表的合并 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"+ [0]----退出系统 |" << ' ';
    cout << ' ' << ' ' << ' ' <<"--------------------------------" << ' ';
    cout << "请输入您的选择:";
    cin >> z;
    switch(z)
    {
    case 0 : break;
    case 1 : InitList(L);break;
    case 2 : LocateElem(L);break;
    case 3 : ListInsert(L);break;
    case 4 : ListDelete(L);break;
    case 5 : DestroyList(L);break;
    case 6 : ListLength(L);break;
    case 7 : ListEmpty(L);break;
    case 8 : GetElem(L);break;
    case 9 : MergeList_Sq();break;
    default:cout << "无效选项!" << ' ';system("pause");
    }
    }
    while(z!= 0);
    }

    //顺序表的初始化赋值
    void InitList(SqList &L)
    {
    int j;
    int maxsize;
    cout << "请输入顺序表的最大长度: ";
    cin >> maxsize;
    if(maxsize == 0)
    maxsize = MAXLISTSIZE;
    L.elem = new ElemType[maxsize];
    if(!L.elem) exit(1); //储存分配失败
    cout << "请输入顺序表的长度: ";
    cin >> L.length;
    L.listsize = maxsize; //该顺序表可以存储元素的最大容量
    cout << "请输入顺序表的元素: ";
    for (j = 0; j < L.length; j++)
    {
    cin >> L.elem[j];
    }
    system("pause"); //任意键继续
    }//InitList


    void LocateElem(SqList L)
    {
    ElemType e;
    int j;
    //在顺序表L中查找第一个值与e相等的元素,若存在输出该元素的位置,若不存在,输出所找的元素不存在
    j = 0; //j的初值为第一个元素的位序
    cout << "请输入要查找的元素:";
    cin >> e;
    while(j < L.length && L.elem[j] != e)

    ++j; //依次进行判定
    if(j < L.length) cout << "所找元素的位置为:" << j + 1; //找到满足判定条件的数据元素为第j个元素
    else cout << "所找的元素不存在"; //该线性表中不存在满足判定的数据元素
    cout << ' ';
    system("pause");
    }//LocateElem


    void ListInsert(SqList &L)
    {
    int j;
    int pos;
    ElemType e;
    cout << "请输入所要插入的位置及元素:";
    cin >> pos >>e;
    //若存储空间不满且1 <= pos <= Listlength(L) + 1,则在顺序表L的第pos个元素之前插入元素e,输出插入元素后的顺序表
    if(pos < 1 || pos > L.length + 1)
    {
    cout << "插入位置不合法" << ' '; //插入位置不合法
    system("pause");
    return;
    }
    if(L.length >= L.listsize)
    {
    cout << "当前存储空间已满,无法插入,请重新选择顺序表功能" << ' '; //当前存储空间已满,无法插入
    system("pause");
    return;
    }
    for(j = L.length - 1; j >= pos - 1; --j)
    L.elem[j + 1] = L.elem[j]; //插入位置之后的元素右移
    L.elem[pos - 1] = e; //插入e
    ++L.length; //表长增1
    cout << "插入后的顺序表:";
    for (j = 0; j < L.length; j++)
    {
    cout << L.elem[j] << ' ';
    }
    cout << ' ';
    system("pause");
    }//ListInsert

    void ListDelete(SqList &L)
    {
    int j;
    int pos;
    cout << "请输入所要删除元素的位置: ";
    cin >> pos;
    //若1 <= pos <= Listlength(L).则在顺序表L中删除第pos个元素,输出删除后的顺序表
    if(pos < 1 || pos > L.length)
    {
    cout << "删除位置不合法 "; //删除位置不合法
    system("pause");
    return;
    }
    for(j = pos; j < L.length; ++j)
    L.elem[j - 1] = L.elem[j]; ///被删除元素之后的元素左移
    --L.length; //表长减1
    cout << "删除后的顺序表:";
    for (j = 0; j < L.length; j++)
    {
    cout << L.elem[j] << ' ';
    }
    cout << ' ';
    system("pause");
    }//ListDelete

    void DestroyList(SqList &L)
    {
    //释放顺序表L所占存储空间
    delete[] L.elem;
    L.listsize = 0;
    L.length = 0;
    cout << "顺序表已销毁" << ' ';
    system("pause");
    }//DestroyList_Sq

    void ListLength(SqList L)
    {
    cout << "表长为:" << L.length << ' ';
    system("pause");
    }

    void ListEmpty(SqList L)
    {
    if(L.length == 0)
    cout << "该顺序表为空" << ' ';
    else
    cout << "该顺序表不为空" << ' ';
    system("pause");
    }

    void GetElem(SqList L)
    {
    int j;
    cout << "取出顺序表元素的位置:";
    cin >> j;
    if(j < 1 || j > L.length)
    {
    cout << "取出位置不合法" << ' '; //取出位置不合法
    system("pause");
    return;
    }
    cout << "取出的元素为:" << L.elem[j - 1] << ' ';
    system("pause");
    }
    void MergeList_Sq()
    {
    //输入有序顺序表La,Lb.归并为Lc.输出Lc
    SqList La; SqList Lb; SqList Lc;
    int i, j, k; int maxsize;
    maxsize = MAXLISTSIZE;
    La.elem = new ElemType[maxsize];
    Lb.elem = new ElemType[maxsize];
    Lc.elem = new ElemType[maxsize];
    if(!La.elem || !Lb.elem || !Lc.elem) exit(1); //储存分配失败
    cout << "请输入顺序表La的长度: ";
    cin >> La.length;
    La.listsize = maxsize; //该顺序表可以存储元素的最大容量
    cout << "请输入顺序表的元素: ";
    for (j = 0; j < La.length; j++)
    {
    cin >> La.elem[j];
    }
    cout << "请输入顺序表Lb的长度: ";
    cin >> Lb.length;
    Lb.listsize = maxsize; //该顺序表可以存储元素的最大容量
    cout << "请输入顺序表的元素: ";
    for (j = 0; j < Lb.length; j++)
    {
    cin >> Lb.elem[j];
    }
    Lc.listsize = Lc.length = La.length + Lb.length;

    for(i = 0, j = 0, k = 0; i < La.length && j < Lb.length; k++)
    if(La.elem[i] <= Lb.elem[j])
    {
    Lc.elem[k] = La.elem[i];
    i++;
    }
    else
    {
    Lc.elem[k] = Lb.elem[j];
    j++;
    }
    while(i < La.length)
    {
    Lc.elem[k] = La.elem[i];
    i++, k++;
    } //插入La的剩余元素
    while(j < Lb.length)
    {
    Lc.elem[k] = Lb.elem[j];
    j++, k++;
    } //插入Lb的剩余元素
    cout << "合并后的顺序表Lc为:";
    for (j = 0; j < Lc.length; j++)
    {
    cout << Lc.elem[j] << ' ';
    }
    cout << ' ';
    system("pause");
    }//MergeList_Sq

  • 相关阅读:
    Shell 丢弃错误和输出信息
    awk 循环过滤EPC脚本
    Tornado 异步浅解
    返回顶部
    Tornado 的安全性保障机制Cookie XSRF跨站请求伪造阻断 &用户验证机制
    Nginxre quest_time 和upstream_response_time
    Tornado WEB服务器框架 Epoll-- 【Mysql数据库】
    Tornado WEB服务器框架 Epoll-- 【模板】
    常见的SQL等价改写
    redis配置信息详解
  • 原文地址:https://www.cnblogs.com/wwttsqt/p/7783173.html
Copyright © 2020-2023  润新知