⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shujujiegoukechengsheji__tongxunluguanlixitong.cpp

📁 数据结构课程设计——通讯录管理系统Microsoft Visual C++6.0描述
💻 CPP
字号:
//头文件包含信息
#include<iostream.h>
#include<string.h>//strcmp();
#include<stdlib.h>
#include<conio.h>//getch();
#include<iomanip.h>//setf(),setw();
const int n=26;//定义n为指针数组的大小
//下面定义一个记录类型(data)
struct data{
	char name[13];
	char sex[3];
	char tele[13];
	char addr[31];
};
//定义领接表中结点的类型
struct person{
	data Data;
	person*next;
};
person*people[n];//people为n个表头指针的数组类型
//领接表的抽象数据类型
void Init(person*p[]);
void Create(person*p[]);
//函数的超前声明
int menu_select();
void Insert(person*&p,person*np);
void Find(person*&p,const char a[]);
void Delete(person*&p,char a[]);
void Modify(person*&,char a[]);
void Output(person*p[]);
void Print(person*&p);
void Cout(person*p);
void Cin(person*p);
//主函数:对领接表的处理
void main()
{
	Init(people);//领接表的初始化
	for(;;){
		switch(menu_select())//菜单选择,返回int型值
		{
		case 1:
			//创建通讯录的存储结构——领接表
			cout<<"****************************"<<endl;
			cout<<"*      通讯录管理系统!     *"<<endl;
			cout<<"****************************"<<endl;
			Create(people);//调用Create函数
			break;
		case 2:
			//向领接表中插入记录
			cout<<"****************************"<<endl;
			cout<<"*     通讯者结点的插入     *"<<endl;
			cout<<"****************************"<<endl;
			person*np;
			np=new person;//申请新结点,便于存储记录信息
			if(np==NULL){
				cerr<<"The memory is full!"<<endl;
				exit(1);
			}
			Cin(np);//输入记录信息
			int m;
			//取出记录中name[]的首字母name[0],然后减去97赋予m,
			//         以people[m]指向领接表中的单链表表头
			m=np->Data.name[0]-97;
			Insert(people[m],np);//调用Insert函数
			break;
		case 3:
			//访问领接表中记录的信息
			cout<<"****************************"<<endl;
			cout<<"*       通讯录的查询       *"<<endl;
			cout<<"****************************"<<endl;
			char a[13];//a为需要访问记录的name值
			cout<<"name(12) ";
			cin>>a;
			m=a[0]-97;//m同上面
			Find(people[m],a);//调用Find函数
			break;
		case 4:
			//删除领接表中的记录信息
			cout<<"****************************"<<endl;
			cout<<"*       通讯录的删除       *"<<endl;
			cout<<"****************************"<<endl;
			char b[13];//b为删除记录的name值
			cout<<"name(12) ";
			cin>>b;
			m=b[0]-97;//m同上
			Delete(people[m],b);//调用Delete函数
			break;
		case 5:
			//修改领接表中的记录信息
			cout<<"****************************"<<endl;
			cout<<"        通讯录的修改"<<endl;
			cout<<"****************************"<<endl;
			char c[13];//c为修改记录的name值
			cout<<"name(12): ";
			cin>>c;
			m=c[0]-97;//m同上
			Modify(people[m],c);//调用Modify函数
			break;
		case 6:
			//输出领接表中所有记录的信息
			cout<<"****************************"<<endl;
			cout<<"*       通讯录的输出       *"<<endl;
			cout<<"****************************"<<endl;
			Output(people);//调用Output函数
			break;
		case 0:
			//所有操作结束,退出通讯录系统
			cout<<"        再    见!"<<endl;
			cout<<"~!@#$%^&*(*)_+|*|+_)*(*&^%$#@!~"<<endl;
			cout<<"按任意键退出系统"<<endl;
			getch();//从键盘获得任意键信息
			return;
		}
	}
}
//菜单选择函数
int menu_select()
{
	int m;
	cout<<"*      通讯录管理系统!     *"<<endl;
	cout<<"============================"<<endl;
	cout<<"        1. 创建领接表       "<<endl;
	cout<<"        2. 结点的插入	   "<<endl;
	cout<<"        3. 结点的查询	   "<<endl;
	cout<<"        4. 结点的删除	   "<<endl;
	cout<<"        5. 结点的修改	   "<<endl;
	cout<<"        6  领接表输出       "<<endl;
	cout<<"        0.  推出系统		   "<<endl;
	cout<<"============================"<<endl;
	cout<<"        请选择0-6:";
	for(;;){
		cin>>m;
		//当输入的值>6或<0时,请重新输入
		if(m<0||m>6)
			cout<<"输入错误,重选0-6:";
		else
			break;
	}
	return m;
}
//初始化领接表
void Init(person*p[])
{
	for(int i=0;i<n;i++)
		p[i]=NULL;//将领接表中的每个单链表置为空
}
//创建领接表
void Create(person*p[])
{
	char ch='y';
	//循环控制是否继续创建,即添加记录信息
	while(ch=='y'||ch=='Y'){
		person*np=new person;
		if(np==NULL)
		{
			cerr<<"The memory is full!"<<endl;
			exit(1);
		}
		Cin(np);//输入记录信息
		np->next=NULL;
		int m=np->Data.name[0]-97;
		//取出记录中name[]的首字母name[0],然后减去97赋予m,
		//         以people[m]指向领接表中的单链表表头
		Insert(p[m],np);//调用插入函数
		cout<<"继续吗?(Y/N):";
		cin>>ch;
	}
}
//有序的插入记录信息
void Insert(person*&p,person*np)
{
	//首先查找插入点的位置
	person*cp=p,*ap=NULL;
	while(cp!=NULL){
		if(strcmp(np->Data.name,cp->Data.name)<0)
			//如果当前信息小于待插入的信息,退出循环
			break;
		else{
			ap=cp;
			cp=cp->next;
		}
	}
	if(ap==NULL){
		//ap==NULL表头为空,把结点插在表头
		np->next=p;
		p=np;
	}
	else{
		//将结点插在ap与cp之间
		np->next=cp;
		ap->next=np;
	}
}
//查找记录信息
void Find(person*&p,const char a[])
{
	int i=0;
	//i标记是否已找到记录信息,找到i=1,否则i=0
	person*np=p;
	while(np!=NULL){
		if(strcmp(np->Data.name,a)<=0){
			if(strcmp(np->Data.name,a)==0){
				i=1;
				break;
			}
			else
				break;
		}
		else
			np=np->next;
	}
	if(i==1){//找到记录,输出对应的信息
		cout<<"The person is find!"<<endl;
		Cout(np);//调用输出函数
	}
	else//未找到,打印提示信息
		cout<<"The person is not find!"<<endl;
}
//删除记录信息
void Delete(person*&p,char a[])
{
	//首先查找记录,i作为记录是否从在的标记
	int i=0;
	person*cp=p,*ap=NULL;
	while(cp!=NULL){
		if(strcmp(cp->Data.name,a)==0){
			i=1;//找到记录i=1
			break;
		}
		else if(strcmp(cp->Data.name,a)>0)
			break;
		else{
			ap=cp;
			cp=cp->next;
		}
	}
	if(i==1){//找到删除记录
		cout<<"The person is exit!"<<endl;
		Cout(cp);
		person*np=cp;
		if(ap!=NULL){//待删除记录在单链表的中间
			ap->next=cp->next;
		}
		if(ap==NULL)//待删除记录为单链表表头结点
			p=cp->next;
		delete cp;	
	}
    else//未找到待删除的记录
		cout<<"The person is not exit!"<<endl;
}
//修改记录信息
void Modify(person*&p,char a[])
{
	//首先寻找记录,i作为是否找到记录的标记
	int i=0;
	person*p1=p;
	while(p1!=NULL){
		if(strcmp(p1->Data.name,a)==0){
			i=1;//找到记录i=1
			break;
		}
		else if(strcmp(p1->Data.name,a)>0)
			break;
		else
			p1=p1->next;
	}
	if(i==0)//输出未找到纪录的提示信息
		cout<<"The modify person is not exit!"<<endl;
	if(i==1){
		cout<<"The modify person is find:"<<endl;
		cout<<"原纪录信息为: "<<endl;
		Cout(p1);//输出原纪录信息
		cout<<"输入新纪录信息: "<<endl;;
		Cin(p1);//输入新记录信息
		cout<<"新纪录为 :"<<endl;
		Cout(p1);//输出新记录信息
	}
}
//输出领接表中的所有信息
void Output(person*p[])
{
	person*np;
	cout<<"%&@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@&%"<<endl;
	cout.setf(ios::left);//指定输出信息的对齐方式
	cout<<setw(13)<<"name"<<setw(5)<<"sex"<<setw(13)<<"tele"<<setw(31)<<"addr"<<endl;
	for(int i=0;i<n;i++){
		np=p[i];
		Print(np);//调用打印记录函数
	}
	cout<<endl;
	cout<<"%&@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@&%"<<endl;
}
//打印记录
void Print(person*&p)
{
	person*np=p;
	while(np!=NULL){
			Cout(np);//调用输出记录信息函数
			np=np->next;
	}
}
//输出记录信息
void Cout(person*p)
{
	cout.setf(ios::left);
	//指定输出信息的对齐方式
	cout<<setw(13)<<p->Data.name<<setw(5)<<p->Data.sex<<setw(13)<<p->Data.tele<<setw(31)<<p->Data.addr<<endl;
	//set()指出输出信息的长度
}
//输入记录信息
void Cin(person*p)
{
	cout<<"name(12): ";
	cin>>p->Data.name;
	cout<<"sex(m/f): ";
	cin>>p->Data.sex;
	cout<<"tele(12): ";
	cin>>p->Data.tele;
	cout<<"addr(30): ";
	cin>>p->Data.addr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -