通讯录管理系统


///课程设计:通讯录管理系统
///开发环境:VC++ 6.0
///author  : 10计科  yaoxinchao


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h> ///包含getche()
#include<iostream>
using namespace std;
///************************************************
///结构体声明
typedef struct Student
{
	
	long Snum;//学号
	char Sname[10];//姓名
	char Stel[20];//电话
	char Ssex;//性别
	char Saddress[20];///地址
	Student* next;
}Student , PStudent;
///*************************************************

///函数声明
void menu();//主菜单显示函数
void free_memory(Student* head);//释放申请的节点内存
void mySave(Student* head);		//将
void myCreate(Student* head );
Student*  read_from_file();
void myDisplay(Student* head);
void sch_num(Student* head);
void sch_name(Student* head);
void mySearch(Student* head);
void myModify(Student* head);
void del_by_num(Student* );
void del_by_name(Student* );
void myDelete(Student* head);
void myInsert(Student* head);
int cmp1( const void *a ,const void *b);
int cmp2( const void *a , const void *b );
void sort_by_num(Student* head);
void sort_by_name(Student* head);
void mySort(Student* head);

*****************************************************
主函数
int main(void)
{
	char choose ,yes_no;
	Student *head = NULL;
	do
	{
		system("cls");
		menu();
		printf("请输入选项编号:     ");
		choose = getchar();
		switch(choose)
		{
			case '1':
				myCreate( head );
				free_memory(head);
				break;
			case '2':
				head = read_from_file();
				myDisplay(head);
				free_memory(head);
				break;
			case '3':
				head = read_from_file();
				mySearch(head);
				free_memory(head);
				break;
			case '4':
				head = read_from_file();
				myModify(head);
				free_memory(head);
				break;
			case '5':
				head = read_from_file();
				myInsert(head);
				free_memory(head);
				break;
			case '6':
				head = read_from_file();
				myDelete(head);
				free_memory(head);
				break;
			case '7':
				head = read_from_file();
				mySort(head);
				free_memory(head);
				break;
			case '0':
				exit(0);
			default: printf("\n非法输入...\n\n");
		}
		printf("要进入主菜单继续操作吗(Y/N)?\n\n");
		do
		{
			yes_no = getchar();
		}while(yes_no != 'y' && yes_no != 'Y' && yes_no != 'n' && yes_no != 'N');
		getchar();
	}while(yes_no =='Y' || yes_no == 'y');

	//free_memory(head);
	return 0;
}
///******************************************************
///从键盘录入数据并同时保存到文件中
void myCreate(Student* head )
{
	Student* stu = NULL ,*end = NULL;
	FILE* fp = NULL;
	char ch;
	int count = 0;
	printf("\n\n     创建通讯录...\n     请输入学生信息...\n\n\n");

	head = end  = ( Student *)malloc(sizeof(Student));
	end->next = NULL;

	do
	{
		stu = ( Student *)malloc(sizeof(Student));
		count ++;///记录加一

		cout<<"请输入学生信息"<<endl;

		cout<<"学号:   ";
		scanf("%ld",&stu->Snum);
		cout<<endl<<"姓名:    ";
		scanf("%s",stu->Sname);
		cout<<endl<<"电话号码:    ";
		scanf("%s" ,stu->Stel); 
		cout<<endl<<"性别(M / W):    ";
		getchar();
		scanf("%c" ,&stu->Ssex);
		cout<<endl<<"家庭住址:    ";
		scanf("%s",stu->Saddress);

		stu->next  =  NULL;
		end->next = stu;
		end = stu;

		cout<<"是否继续输入(Y继续 or N 终止)"<<endl;
		getchar();
		ch = getchar();
		system("cls");
	}while( ch == 'y' || ch == 'Y');
	cout<<endl<<endl;
	///保存到文件
	if((fp = fopen("studentInfo.txt" ,"a+")) == NULL)
	{
		cout<<"Open or create file  failed...."<<endl;
		return ;
	}
	
	stu = head->next;
	while(stu != NULL)
	{
		fwrite((void *)stu ,sizeof(Student), 1 ,fp);
		stu = stu->next;		
	}
	///	关闭文件
	fclose(fp);

}

