///课程设计:通讯录管理系统
///开发环境: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");
}