目录
一、实验目的及要求 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;
}
}