将文件中的信息读入内存
Student*  read_from_file()
{
	Student *stu, *end , *head;
	int i=0;
	FILE *fp;

	system("cls");
	if ((fp=fopen("studentInfo.txt","r")) == NULL)
	{
		printf("   can't open file StudentInfo.txt\n\n\n");
		exit(1);
	}

	head = end =(Student *)malloc(sizeof(Student));
	stu = (Student *)malloc(sizeof(Student));
	while (fread(stu , sizeof(Student),1,fp) == 1 )
	{ 
		  i++;
		  end->next=stu;
          end = stu ;
		  stu->next = NULL;
		  stu = (Student *)malloc(sizeof(Student));
     }
    free(stu);

    fclose(fp);

   if (i == 0)
   {  
	   printf("No recored in StudentInfo.txt!\n\n");
	   exit(0);
	}
  return (head);
}
///显示studentInfo中的信息
void myDisplay(Student* head)
{
	
	Student  *stu;
    stu = head->next;
    printf("\n信息\n");
    if(stu == NULL)
	{
	   printf("空\n");
	   return ;
	}
	printf("\n       学号      姓名        电话             性别      住址  \n\n\n");
    while(stu != NULL)
    {
        printf("      %ld   ",stu->Snum);
        printf("%s    ",stu->Sname);
        printf("   %s    ",stu->Stel);
		printf("   %c    ",stu->Ssex );
		printf("    %s    \n", stu->Saddress);
        stu = stu->next;
     }
	printf("\n");
}

///****************************************************************************

///查询
void mySearch(Student* head)
{
	char c;
	printf("\n\n\n按学号查询(h),还是按姓名查询(m)?\n\n输入:   ");
	c = getche();
	if(c == 'h' || c == 'H')
		sch_num(head);
	else if (c == 'm' || c == 'M')
		sch_name(head);
	else
		printf("\n     非法字符!    \n");
}

定义按学号查询通讯录的函数
void sch_num(Student * head)
{
	long  tempnum;  保存要查询的学号
	cout<<endl
		<<endl;
	cout<<"请输入要查询的学号:      ";
	scanf("%ld" , &tempnum);


	Student *stu;
	stu = head->next;

	while(stu != NULL )
	{
		if(stu->Snum != tempnum)
		{
			stu =  stu->next;
		}
		else if(stu->Snum == tempnum)
		{
			system("cls");
			printf("\n\n");
			printf("找到要查询的学生信息");
			printf("\n\n");
			printf("\n       学号      姓名        电话             性别      住址  \n\n\n");
			printf("      %ld   ",stu->Snum);
			printf("%s    ",stu->Sname);
			printf("   %s    ",stu->Stel);
			printf("   %c    ",stu->Ssex );
			printf("    %s    \n", stu->Saddress);
			return ;
		}
				
	}	
		printf("\n\n 没有要查询的学生信息...\n\n");
		return ;
}

