首页 > 编程语言 > 详细

基于C++的顺序表的使用

时间:2020-11-24 14:55:44      阅读:19      评论:0      收藏:0      [点我收藏+]

 

头文件的代码展示:

#ifndef header_h
#define header_h

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

#define  ok 1
#define error 0
#define overflow -2
#define list_init_size 100
#define listincrement 10

typedef int status;
typedef int elemtype;   

typedef struct {    //结构体
    elemtype* elem; //指针,用来存放顺序表
    int length;     //整型变量,用来表示顺序表的长度
    int listsize;   //整型变量,用来表示顺序表的容量
}sqlist;

status initlist_sq(sqlist& l);//创建顺序链表
status listinsert_sq(sqlist& l, int i, elemtype e);//顺序表的插入
status listdelete_sq(sqlist& l, int i, elemtype& e);//删除第i个位置的数据
void print(sqlist l);//输出顺序表
status destorylist(sqlist& l);//删除顺序表
status clearlist(sqlist& l);//清空顺序表中的元素
status listempty(sqlist l);//判断顺序表是否为空
status listlength(sqlist l);//返回顺序表的长度
status getelem(sqlist l, int i, elemtype& e); //获得第i个位置的元素
status loateelem(sqlist l, elemtype e);//查找与e元素的位置
void zhuye();//选择页面的输出

#endif

  

  主函数的代码展示:

#include "header.h"
int main()
{
    int i, j, n, m;
    sqlist la;
    int f;
    initlist_sq(la);
    while (1) {
        cout << "请选择你要需要的功能!" << endl;
        zhuye();
        cin >> f;
        system("cls");
        switch (f) {
        case 1:
            printf("请输入la顺序表的长度:");
            cin >> m;
            printf("输入la顺序表数据:");
            for (i = 1; i <= m; i++)
            {
                cin >> j;
                listinsert_sq(la, i, j);
            }

            cout << "顺序表la:";
            print(la);
            break;
        case 2:
            print(la);
            break;
        case 3:
            cout << "输入要插入的元素值:";
            cin >> i;
            cout << "输入要插入的位置:";
            cin >> j;
            listinsert_sq(la, j, i);
            cout << "输出插入元素后的顺序表la:";
            print(la);
            break;
        case 4:
            cout << "输入删除元素的位置:";
            cin >> i;
            listdelete_sq(la, i, j);
            cout << "删除元素的值为" << j;
            cout << "\n删除元素后的la:";
            print(la);
            break;

        case 5:
            cout << "顺序表的长度:" << listlength(la) << endl;
            break;

        case 6:
            cout << "\n输入查找的元素:";
            cin >> i;
            if (!loateelem(la, i))
                cout << "\n顺序表la中没有查找元素" << i << endl;
            else
                cout << "\n元素" << i << "在顺序表la中的位置为" << loateelem(la, i) << endl;
            break;

        case 7:
            cout << "\n输入要获取的元素的位置:";
            cin >> i;
            if (!getelem(la, i, n))
                cout << "\n输入位置不合法" << endl;
            else
                cout << "\n要获取的第" << i << "个元素" << "为" << n << endl;
            break;
        case 8:
            if (clearlist(la))
                cout << "\n顺序表la已经清空";
            cout << "\n顺序表la的长度为" << listlength(la) << endl;;
            if (destorylist(la))
                cout << "\n顺序表la被销毁" << endl;
            return 0;
            break;

        }
        system("pause");
        system("cls");
    }
    return 0;
}

  

  函数功能的代码分析:

#include "header.h"

status initlist_sq(sqlist& l) //创建顺序链表
{ 
    /*********begin1**********/
    l.elem = new elemtype[list_init_size];//创建顺序链表
    if (!l.elem) exit(overflow);        //判断顺序表是否创建成功
    l.length = 0;                       //初始化顺序表长度
    l.listsize = list_init_size;        //初始化顺序表容量
    return ok;                        
    /********end1************/
}




status listinsert_sq(sqlist& l, int i, elemtype e)//顺序表的插入
{
    /*********begin2**********/
    elemtype* q, * p, * s;                    //定义一个整型指针,用来存放顺序表
    if (i<1 || i>l.length + 1) return 0;    //判断插入的位置是否超出了顺序表的有效数据长度
    if (l.length >= list_init_size) {       //如果容量已满,则执行以下括号内的步骤
        s = (elemtype*)realloc(l.elem, (l.listsize + 10) * sizeof(elemtype));
        //创建一个新的顺序表(容量比原来多10),并将原来的数据复制给新的顺序表
        if (!s) exit(-2);                   //判断是否创建成功
        l.elem = s;                         //将原来的顺序表替换为新的顺序表
        l.listsize += 10;                   //将顺序表的容量在原来的基础上加10
    }
    q = &(l.elem[i - 1]);                   //将顺序表中第i个位置(即顺序表中的下标为i-1)的地址赋给q
    for (p = &(l.elem[l.length - 1]); p >= q; --p)
        *(p + 1) = *p;
   //将第i个之后的位置后移
    *q = e;                                 //将q中的数据替换成e
    ++l.length;                             //将长度加一
    return 1;

    /********end2************/

}



status listdelete_sq(sqlist& l, int i, elemtype& e)//删除第i个位置的数据
{
    /*********begin3**********/
    if (i<1 || i>l.length) return 0;//判断插入的位置是否超出了顺序表的有效数据长度
    elemtype* q, * p;               //定义一个整型指针
    q = &(l.elem[i - 1]);           //将顺序表中第i个位置(即顺序表中的下标为i-1)的地址赋给q
    e = *q;                         //将第i个位置的值给e
    p = l.elem + l.length - 1;      //将p指针指到顺序表的尾部
    for (++q; p >= q; ++q)          
        *(q - 1) = *q;
    //将第i个之后的数据前移
    --l.length;                     //长度减一
    return 1;
    /********end3************/

}

void print(sqlist l) {                  //输出顺序表
    int i;                                 //定义一个变量,用来表示顺序表的下标
    for (i = 0; i < l.length - 1; i++)      //从下标为0开始,一直到下标为长度减一
        cout << l.elem[i] << ‘ ‘;           //输出数据,并带上空格
    cout << l.elem[i]<<endl;                      //最后一个不输出空格
}

status destorylist(sqlist& l)//删除顺序表
{
    free(l.elem);           //删除l.elem指针
    return ok;
}

status clearlist(sqlist& l)//清空顺序表中的元素
{
    l.length = 0;           //直接赋值为0即可
    return ok;
}

status listempty(sqlist l)//判断顺序表是否为空
{
    if (l.length == 0)  
        return 1;
    else
        return 0;
    //如果为空,则返回1,否则返回0
}

status listlength(sqlist l) //返回顺序表的长度
{
    return l.length;
}
status getelem(sqlist l, int i, elemtype& e)    //获得第i个位置的元素
{
    /*********begin4**********/
    if (i<1 || i>l.length) return 0;//判断插入的位置是否超出了顺序表的有效数据长度
    e = l.elem[i - 1];              //将顺序表中第i个位置(即顺序表中的下标为i-1)的元素赋给e
    return 1;

    /********end4************/
}

status loateelem(sqlist l, elemtype e)  //查找与e元素的位置
{
    /*********begin5**********/
    for (int i = 0; i < l.length; i++)
        if (l.elem[i] == e) return i + 1; 
    return 0;

    /********end5************/
}

void zhuye()//选择页面的输出
{
    cout << "输入1:在顺序表中添加数据" << endl;
    cout << "输入2:查看顺序表的所有元素" << endl;
    cout << "输入3:在顺序表中插入数据" << endl;
    cout << "输入4:在顺序表中删除数据" << endl;
    cout << "输入5:查看顺序表的长度" << endl;
    cout << "输入6:通过元素查找顺序表中的数据" << endl;
    cout << "输入7:通过位置查看顺序表中的数据" << endl;
    cout << "输入8:推出" << endl;
    cout << "请输入:";
}

  

基于C++的顺序表的使用

原文:https://www.cnblogs.com/cheng111/p/14029735.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!