<img src="https://img-blog.csdn.net/20150114220838234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcW1qMzE0MTU5MjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20150114220801921?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcW1qMzE0MTU5MjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<stdlib.h>
#include<iomanip.h>
struct data //数据
{
char name[20]; //姓名
char tel[20]; //电话
int age; //年龄
};
class node //节点
{
friend class link; //友远类
private:
data person; //数据
node * next;
node * pre;
public:
void show() //显示数据信息
{
cout<<"姓名:"<<setw(20)<<person.name<<endl;
cout<<"电话:"<<setw(20)<<person.tel<<endl;
cout<<"年龄:"<<setw(3)<<person.age<<endl<<endl;
}
node(char*name0="",char*tel0="",int age0=0) //构造函数
{
strcpy(person.name,name0);
strcpy(person.tel,tel0);
person.age=age0;
next=NULL;
pre=NULL;
}
node(node&n) 拷贝构造
{
strcpy(person.name,n.person.name);
strcpy(person.tel,n.person.tel);
person.age=n.person.age;
}
};
class link{ //双向链表
node * head; //头指针
node * rear; //尾指针
node * findbyname(char*name0,node *temp ) //查找姓名返回地址
{
temp=head;
if(!head) //空链表
{
cout<<"通讯录中没有信息"<<endl<<endl;
return NULL;
}
node * p=head;
while(p){
if(strcmp(p->person.name,name0)==0) //已找到
return p;
p=p->next;
}
while(temp){
if(Cmpstr(temp->person.name,name0))
{
cout<<endl<<"符合条件的记录,如下: "<<endl;
temp->show();
}
temp=temp->next;
}
//if(temp)
// cout<<"查无此人"<<endl<<endl;//未找到}
return temp;
}
node * findbyname(char*name0) //查找姓名返回地址
{
if(!head) //空链表
{
cout<<"通讯录中没有信息"<<endl<<endl;
return NULL;
}
node * p=head;
while(p){
if(strcmp(p->person.name,name0)==0) //已找到
return p;
p=p->next;
}
if(!p)
cout<<"查无此人"<<endl<<endl;
return NULL;//未找到
}
int length() //返回链表长度
{
if(!head)
return 0;
node*p;
int n=1;
p=head;
if(p->next)
{
p=p->next;
n++;
}
return n;
}
node * findbynum(int num) //根据序号查找
{
int l=length(); //l为总长
if(!head) //空链表
{
cout<<"通讯录中没有信息"<<endl<<endl;
return NULL;
}
if(num>l) //数据越界
{
cout<<"通讯录里没有"<<num<<"条信息"<<endl<<endl;
return NULL;
}
node * p=head;
while(--num)
p=p->next;
return p; //返回指针
}
void change(node*p)//修改对应指针信息
{
char tel0[20];
int age0,cho;
cout<<"请输入新的电话号码"<<endl;
cin>>tel0;
cout<<"请输入新的年龄"<<endl;
cin>>age0;
cout<<"姓名:"<<p->person.name<<endl;
cout<<"原电话号码:"<<setw(20)<<p->person.tel<<endl;
cout<<"原年龄:"<<setw(3)<<p->person.age<<endl<<endl;
cout<<"新电话号码:"<<setw(20)<<tel0<<endl;
cout<<"新年龄:"<<setw(3)<<age0<<endl<<endl;
cout<<"1.确认 2.取消"<<endl;
cin>>cho;
if(cho==1)
{
strcpy(p->person.tel,tel0);
p->person.age=age0;
cout<<"已修改成功"<<endl;
}
}
void del(node *p) //删除一个节点
{
if(!head) //空链表
{
cout<<"通讯录中没有信息"<<endl<<endl;
return ;
}
if(p==head) //删除头结点
{
p->next->pre=NULL;
head=p->next;
delete p;
return;
}
if(p==rear) //删除尾节点
{
p->pre->next=NULL;
rear=p->pre;
delete p;
return;
}
p->next->pre=p->pre; //删除中间节点
p->pre->next=p->next;
delete p;
}
void delall() //删除整个链表
{
node*p;
while(head)
{
p=head;
head=head->next;
delete p;
}
head=rear=NULL;
}
public:
link() //构造函数
{
head=rear=NULL;
}
~link(){ //析构函数,同时释放链表空间
delall();
}
node * cinnode() //从键盘输入生成一个节点
{
char name[20],tel[20];
int age;
node*p;
p=new node;
cout<<"请输入姓名"<<endl;
cin>>name;
cout<<"请输入电话号码"<<endl;
cin>>tel;
cout<<"请输入年龄"<<endl;
cin>>age;
*p=node(name,tel,age);
return p;
}
void insert(node *p) //将节点插入链表
{
node *p1,*p2;
if(head==0) //空链表
{
p->next=0;
p->pre=0;
head=rear=p;
return;
}
if(strcmp(head->person.name,p->person.name)>0)
{
p->next=head;
head->pre=p;
p->pre=0;
head=p;
return;
}
if(strcmp(rear->person.name,p->person.name)<0)
{
p->pre=rear;
rear->next=p;
p->next=0;
rear=p;
return ;
}
p1=p2=head;
while(strcmp(p2->person.name,p->person.name)<0)
{
p1=p2;
p2=p2->next;
}
p->next=p2; //插入链表中间
p2->pre=p;
p1->next=p;
p->pre=p1;
}
void showfromhead() //从前向后输出链表
{
if(!head) //空链表
cout<<"通讯录无信息"<<endl;
else{
int c=0;
node *p;
p=head;
while(p)
{
p->show(); //调用函数显示信息
p=p->next;
c++;
//if(c%5==0) //控制每输出 5 个暂停一次
//system("pause");
}
cout<<"所有信息输出完成"<<endl;
}
}
void showfromrear() //从后向前输出链表
{
if(!rear)
cout<<"通讯录无信息"<<endl;
else
{
int c=0;
node*p;
p=rear;
while(p)
{
p->show();
p=p->pre;
c++;
if(c%6==0)
system("pause");
}
cout<<"所有信息输出完成"<<endl;
}
}
void showbyname(node *temp) //根据姓名显示信息
{
char name[20];
cout<<"请输入欲查找的姓名"<<endl;
cin>>name;
node *p;
p=findbyname(name,temp); //查找姓名所对应的指针
if(p)
p->show();
}
void changebyname() //根据姓名修改信息
{
char name[20];
cout<<"请输入欲修改的姓名"<<endl;
cin>>name;
node*p;
p=findbyname(name);
if(p)
change(p);
}
void delbyname() //根据姓名删除信息
{
char name[20];
if(!head) //空链表
{
cout<<"通讯录中没有信息"<<endl<<endl;
return ;
}
cout<<"请输入欲删除的姓名"<<endl;
cin>>name;
node*p;
p=findbyname(name);
if(p)
del(p);
cout<<"已删除选定信息"<<endl;
}
void showbynum() //根据序号显示信息
{
int num;
if(!head) //空链表
{
cout<<"通讯录中没有信息"<<endl<<endl;
return ;
}
cout<<"请输入欲查找编号"<<endl;
cin>>num;
node*p;
p=findbynum(num); //根据序号查找指针
if(p)
p->show();
}
void delbynum() //根据序号删除信息
{
int num;
if(!head) //空链表
{
cout<<"通讯录中没有信息"<<endl<<endl;
return ;
}
cout<<"请输入欲删除编号"<<endl;
cin>>num;
node*p;
p=findbynum(num);
if(p)
del(p);
cout<<"已删除选定信息"<<endl;
}
void changebynum() //根据序号修改信息
{
int num;
if(!head) //空链表
{
cout<<"通讯录中没有信息"<<endl<<endl;
return;
}
cout<<"请输入欲修改编号"<<endl;
cin>>num;
node*p;
p=findbynum(num);
if(p)
change(p);
}
bool Cmpstr(char*name_node,char*name_search)//
{
if(name_search[0]=='*')
return true;
char name1[20],name2[20];
strncpy(name1,name_node,20);
strncpy(name2,name_search,20);
int size1=strlen(name1),size2=strlen(name_search);
for(int i=0;i<size2;i++)
{
if(name2[i]>='A'&&name2[i]<='Z')
name2[i]+=32;
}
for(int i1=0;i1<size1;i1++)
{
if(name1[i1]>='A'&&name1[i1]<='Z')
name1[i1]+=32;
}
for(int i2=0;i2<size1;i2++)
{
if(name_search[i2]=='*')//通配符*,通配任意字符串,
{
for(int j=0;j<i2;j++)
{
if(name1[j]!=name2[j])
return false;
}
return true;
}
}
if(size1!=size2) {
return false;
}
for(int i3=0;i3<size1;i3++)
{
if(name2[i3]=='?')/
continue;
if(name1[i3]!=name2[i3])
return false;
}
return true;
}
};
主函数:
#include "node.h"
void main();
char buffer[100];
void show_data(link &a){
char c;
cout<<"查看全部数据"<<endl;
cout<<"1.顺序 2.逆序"<<endl;
cin>>c;
if(c=='1')
{
a.showfromhead();
system("pause");
cout<<endl<<endl;
system("cls");
return;
}
if(c=='2')
{
a.showfromrear();
system("pause");
cout<<endl<<endl;
system("cls");
return;
}
if(c!='1'&&c!='2')
{
cout<<"input error"<<endl;
system("pause");
cout<<endl<<endl;
system("cls");
void show_data(link &a);
return;
}
};
void delet_data(link &a){
char c;
cout<<"删除数据"<<endl;
cout<<"1.根据序号删除数据 2.根据姓名删除数据"<<endl;
cin>>c;
if(c=='1')
{
a.delbynum();
system("pause");
cout<<endl<<endl;
system("cls");
}
if(c=='2')
{
a.delbyname();
system("pause");
cout<<endl<<endl;
system("cls");
}
if(c!='1'&&c!='2')
{
cout<<"input error"<<endl;
system("pause");
cout<<endl<<endl;
system("cls");
void delet_data(link &a);
}
};
void insert_data(link &a){
cout<<"添加数据"<<endl;
a.insert(a.cinnode());
system("pause");
cout<<endl<<endl;
system("cls");
};
void updata(link &a){
char c;
cout<<"修改数据"<<endl;
cout<<"1.根据序号修改数据 2.根据姓名修改数据"<<endl;
cin>>c;
if(c=='1')
{
a.changebynum();
system("pause");
cout<<endl<<endl;
system("cls");
}
if(c=='2')
{
a.changebyname();
system("pause");
cout<<endl<<endl;
system("cls");
}
if(c!='1'&&c!='2')
{
cout<<"input error"<<endl;
system("pause");
cout<<endl<<endl;
system("cls");
void updata(link &a);
}
};
void search_data(link &a){
char c;
node *temp;
cout<<"查找数据"<<endl;
cout<<"1.根据序号查找数据 2.根据姓名查找数据(支持*与?的通配)"<<endl;
cin>>c;
if(c=='1')
{
a.showbynum();
system("pause");
cout<<endl<<endl;
system("cls");
}
if(c=='2')
{
a.showbyname(temp);
system("pause");
cout<<endl<<endl;
system("cls");
}
if(c!='1'&&c!='2')
{
cout<<"input error"<<endl;
system("pause");
cout<<endl<<endl;
system("cls");
void search_data(link &a);
}
};
link a;
void menu(){
char c;
cout<<"\t\t 通讯录管理系统"<<endl;
cout<<"1.查看全部数据"<<endl;
cout<<"2.删除数据"<<endl;
cout<<"3.添加数据"<<endl;
cout<<"4.修改数据"<<endl;
cout<<"5.查找数据"<<endl;
cout<<"请输入您需要的功能"<<endl;
cin>>c;
switch(c)
{
case '1':
show_data(a);
menu();
break;
case '2':
delet_data(a);
menu();
break;
case '3':
insert_data(a);
menu();
break;
case '4':
updata(a);
menu();
break;
case '5':
search_data(a);
menu();
break;
case '6':
cout<<"从文件输入数据"<<endl;
a.inputnode();
system("pause");
cout<<endl<<endl;
system("cls");
menu();
break;
case '7':
output_data(a);
menu();
break;
case '8':
cout<<"谢谢使用"<<endl;
return ;
default:{
cin.clear();
cin.getline(buffer,100);
cout<<"input error "<<endl;
system("pause");
system("cls");
menu();
}
}
return;
}
void main() //显示菜单,并调用对应函数
{
menu();
}
第一部分 绪论
1.1 课程设计的目的
通过设计一个较为简单的管理系统,进一步熟悉数据结构的概念、实现方式。了解系统开发的需求分析、类层次设计、模块分析、编码测试、模块组装与整体调试的全过程,加深对C++的理解与Visual C++环境的使用;逐步熟悉程序设计的方法,并养成良好的编程习惯。
1.2 课程设计的背景与意义
数据结构是一门实践性很强的学科,光靠读书听课是学不好的。衡量学习好坏的标准并不是听不听得懂,因此在强调多编程多实践。所以课程设计的目的,要熟练掌握数据结构的知识,C++语言的知识和基本技能,利用所学的知识解决面向对象的基本问题,这也是一个巩固基本知识的好的途径。
1.3 课程设计的环境
本次课程设计采用的是Microsoft Visual C++6.0 编写程序。
第二部分 需求分析
2.1 问题论述
为方面大家整理自己的联系人,告别杂乱无章的生活。简单整洁的通讯录是现在大众所需的必要产品。
2.2 功能要求
通讯录要求简单易用,所以通讯录应该有简单的输入、查删除的功能。
第三部分 系统设计
3.1 项目说明
(1)技术可行性:处理速度快、准确通过权限的设置,数据的安全性好、方便查询、借阅管理等。
(2)经济可行性:系统建设不需要很大的投入、可缩减人力投入。
(3)运行上可行性
(4)从各种社会因素可行性分析:可降低工作人员工作强度,提高效率,会
得到学校工作人员的一致同意的。
综上所述通过可行性分析认为新系统的开发方案切实可行,可进行开发。
3.2 设计的思路和关键数据结构
.程序流程
系统的执行应从功能菜单选择开始,依据用户的选择来进行后续的处理,直到用户选择退出系统为止,其间应对用户的选择做出判断及异常处理。系统的流程图如图所示:
第四部分 实现功能
学校图书管理系统的开发主要要实现的目标有以下几个方面:
(1)界面设计友好、美观。
(2)数据存储安全、可靠。
(3)信息分类清晰、准确。
(4)强大的查询功能,保证数据查询的灵活性。
(5)提供灵活、方便的权限设置功能,使整个系统的管理分工明确。
(6)具有易维护性和易操作性。