void sch_name(Student* head)
{
	char tempname[20];
	cout<<endl;
	cout<<endl;
	cout<<endl
		<<endl;;
	printf("输入要查询的学生姓名:     ");
	scanf("%s",tempname);

	Student *stu;
	stu = head->next;

	while(stu != NULL )
	{
		if(strcmp(stu->Sname ,tempname) != 0 )
		{
			stu =  stu->next;
		}
		else
		{
			system("cls");
			printf("\n\n\n");
			printf("            找到要查询的学生信息....");
			printf("\n\n\n");
			printf("\n       学号      姓名         电话             性别      住址  \n\n\n");
			printf("      %ld   ",stu->Snum);
			printf("%s    ",stu->Sname);
			printf("    %s    ",stu->Stel);
			printf("   %c    ",stu->Ssex );
			printf("    %s    \n", stu->Saddress);
			printf("\n\n\n");
			break;
		}
	}

	printf("\n\n 没有要查询的学生信息.....\n\n\n");
		return ;
	
}
///*******************************************************************************
void myModify(Student* head)
{
	long tempnum;
	printf("\n\n\n请输入要修改记录的学号:     ");
	scanf("%ld" ,&tempnum);
	Student *stu;
	stu = head->next;

	while(stu != NULL )
	{
		if(stu->Snum == tempnum  )
		{
			printf("\n\n输入姓名:    ");
			scanf("%s" , stu->Sname);
			printf("\n\n输入号码:    ");
			scanf("%s" , stu->Stel);
			getchar();
			printf("\n\n输入性别(M / W):    ");
			scanf("%c" ,&stu->Ssex);
			printf("\n\n输入地址:    ");
			scanf("%s" ,stu->Saddress);
			
			system("cls");
			cout<<endl<<endl<<"修改后的信息....."<<endl<<endl;
			printf("\n       学号      姓名         电话             性别       住址  \n\n\n");
			printf("      %ld   ",stu->Snum);
			printf("%s    ",stu->Sname);
			printf("    %s    ",stu->Stel);
			printf("   %c    ",stu->Ssex );
			printf("     %s    \n", stu->Saddress);
			printf("\n\n\n");

			mySave(head);更新信息
			return ;
		}
		else
		{
			stu =  stu->next;
		}
	}

	printf("\n\n没有查找到要修改的信息......\n\n请仔细检查后重新输入......\n\n\n");
	return ;
}
**************************************************************************************************
///删除
void myDelete(Student* head)
{
	char choose;
	printf("\n\n 按学号删除(h/H) , 按姓名删除(m/M)......\n\n 请输入:      ");
	getchar();
	choose = getchar();
	if(choose == 'h' ||  choose == 'H')
		del_by_num(head);
	else if(choose == 'm' ||  choose == 'M')
		del_by_name(head);
	else
	{
		printf("\n\n  非法字符...\n\n");
		return ;
	}

	///更新学生信息表
	mySave(head);
}

void del_by_num(Student* head)
{
	Student* stu, *temp;
	long tempnum;
	printf("\n输入要删除的学号:    ");
	scanf("%ld",&tempnum);

	temp = head; 
	stu = head->next;
	while(stu != NULL )
	{
		if(stu->Snum == tempnum)
		{
			printf("\n\n找到要删除的内容....\n\n");
			printf("学号为%d 的学生信息已删除\n\n", tempnum);
			temp->next  = stu->next;
			free(stu);
			return ;
		}
		else
		{
			temp = stu;
			stu = stu->next;
		}
	}
	printf("\n\n没有找到要删除的内容\n\n");
	printf("仔细检查后重新输入!");
	return;

}
void del_by_name(Student* head)
{
	Student* stu, *temp;
	char tempname[20];
	printf("\n输入要删除的学生姓名:    ");
	scanf("%s",tempname);

	temp = head; 
	stu = head->next;
	while(stu != NULL )
	{
		if(strcmp(stu->Sname ,tempname) == 0)
		{
			printf("\n\n  找到要删除的内容....、\n\n");
			temp->next  = stu->next;
			free(stu);
			return ;
		}
		else
		{
			temp = stu;
			stu = stu->next;
		}
	}
	printf("\n\n没有找到要删除的内容...\n\n");
	return;
}
*********************************************************************
void mySave(Student* head)
{
	Student* stu;
	FILE* fp;
	if( (fp = fopen("studentInfo.txt","w")) == NULL)
	{
		printf("\n\n  文件打开失败....\n\n");
		return ;
	}

	stu = head->next ;
	while(stu != NULL)
	{
		fwrite((void *)stu,sizeof(Student),1,fp);
		stu = stu->next;
	}
	fclose(fp);

	///保存成功
	printf("\n\n保存成功....\n\n");
}
*****************************************************
//插入功能:将新建信息插入到文件头
void myInsert(Student* head)
{
	Student* stu ,*temp;
	printf("\n\n  插入功能...\n\n  将新建信息插入到文件头....\n\n");
	printf("  请输入要插入的学生信息...\n\n");
	temp = head->next ;
	stu = (Student*)malloc(sizeof(Student));
	
	cout<<"学号:   ";
	scanf("%ld",&stu->Snum);
	while(temp != NULL)
	{
		if(temp->Snum == stu->Snum )
		{
			printf("\n  学号相同,不能插入,请重新输入...\n\n");
			return ;
		}
		else
			temp = temp->next ;
	}
	cout<<endl<<"姓名:    ";
	scanf("%s",stu->Sname);
	cout<<endl<<"电话号码:    ";
	scanf("%s" ,stu->Stel); 
	cout<<endl<<"性别(M / W):    ";
	getchar();
	scanf("%c" ,&stu->Ssex);
	cout<<endl<<"家庭住址:    ";
	scanf("%s",stu->Saddress);

	stu->next = head->next ;
	head->next = stu;

	///保存信息
	mySave(head);
}

