《数据结构》课程设计 —— 顺序表的实现(C++实现)包含完整项目源码

目录

顺序表的实现——商品管理系统

关于所有代码

项目整体说明

具体代码解释

pubuse.h文件

seqlistDef.h文件

seqlistAlgo.h文件

seqlistUse.cpp文件

 结语


顺序表的实现——商品管理系统

本次使用C++利用顺序表实现一个简单的商品管理系统,可用于数据结构课程设计,里面包含了一个完整的简易菜单,可以进行商品进货、出售、以及管理……都是通过顺序表实现的。

关于所有代码

【免费】学生课程实验,C++数据结构实验-顺序表的实现,实现商品管理系统,包含完整源码,vs2022项目,开箱即用!!!资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/btaworld/89292280?spm=1003.2166.3001.6637.2

所有代码已经上传到CSDN,通过资源绑定功能已经绑定本篇博客,有需要请自取,完整的VS2022项目,运行“数据结构.sln”即可在vs2022中打开(一般来说,版本无限制)

在我上传时,设置了0积分,可以免费获取,但不保证后续积分要求会不会变化(但放心,不会变成付费或会员专享资源),不过,还请尽快保存!

项目整体说明

这个项目由pubuse.h负责宏定义和类型声明,seqlistAlgo.h定义顺序列表操作,seqlistDef.h包含自定义商品与顺序列表结构,而seqlistUse.cpp实现了基于顺序表的商品管理系统,提供了用户界面和管理功能。

文件名称功能描述
pubuse.h提供常用数据类型声明、预处理器定义以及std库的命名空间导入
seqlistAlgo.h定义顺序列表商品管理算法,包含操作函数如初始化、查找、插入和删除等
seqlistDef.h定义自定义数据结构:Shop(商品信息)和SqList(排序列表管理)结构,及列表的大小限制
seqlistUse.cpp应用算法实现商品管理系统,包含用户界面交互,商品操作和管理功能

数据结构--顺序表商品管理系统:是由pubuse.h库文件支持的数据类型定义,seqlistAlgo.h负责算法设计实现,seqlistDef.h定义商品及其序列列表结构,而seqlistUse.cpp是实际运行的程序,包含命令行操作接口,实现商品的添加、查询、删除、销售等功能。

具体代码解释

pubuse.h文件

pubuse.h 文件包含了一个顺序表商品管理系统的预处理器指令(宏定义)和类型声明。主要特点如下:

  1. 定义了一些常量:

    • TRUEFALSE,用于布尔值表示。
    • OKERROR、和INFEASIBLE,表示操作状态。
    • 注释的OVERFLOW定义没有被采纳,原因是另一个头文件已经提供了 math.h 中的OVERFLOW,为了避免冲突。
  2. 抽象数据类型定义:

    • Status作为整型变量,表示函数返回不同操作的状态。
    • Boolean作为整型别名,通常用于布尔运算,可能简化代码表达。
  3. using namespace std;:这是一个C++语句,引入了std命名空间,使得可以直接使用标准库里的如coutcin等。

这个头文件主要是为了提供一些通用的编程工具和数据类型的定义,用于后续的模块化开发。

#include<string> 
#include<ctype.h> 
#include<malloc.h> /* malloc()等*/ 
#include<limits.h> /* INT_MAX 等*/ 
#include<stdio.h> /* EOF(=^Z 或F6),NULL */ 
#include<iostream>
#include<stdlib.h> /* atoi() */ 
#include<io.h> /* eof() */ 
#include<math.h>/* floor(),ceil(),abs() */ 
#include<process.h> /* exit() */ 

using namespace std;

/* 函数结果状态代码*/
#define TRUE 1 
#define FALSE 0 
#define OK 1 
#define ERROR 0 
#define INFEASIBLE -1 
//#define OVERFLOW -2 因为在math. h 中已定义OVERFLOW 的值为3,故去掉此行
typedef int Status; /* Status 是函数的类型,其值是函数结果状态代码,如OK 等*/
typedef int Boolean; /* Boolean 是布尔类型,其值是TRUE 或FALSE */

seqlistDef.h文件

这是一个C语言的头文件(seqlistDef.h),它包含两个自定义结构体:

  1. Shop 结构体定义了一个商品对象,包含以下字段:

    • name:表示商品名称,类型为字符串(string)
    • HS:可能是指商品编号或序列号,同样类型为字符串(string)
    • p_i:单件商品价格,类型为浮点数
    • p_s:销售折扣价,类型为浮点数
    • item:商品数量,类型为整数
  2. SqList 结构体定义了一个顺序列表(Sequential List),用于管理商品。它包含:

    • elem:一个指向Shop类型的指针,用于存储商品
    • length:列表的长度,用于跟踪商品数量
    • all_p:总共的总价,类型为浮点数

