rinetd wpf pointers bluetooth Modernizr webpack视频 js获取数组第一个元素 pytorch安装教程 iot系统 java 数据分析 kubernetes集群搭建 python模块 python网络编程 python3基础教程 python当前日期 python安装环境变量 javapackage java框架 java的集合框架 java如何连接mysql java删除 java系统学习 主板排名天梯图 cg模宝 mathcad15 批处理if 微信骰子表情包 猫眼电影票 关闭页面 谷歌浏览器访问助手 win7仿win8主题 摇骰子表情包 大势至usb控制系统 轮播图代码 c4dr20 mysql退出命令 街机roms下载 大话5g 括号符号大全 电脑防护软件
当前位置: 首页 > 学习教程  > 编程语言

线性表的顺序存储结构基本实现

2020/12/5 10:26:18 文章标签:

以下代码是按照严蔚敏版的数据结构命名格式写的数据结构基本实现,线性表的定义是按照书上写的,操作具体实现方法是我自己写的,分为两个部分,一个部分是操作集部分,另一个部分是测试用代码部分,目前我已经基…

以下代码是按照严蔚敏版的数据结构命名格式写的数据结构基本实现,线性表的定义是按照书上写的,操作具体实现方法是我自己写的,分为两个部分,一个部分是操作集部分,另一个部分是测试用代码部分,目前我已经基本测试完毕,功能全部可用且正确,欢迎大家学习指正。如能帮到大家,我非常高兴。

1.操作集:linear_list.h

#include <cstdlib>
#define MaxSize 100

typedef struct {
    int *data_elem;
    int length;
}SqList;//线性表定义,一个数据体指针,一个长度

void InitList(SqList &L){
    L.data_elem = (int*)malloc(sizeof(int)*MaxSize);
    L.length = 0;
}//此函数用于将一个线性表初始化,这里实现比较粗糙,大家明白基本原理就好,因为没有做成一个逻辑严谨的系统,只是基本操作的理解。

void DestoryList(SqList &L){
    free(L.data_elem);
    L.length = 0;
}//此函数是销毁操作,对于垃圾回收,我们用malloc定义的数据指针是可以用free操作回收的,但是用户自己直接定义的变量是系统在进程结束时自动释放的

void ClearList(SqList &L){
    L.length = 0;
}//此函数用于清空整个表,我们将长度指针清零就相当于清空了,非常简单

bool ListEmpty(SqList L){
    if(L.length==0)
        return true;
    else
        return false;
}//此函数用于判空,我们通过长度进行判空,也非常简单

int ListLength(SqList L){
    return L.length;
}//此函式用于求表长,我们因为有记录长度的指针所以这一步非常简单

void GetElem(SqList L, int i, int &e){
    i--;
    if(i>=L.length||i<0)
        e = -1;
    else
        e = *(L.data_elem +  i);
}//此函数用于按照下标取值:函数外部的下标时从1开始的,而在函数内部也就是直接对数组操作的部分的下标是从0开始的,这里有一个i--,用来消除内外的不同

int LocateElem(SqList L, int e){
    for(int i = 0; i < L.length; i++){
        if(e == *(L.data_elem + i))
            return i + 1;
    }
    return -1;
}//此函式用于通过具体值找位置,这里内部直接对数组操作,所以下标是从0开始的,但是这个结果要返回到外部,所以我们需要加1,消除差异。

void PriorElem(SqList L, int cur_e,int &pre_e){
    int i = LocateElem(L,cur_e);//在此获得的i是一个用户i,从1开始
    //操作间相互是屏蔽的
    GetElem(L,i-1,pre_e);
}//找前驱的函数,这里直接调用两个函数,注意在函数内部已经都有消除差异的操作,所以二者是完全相互屏蔽的,可以直接使用,外部无需再加任何操作

void NextElem(SqList L, int cur_e,int &next_e){
    int i = LocateElem(L,cur_e),ne;
    GetElem(L,i+1,next_e);
}//找后继的函数,原理和找前驱一样