///****************************************************************

void mySort(Student* head)
{
	char choose;
	printf("\n\n 按学号排序(h/H) , 按姓名排序(m/M)......\n\n 请输入:      ");
	getchar();
	choose = getchar();
	if(choose == 'h' ||  choose == 'H')
		sort_by_num(head);
	else if(choose == 'm' ||  choose == 'M')
		sort_by_name(head);
	else
	{
		printf("\n\n  非法字符...\n\n");
		return ;
	}

	///更新学生信息表
	//mySave(head);            ///*********************
}

int cmp1( const void *a ,const void *b)
 
{ 
	return (*(Student *)a).Snum  > (*(Student *)b).Snum ? 1 : -1; 
}

void sort_by_num(Student* head)
{
	Student* stu = NULL;
	Student  arrstu[100];
	stu = head->next ;
	int count = 0;
	for(; stu != NULL ; stu = stu->next )
	{
		strcpy(arrstu[count].Saddress  , stu->Saddress) ;
		strcpy(arrstu[count].Sname , stu->Sname) ;
		arrstu[count].Snum  = stu->Snum;
		arrstu[count].Ssex  = stu->Ssex ;
		strcpy(arrstu[count].Stel , stu->Stel);
		count++;
	}
	qsort(arrstu,count,sizeof(arrstu[0]) ,cmp1);
	
	stu = head->next ;
	
	for( int i = 0; i < count  ; i++ )
	{
		strcpy(stu->Saddress  , arrstu[i].Saddress)  ;
		strcpy(stu->Sname , arrstu[i].Sname) ;
		stu->Snum = arrstu[i].Snum ;
		stu->Ssex = arrstu[i].Ssex ;
		strcpy(stu->Stel , arrstu[i].Stel) ;
		stu = stu->next ;
	}
	mySave(head);
}

int cmp2( const void *a , const void *b )
 
{
 
	return strcmp( (*(Student *)a).Sname, (*(Student *)b).Sname );
 
}

void sort_by_name(Student* head)
{
	Student* stu = NULL;
	Student  arrstu[100];
	stu = head->next ;
	int count = 0;
	for(; stu != NULL ; stu = stu->next )
	{
		strcpy(arrstu[count].Saddress  , stu->Saddress) ;
		strcpy(arrstu[count].Sname , stu->Sname) ;
		arrstu[count].Snum  = stu->Snum;
		arrstu[count].Ssex  = stu->Ssex ;
		strcpy(arrstu[count].Stel , stu->Stel);
		count++;
	}
	qsort(arrstu,count,sizeof(arrstu[0]) ,cmp2);
	
	stu = head->next ;
	
	for( int i = 0; i < count  ; i++ )
	{
		strcpy(stu->Saddress  , arrstu[i].Saddress)  ;
		strcpy(stu->Sname , arrstu[i].Sname) ;
		stu->Snum = arrstu[i].Snum ;
		stu->Ssex = arrstu[i].Ssex ;
		strcpy(stu->Stel , arrstu[i].Stel) ;
		stu = stu->next ;
	}
	mySave(head);
}

void free_memory(Student* head)
{
	Student* stu;
	stu = head ;
	for(; stu != NULL ; )
	{
		head = stu->next;
		free(stu);
		stu = head;
	}

	cout<<"            学生信息已保存到文件....."<<endl
		<<"            申请的内存已释放........"<<endl;
}

void menu()
{
	printf("|---------------------------------------------|\n");
	printf("|               请输入编号(0~7):            |\n");
	printf("|---------------------------------------------|\n");
	printf("|               1---创建通讯录                |\n");
	printf("|               2---显示通讯录                |\n");
	printf("|               3---查询通讯录                |\n");
	printf("|               4---修改通讯录                |\n");
	printf("|               5---添加通讯录中的记录        |\n");
	printf("|               6---删除通讯录中的记录        |\n");
	printf("|               7---排序通讯录                |\n");
	printf("|               0---退出通讯录                |\n");
	printf("|---------------------------------------------|\n");

}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值