文件还包括了预处理宏 #define MAXSIZE 100,表示列表最多能容纳100个商品。同时,它引入了一个名为 "pubuse.h" 的库文件,可能是其他功能模块的公共头文件。

这个文件提供了一个基本的数据结构框架,用于后续在项目中创建和操作顺序列表商品管理系统。

#include "pubuse.h"
#define MAXSIZE 100

typedef struct
{
	string name; //商品名称
	string HS; //商品编码
	float p_i; //商品进货价格
	float p_s; //商品出售价格
	int item; //商品库存
}Shop;
typedef struct {
	Shop* elem;
	int length; //商品的数量
	float all_p; //收入
}SqList;

seqlistAlgo.h文件

seqlistAlgo.h 文件定义了一个名为 SqList 的顺序列表类,用于管理商品信息。这个数据结构实现了一系列操作方法,如初始化、定位元素(通过名称或货号)、获取和设置元素值、插入、删除、销毁列表、清空列表、检查是否为空、获取列表长度、遍历上一个和下一个元素,以及购买商品等。输入和展示商品时,用户可以指定操作项,同时处理一些边界错误和特殊情况,比如负数或无效输入。

主要函数包括:

- InitList: 初始化顺序表,分配内存并设置默认值。

- LocateElemName 和 LocateElemHS: 检索商品按名称或货号的位置。

- GetElem: 返回指定索引的商品信息。

- ListInsert 和 RemoveShop: 插入和删除指定索引的商品。

- DestroyList, ClearList, ListEmpty: 分别用于释放资源、清空列表和检查列表是否为空。

- Length, prior_elem, next_elem: 接收索引获取前一个/下一个商品及当前位置的长度。

- InputShop: 输入一个新的商品信息。

- sell: 出售指定索引的商品,并询问是否删除该商品。

- ShowShop: 展示所有商品列表供用户选择,如果商品售罄则提示。

- display: 详细地显示所有商品信息。

- ShowLine: 显示单个商品信息。

- ShowPorN: 显示前一个或后一个商品,或返回到主菜单。

整个类实现了单向链表的基础功能,并配合简单的用户交互。

#include"seqlistDef.h"

// 初始化线性表
Status InitList(SqList& L) {
    L.elem = new Shop[MAXSIZE];
    if (!L.elem) exit(OVERFLOW);
    L.length = 0;
    L.all_p = 0.0;
    return OK;
}

// 根据名字查找
int LocateElemName(SqList L, string name) {
    for (int i = 0; i < L.length; i++) {
        if (L.elem[i].name == name) return i + 1;
    }
    return 0;
}

// 根据商品编号查找
int LocateElemHS(SqList L, string HS) {
    for (int i = 0; i < L.length; i++) {
        if (L.elem[i].HS == HS) return i + 1;
    }
    return 0;
}


// 获取线性表第i个元素
Status GetElem(SqList L, int i, Shop& e) {
    if (i<1 || i>L.length) return ERROR;
    e = L.elem[i - 1];
    return OK;
}