void Listinsert(SqList &L, int i, int e){
    i--;
    if(i <= L.length && i>=0 && 1 + L.length <= MaxSize){
        for(int j = L.length - 1; j>=i; j--)
            *(L.data_elem + j + 1) = *(L.data_elem + j);
        *(L.data_elem+i) = e;
        L.length += 1;
    }else{
        std::cout << "Error input!" << std::endl;
    }

}//在一个位置上插入一个元素,插一个后边的都要移动,不怎么方便,所以引出了链表

void ListDelete(SqList &L, int i){
    i--;
    if(i < L.length && i>=0 && L.length - 1 >= 0 ){
        for(int j = i; j<L.length-1; j++){
            *(L.data_elem + j) = *(L.data_elem + j + 1);
        }
        L.length--;
    }else{
        std::cout << "Error input!" << std::endl;
    }
}//删除一个元素的函数,删一个同样后边的都要移动,不怎么方便

void TraverseList(SqList L){
    for(int i = 0; i < L.length ;i++){
        std::cout << *(L.data_elem + i) << " " << std::endl;
    }
}//遍历函数,这里我遍历输出了

int menu(){
    std::cout << "1.初始化 "
                 "2.销毁 "
                 "3.清空 "
                 "4.判空 "
                 "5.求长 "
                 "6.取值 "
                 "7.定位 "
                 "8.前驱 "
                 "9.后继 "
                 "10.插入 "
                 "11.删除 "
                 "12.输出 "
                 "0.退出" << std::endl;
    int flag;
    std::cout << "请你输入你想要的操作:" << std::endl;
    std::cin >> flag;
    return flag;
}//输出一个操作目录,简单的用户交互

2.测试用代码:main.cpp

#include <iostream>
#include "linear_list.h"

using namespace std;
int main() {
    SqList L;
    while(1){
        int flag = menu();
        if(flag==0){
            break;
        }else if(flag == 1){
            InitList(L);
        }else if(flag == 2){
            DestoryList(L);
        }else if(flag == 3){
            ClearList(L);
        }else if(flag == 4){
            if(ListEmpty(L))
                cout << "empty" << endl;
            else
                cout << "unempty" << endl;
        }else if(flag == 5){
            cout << ListLength(L) << endl;
        }else if(flag == 6){
            cout << "Please input the value you want to search:" << endl;
            int e,i;
            cin >> i;
            GetElem(L,i,e);
            cout << e << endl;
        }else if(flag == 7){
            cout << "Please input the location you want to identity:" << endl;
            int e,v;
            cin >> e;
            v = LocateElem(L,e);
            if(v!=-1)
                cout << "The location of you value is:" << v << endl;
            else
                cout << "There no value you input Location!" << endl;
        }else if(flag == 8){
            cout << "Please input a value you want to find the prior value:" << endl;
            int e,pe;
            cin >> e;
            PriorElem(L,e,pe);
            if(pe != -1){
                cout << "Prior value is:" << pe << endl;
            }else{
                cout << "There no a prior of you input value!" << endl;
            }
        }else if(flag == 9){
            cout << "Please input a value you want to find the next value:" << endl;
            int e,ne;
            cin >> e;
            NextElem(L,e,ne);
            if(ne != -1){
                cout << "Next value is:" << ne << endl;
            }else{
                cout << "There no a next of you input value!" << endl;
            }
        }else if(flag == 10){
            cout << "Please input the value you want to insert:" << endl;
            int e;
            cin >> e;
            cout << "Please input the location you want to insert:" << endl;
            int loc;
            cin >> loc;
            Listinsert(L, loc, e);
        }else if(flag == 11){
            cout << "Please input the location you want to delete" << endl;
            int loc;
            cin >> loc;
            ListDelete(L,loc);
        }else if(flag == 12){
            TraverseList(L);
        }else{
            cout << "Error input!" << endl;
        }
    }
    return 0;
}

 


本文链接: http://www.dtmao.cc/news_show_450223.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?