顺序表基本操作及应用-数据结构类C语言

目录

一、顺序表相关函数声明(before.h)

二、顺序表功能函数定义(func.cpp)

三、顺序表主调函数(main.cpp)

四、运行环境


一、顺序表相关函数声明(before.h)

#ifndef _BEFORE_H
#define _BEFORE_H

typedef int ElemType;
typedef int status;

#define InitSize 10000
#define OK 1
#define ERR 0
#define OVERFLOW (-1)

typedef int ElemType;
typedef int status;

typedef struct {
    ElemType *data;           //指示动态分配数组的指针
    int MaxSize;              //顺序表的最大容量
    int length;               //顺序表的当前长度
}SqList;//顺序表的类型定义动态分配的方式

//顺序表的函数声明
status InitList(SqList &L);                                //建立空的顺序表
status ListEmpty(SqList L);                                //判断顺序表是否为空
status ListLength(SqList L);                               //求顺序表的长度
status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e); //查找直接前驱
status NextElem(SqList L,ElemType cur_e,ElemType &next_e); //查找直接后继
status GetElem(SqList L,int i);                            //查找第i位元素值
status LocateElem(SqList L,int e);                         //查找某元素值位序
status ListTraverse(SqList &L);                            //逆置顺序表
status ClearList(SqList &L);                               //清空顺序表
status DestroyList(SqList &L);                             //销毁顺序表
status CreatElem(SqList &L);                               //创建顺序表
status ListInsert(SqList &L,int i,int e);                  //插入元素
status ListDelete(SqList &L,int i,int &e);                 //删除元素
void PrintList(SqList L);                                  //输出顺序表所有元素

//菜单调用函数声明
void Menu_SqList();

#endif
//
//Created by somewon on 2022/9/29.
//

二、顺序表功能函数定义(func.cpp)

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

using namespace std;

//顺序表的相关函数定义
status InitList(SqList &L)
{
    //用malloc申请连续的内存空间
    L.data = (ElemType *)malloc(sizeof(ElemType)*InitSize);
    L.length = 0;             //顺序表初始长度为0
    L.MaxSize = InitSize;
    return OK;
}//建立一个空表

status ListEmpty(SqList L)
{
    if(L.length == 0) return OK;
    else return ERR;
}//判断顺序表是否为空

status ListLength(SqList L)
{
    return (L.length);
}

status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
{
    int j = LocateElem(L,cur_e);     //返回cur_e值的位序
    if(j!=ERR && j>2)
    {
        pre_e = L.data[j-2];
        return OK;
    }
    else if(j == ERR) return OVERFLOW;  //不在顺序表中
    else if(j == 1) return ERR;         //首位无直接前驱
}

status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
{
    int j = LocateElem(L,cur_e);
    if(j!=ERR && j<L.length)
    {
        next_e = L.data[j];
        return OK;
    }
    else if(j == ERR) return OVERFLOW; //不在顺序表中
    else if(j == L.length) return ERR; //末位无直接后继
}

status GetElem(SqList L,int i)
{
    if(i<=L.length) return L.data[i-1];
    else return ERR;
}//动静态存储是一样的

status LocateElem(SqList L,int e)
{
    for(int i = 0;i < L.length;i ++)
        if(L.data[i] == e) return i+1;
    return ERR;
}

status ListTraverse(SqList &L)
{
    int i,temp;
    for(i = 0;i < L.length/2;i ++)
    {
        temp = L.data[i];
        L.data[i] = L.data[L.length-1-i];
        L.data[L.length-1-i] = temp;
    }
    return OK;
}//逆置顺序表

status ClearList(SqList &L)
{
    L.length = 0;
    return OK;
}//清空顺序表(只是无法访问而已,数据还在)

status DestroyList(SqList &L)
{
    delete[] L.data;
    return OK;
}//释放顺序表的空间(已经无法访问,数据不在)

status CreatElem(SqList &L)
{
    int cnt = 0;
    ElemType x;
    cin >> x;
    while(x != -1)
    {
        L.data[cnt] = x;
        cnt ++;
        cin >> x;
    }
    L.length = cnt;

    return OK;
}//创建顺序表

status ListInsert(SqList &L,int i,int e)
{
    if(i<1 || i>L.length+1) return ERR;  //判断i是否合理
    if(L.length >= L.MaxSize) return ERR;  //当前存储空间已满,不能插入
    for(int j = L.length;j >= i;j --) L.data[j] = L.data[j-1]; //将第i个元素及之后的元素后移
    L.data[i-1] = e;
    L.length ++;
    return OK;
}//在第i位置上插入元素e

status ListDelete(SqList &L,int i,int &e)
{
    if(i<1 || i>L.length) return ERR;      //判断i值是否合理
    e = L.data[i-1];                       //将删除的值赋给e
    for(int j = i;j < L.length;j ++)
        L.data[j-1] = L.data[j];
    L.length --;                           //长度减少一
    return OK;
}//删除第i个元素

void PrintList(SqList L)
{
    if(L.length == 0) printf("该表目前为空表!\n");
    else
    {
        printf("--当前顺序表中的元素为:\n");
        int numb = 0;
        for(int i = 0;i < L.length;i ++)
        {
            printf("%d\t",L.data[i]);
            numb ++;
            if(numb%7 == 0) printf("\n");
        }
        printf("\n");
    }
}//打印顺序表