// 在指定位置插入元素
Status ListInsert(SqList& L, int i, Shop e) {
    if (i < 1 || i > L.length + 1 || 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;
    L.length++;
    L.all_p -= e.item * e.p_i;
    return OK;
}

// 删除指定位置的元素
Status RemoveShop(SqList& L, int i) {
    if (i < 1 || i > L.length)
        return ERROR;
    for (int j = i; j < L.length; j++) {
        L.elem[j - 1] = L.elem[j];
    }
    L.length--;
    return OK;
}

//销毁线性表
Status DestroyList(SqList& L) {
    delete[] L.elem;
    InitList(L);
    return OK;
}

//重置为空表
Status ClearList(SqList& L)
{
    L.length = 0;
    L.all_p = 0.0;
    return OK;
}

//是否为空表
Status ListEmpty(SqList L) {
    if (L.length != 0)
        return OK;
    else
        return ERROR;
}

//返回元素个数
int Length(SqList L) {
    return L.length;
}

//返回非第一元的前驱元素
Status prior_elem(SqList L, int i, Shop& e) {
    if (i != 0) {
        e = L.elem[i - 1];
        return OK;
    }
    else return ERROR;
}

//返回非最后元的后继元素
Status next_elem(SqList L, int i, Shop& e) {
    if (i != L.length - 1) {
        e = L.elem[i + 1];
        return OK;
    }
    else return ERROR;
}

……完整代码请下载本篇博客绑定的资源

seqlistUse.cpp文件

这是一个C++程序,名为seqlistUse.cpp,实现了一个基于序列(顺序表)的商品管理系统。主要功能包括:

  1. 菜单管理:显示一系列操作选项,如商品进货、检索、出售等。
  2. 数据结构:使用SqList类,可能是一个自定义的数据结构,包含商品信息(如序号、名称和数量等)并实现了列表操作(初始化、插入、删除等)。
  3. 基本操作
    • 进货:通过ListInsert函数将商品添加到序列表中。
    • 获取商品:根据序号、名称或编号查询商品信息。
    • 删除商品:在指定位置移除商品。
    • 库存检查:确认库存是否为空。
    • 统计商品数量:显示库存商品总数。
    • 出售商品:通过索引出售商品。
    • 显示库存:展示当前库存信息。
    • 清除和销毁商品:清空所有商品或将列表销毁。

程序采用循环结构,用户选择一个操作后执行相应的函数,并在每一步操作后提示用户继续或者退出。

#include"seqlistAlgo.h"

void ShowMenu() {
    cout << "========= 商品管理系统 =========" << endl;
    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 << "9. 检测商品库存是否为空" << endl;
    cout << "10. 查看商品数量" << endl;
    cout << "11. 出售商品" << endl;
    cout << "12. 显示库存" << endl;
    cout << "0. 退出" << endl;
    cout << "请输入你的选择:";
}
void ExitEnter() {
    cout << "-------------------------------" << endl;
    system("pause");
    system("cls");
}

int main() {
    SqList L;
    // 初始化线性表
    InitList(L);
    int numF = 12; //菜单选项数量
    int choice;
    do {
        ShowMenu();
        cin >> choice;
        while (choice < 0 || choice>numF || cin.fail())
        {
            system("cls");
            cin.clear();
            cin.ignore();
            ShowMenu();
            cin >> choice;
        }

        switch (choice) {
        case 1: {
            system("cls");
            // 商品进货
            if (L.length == MAXSIZE) {
                cout << "商品已满,无法进货" << endl;
            }
            else
            {
                Shop e = InputShop();
                if (ListInsert(L, L.length + 1, e)) cout << "进货成功" << endl;
                else cout << "进货失败" << endl;
            }
            ExitEnter();
            break;
        }
        case 2: {
            // 按序号获取商品
            system("cls");
            if (L.length == 0) cout << "无商品,请先进货" << endl;
            else {
                int ln;
                cout << "请输入查找商品的位置(1-" << L.length << "): ";
                cin >> ln;
                Shop e;// 用于存储返回值的 Shop 对象
                if (GetElem(L, ln, e)) {
                    ShowLine(ln, e);
                    ShowPorN(L, ln);
                }
                else cout << "查找失败" << endl;
            }
            ExitEnter();
            break;
        }
        case 3: {
            // 根据商品名称查找
            system("cls");
            string name;
            cout << "请输入查找商品名称:";
            cin >> name;
            int ln = LocateElemName(L, name);
            Shop e;// 用于存储返回值的 Shop 对象
            if (GetElem(L, ln, e)) {
                ShowLine(ln, e);
                ShowPorN(L, ln);
            }
            else cout << "查找失败" << endl;
            ExitEnter();
            break;
        }
        case 4: {
            // 根据商品编号查找
            system("cls");
            string HS;
            cout << "请输入查找商品编号:";
            cin >> HS;
            int ln = LocateElemHS(L, HS);
            Shop e;// 用于存储返回值的 Shop 对象
            if (GetElem(L, ln, e)) {
                ShowLine(ln, e);
                ShowPorN(L, ln);
            }
            else cout << "查找失败" << endl;
            ExitEnter();
            break;
        }
        case 5: {
            // 在指定位置进货商品
            system("cls");
            if (L.length == MAXSIZE) cout << "商品已满,无法进货" << endl;
            else
            {
                Shop e = InputShop();
                int ln; //商品进货位置
                if (L.length == 0) {
                    cout << "库存无商品,默认在首元位置进货" << endl;
                    ln = L.length + 1;
                }
                else
                {
                    cout << "请输入商品位置(1-" << L.length + 1 << "): ";
                    cin >> ln;
                }
                if (ListInsert(L, ln , e)) cout << "进货成功" << endl;
                else cout << "进货失败" << endl;
            }
            ExitEnter();
            break;
        }
        case 6: {
            // 删除指定位置的商品
            system("cls");
            if (L.length == 0) {
                cout << "库存无商品,无法删除" << endl;
            }
            else
            {
                int del_ln; //商品删除位置
                cout << "请输入需要删除商品的位置(1-" << L.length << "): ";
                cin >> del_ln;
                if (RemoveShop(L, del_ln)) cout << "删除成功" << endl;
                else cout << "删除失败" << endl;
            }
            ExitEnter();
            break;
        }
        case 7: {
            // 重置所有商品为空
            system("cls");
            ClearList(L);
            cout << "已重置商品为空" << endl;
            ExitEnter();
            break;
        }
        case 8: {
            // 销毁所有储存的商品
            system("cls");
            DestroyList(L);
            cout << "已销毁所有商品" << endl;
            ExitEnter();
            break;
        }
        case 9: {
            // 检测商品库存是否为空
            system("cls");
            if (ListEmpty(L)) cout << "商品库存不为空" << endl;
            else cout << "商品库存为空" << endl;
            ExitEnter();
            break;
        }
        case 10: {
            // 查看商品数量
            system("cls"); 
            int num = Length(L);
            cout << "库存已有商品:" << num << "种" << endl;
            ExitEnter();
            break;
        }
        case 11: {
            // 出售商品
            system("cls");
            int index = ShowShop(L);  // 获取用户选择的商品索引
            if (index != -1) sell(L, index);  // 出售商品
            ExitEnter();
            break;
        }
        case 12: {
            // 显示库存
            system("cls");
            display(L);
            ExitEnter();
            break;
        }
        case 0: {
            cout << "-------------------------------" << endl;
            cout << "感谢使用,再见!" << endl;
            break;
        }
        default:
            system("cls");
            cout << "输入无效,请重新选择!" << endl;
            break;
        }
    } while (choice != 0);
    return 0;
}

 结语

希望你能通过本篇博客,更好理解数据结构的顺序表。

最后,使用愉快!

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是 C++ 实现数据结构顺序表的代码示例: ```cpp #include <iostream> using namespace std; const int MAXSIZE = 100; // 定义顺序表最大长度 template <typename T> class SeqList { private: T data[MAXSIZE]; // 存储数据元素的数组 int length; // 当前顺序表长度 public: SeqList() { length = 0; } // 构造函数,初始化为空表 ~SeqList() {} // 析构函数 bool isEmpty() { return length == 0; } // 判断是否为空表 int getLength() { return length; } // 获取当前顺序表长度 bool insert(int i, T e); // 在第 i 个位置插入元素 e bool remove(int i); // 删除第 i 个位置的元素 int search(T e); // 查找元素 e 在顺序表中的位置 T getElem(int i); // 获取第 i 个位置的元素 void printList(); // 输出顺序表中所有元素 }; template <typename T> bool SeqList<T>::insert(int i, T e) { if (i < 1 || i > length + 1) return false; // 插入位置不合法 if (length >= MAXSIZE) return false; // 顺序表已满 for (int j = length; j >= i; j--) { data[j] = data[j - 1]; // 将第 i~length-1 个元素后移一位 } data[i - 1] = e; // 将新元素插入到第 i 个位置 length++; // 长度加 1 return true; } template <typename T> bool SeqList<T>::remove(int i) { if (i < 1 || i > length) return false; // 删除位置不合法 for (int j = i; j < length; j++) { data[j - 1] = data[j]; // 将第 i+1~length 个元素前移一位 } length--; // 长度减 1 return true; } template <typename T> int SeqList<T>::search(T e) { for (int i = 0; i < length; i++) { if (data[i] == e) return i + 1; // 找到元素 e,返回其位置 } return 0; // 未找到元素 e,返回 0 } template <typename T> T SeqList<T>::getElem(int i) { if (i < 1 || i > length) throw "位置不合法"; // 获取位置不合法,抛出异常 return data[i - 1]; } template <typename T> void SeqList<T>::printList() { for (int i = 0; i < length; i++) { cout << data[i] << " "; } cout << endl; } int main() { SeqList<int> list; list.insert(1, 1); list.insert(2, 2); list.insert(3, 3); list.printList(); // 输出:1 2 3 list.remove(2); list.printList(); // 输出:1 3 cout << list.search(3) << endl; // 输出:2 cout << list.getElem(2) << endl; // 输出:3 return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值