基于C++实现的学生通讯录管理系统

目录
一、实验目的及要求 0
(4)程序可对输入数据的容错性进行检查,保证数据的合法性。 0
二、算法原理概述 0
2.2单链表的结构 1
三、软件开发环境及工具 2
四、实验内容 3
4.1、需求分析 3
4.2、概要设计 3
4.3、核心算法步骤 4
8. LinkList p; 6
4. LinkList p; 8
4. LinkList c; 9
4. LinkList p, q, s; 11
10. LinkList p; 17
4.4、结果分析 19
4.5、程序调试缺陷 24
(2)信息显示界面不够美观,对齐的工整度不高 24
(4)删除模块的鲁棒性不强,有待改进 24
一、 实验总结 24
六、参考文献: 24
[2] C++程序设计 李长河 等编著 电子工业出版社 24
87. LinkList p; 27
一、实验目的及要求
(1)完成线性表的存储表示及其基本操作。
(2)完成文件的打开、关闭操作。
(3)系统功能:从键盘或文件中读入通讯者信息,通常包括编号、姓名、性
别、电话以及地址等数据项;可实现通讯者信息的插入、查询、删除、更新以及通讯录逆序的输出等功能。
(4)程序可对输入数据的容错性进行检查,保证数据的合法性。
(5)用户界面的友好性:程序可提供与用户之间合理的交互以及相应的菜
单供用户选择。
二、算法原理概述
2.1线性表是一种最简单且最常用的数据结构,其主要分为线性存储结构和链式存储结构,而本次的学生通讯录管理系统是基于链式存储结构而实现的,相较于线性储存结构来说,链式存储结构更便于频繁的插入和删除操作,因此本次课设选择链表作为底层实现。
2.2单链表的结构
线性表的链式存储,又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。
为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针。

using namespace std;

/**通讯录节点数据定义*/
typedef struct
{
    string stuid;  //学号
    string name;   //姓名
    string sex;    //性别
    string phone;  //电话号码
    string addr;   //通讯地址
} DataType;

/**节点类型定义*/
typedef struct Node
{
    DataType data;     //节点数据域
    struct Node *next; //节点指针域
} ListNode, *LinkList;

/**类的定义*/
class StudentDirectory
{
public:
    StudentDirectory()      //构造器创建一个空链表
    {
        head = new ListNode;
        head->next = nullptr;
    }

    ~StudentDirectory();        //虚构函数

    void menu_0();              //初始登录页面

    void menu();                //初始登录页面

    void Build();               //建立通讯录

    void Add();                 //添加

    void Check();               //查找

    void Expurgate();           //删除

    void PrintList();           //通讯录输出

    void Cin_file();            //读取文件

    void Preservation_file();   //保存文件

    void D();                   //娱乐

    int ListLength();           //通讯录长度

    void Drop_out();            //退出界面

public:
    LinkList head;//listNode *head
};

/**通讯录链表的建立*/
void StudentDirectory::Build()
{
    system("cls"); //清屏
    fflush(stdin); //清空缓存区
    string StuID;
    bool isFlag = false;
    LinkList p;

    printf("建 立 通 讯 录\n");
    printf("****************************************************************\n");
    printf("请依次输入\t\t学号、\t姓名、 \t性别、\t电话号码、\t联系地址\n");
    printf("请按照此格式进行输入:\t0001\t张三\t男\t1**********\t重庆北碚\n\n");

    while (!isFlag)
    {
        char ch = 'Y';
        cout << "学号(按-1返回菜单):";
        cin >> StuID;
        if (StuID != "-1")
        {
            p = new ListNode;
            p->data.stuid = StuID;
            printf("\n请输入姓名: ");
            cin >> p->data.name;
            printf("\n请输入性别: ");
            cin >> p->data.sex;
            printf("\n请输入电话: ");
            cin >> p->data.phone;
            printf("\n请输入地址: ");
            cin >> p->data.addr;

            p->next = nullptr;
            //头插法
            p->next = head->next;// 新结点的next保存首结点(头结点的下一个结点)
            head->next = p;// 头指针往前移
            printf("\n*********************\n");
            cout << "是否继续输入学生的通讯录信息?(Y/N):";
            cin >> ch;
            if (ch == 'N' || ch == 'n')
            {
                system("cls");
                isFlag = true;
            }
        }
        else
        {
            system("cls");
            break;
        }
    }
}

/**获取链表长度*/
int StudentDirectory::ListLength()
{
    LinkList p = head->next;
    int n = 0;
    while (p)
    {
        n++;
        p = p->next;
    }
    return n;
}

/**析构函数用于释放空间*/
StudentDirectory::~StudentDirectory()
{
    ListNode *p, *q; //p控制循环,q指向当前删除节点
    p = head;
    q = p->next;
    delete p; //释放空间
    while (q)
    {
        p = q;
        q = p->next;
        delete p;
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shejizuopin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值