//菜单定义
void Menu_SqList()
{
    printf("\t\t\t************************以下为顺序表的菜单*******************************\n");
    printf("\t\t\t\t1、建立空表                       2、创建顺序表                       \n");
    printf("\t\t\t\t3、判断顺序表是否为空              4、查看顺序表的长度                  \n");
    printf("\t\t\t\t5、查看某元素的直接前驱            6、查看某元素的直接后继               \n");
    printf("\t\t\t\t7、查看某位置的数据元素            8、查看某元素的对应位置               \n");
    printf("\t\t\t\t9、将顺序表逆置                   10、清空顺序表                       \n");
    printf("\t\t\t\t11、销毁顺序表                    12、插入元素                         \n");
    printf("\t\t\t\t13、删除元素                      14、输出顺序表所有元素                \n");
    printf("\t\t\t\t15、退出操作系统                                                      \n");
    printf("\t\t\tTips:只有进行完1、2操作之后才能进行后续操作,否则程序出现崩溃!              \n");
    printf("\t\t\t*************************************************************************\n");
}
//
//Created by somewon on 2022/9/29.
//

三、顺序表主调函数(main.cpp)

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

using namespace std;

int main() {
    SqList L;
    ElemType cur_e,cur_ee,pre_e,next_e,e;
    int order,choice,fine;
    do{
        Menu_SqList();   //打印对应函数说明菜单
        printf("请输入你的选择: ");
        cin >> choice;
        switch(choice)
        {
            case 1:
                if(InitList(L) == OK) printf("空表建立成功!\n");
                else printf("空表建立失败!请再次尝试!\n");
                break;
            case 2:
                printf("请输入顺序表中的元素,直至-1停止:\n");
                if(CreatElem(L) == OK)
                {
                    printf("创建顺序表成功!\n");
                    PrintList(L);
                }
                else printf("创建顺序表失败!\n");
                break;
            case 3:
                if(ListEmpty(L) == OK) printf("该表为空表!\n");
                else printf("该表不为空!\n");
                break;
            case 4:
                printf("该表的长度为%d!\n",ListLength(L));
                break;
            case 5:
                printf("请输入需要查询直接前驱的元素值: ");
                cin >> cur_e;
                pre_e = -1;
                fine = PriorElem(L,cur_e,pre_e);
                if(fine == OK) printf("该元素的直接前驱为:%d\n",pre_e);
                else if(fine == ERR)printf("该元素无直接前驱!\n");
                else printf("该元素不在顺序表中!\n");
                break;
            case 6:
                printf("请输入需要查询直接后继的元素值: ");
                cin >> cur_ee;
                next_e = -1;
                fine = NextElem(L,cur_ee,next_e);
                if(fine == OK) printf("该元素的直接后继为:%d\n",next_e);
                else if(fine == ERR) printf("该元素无直接后继!\n");
                else printf("该元素不在顺序表中!\n");
                break;
            case 7:
                printf("请输入需要查询的位置: ");
                cin >> order;
                e = GetElem(L,order);
                if(e == ERR) printf("该位序不合理!\n");
                else printf("该位置的元素值为:%d\n",e);
                break;
            case 8:
                printf("请输入需要查看的元素:");
                cin >> e;
                if(LocateElem(L,e) != ERR) printf("该元素所在位置为:%d\n",LocateElem(L,e));
                else printf("该元素不在顺序表中!\n");
                break;
            case 9:
                if(ListTraverse(L) == OK)
                {
                    printf("顺序表逆置成功!\n");
                    PrintList(L);
                }
                else printf("该表逆置失败,请再次尝试!\n");
                break;
            case 10:
                if(ClearList(L) == OK) printf("该表清空成功!\n");
                else printf("清空顺序表失败,请再次尝试操作!\n");
                break;
            case 11:
                if(DestroyList(L) == OK) printf("该顺序表销毁成功!\n");
                else printf("销毁失败,请再次进行操作!\n");
                break;
            case 12:
                printf("请输入需要插入的元素值:");
                cin >> e;
                printf("请输入该元素插入的位序:");
                cin >> order;
                if(ListInsert(L,order,e) == OK)
                {
                    printf("该位置元素插入成功!\n");
                    PrintList(L);
                }
                else printf("请检查插入位置或元素类型,再次进行操作!\n");
                break;
            case 13:
                printf("请输入需要删除的元素位序:");
                cin >> order;
                if(ListDelete(L,order,e) == OK)
                {
                    printf("该位序上的元素删除成功,被删除的元素值为:%d\n",e);
                    PrintList(L);
                }
                else printf("请检查需要删除的位序是否合理,删除失败!\n");
                break;
            case 14:
                PrintList(L);
                break;
            case 15:
                goto END;
            default:
                printf("无该操作,请再次进行选择!\n");
        }
    }while(choice);
    END:
    printf("谢谢您的使用!欢迎下次光临嘿哈!\n");

    return 0;
}
//
// Created by somewon on 2022/9/29.
//

四、运行环境

        CLion

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值