想复习下链表的操作,就写了个简易的通讯录。同时也实现了文件的读写,可以把输入的数据永久性的保存到该目录下的文件。在这里分享下!
头文件
首先写一个通讯录的头文件 contacts.h
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <conio.h>
#include <synchapi.h>
#define NAME_SIZE 50 //名字长度//
#define SEX_SIZE 20 //性别字符长度//
#define PHONE_SIZE 50 //电话号码长度//
typedef struct Contact_Node{
char Name[NAME_SIZE];
char Sex[SEX_SIZE];
char Phone[PHONE_SIZE];
struct Contact_Node *Link;
}*pContacts,Contact;
void Menu (); //功能菜单//
void Add (); //新建联系人//
void Delete(); //删除联系人//
void View_Contacts(); //查看所有联系人//
void Find (); //查找指定联系人//
void revise(); //修改联系人//
pContacts Read_Contacts(); //将文件数据以链表方式读出//
void Write_Contacts(pContacts Head); //链表写入文件//
菜单
自己打印个框!!!1
void Menu (){
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ☆**************************************************************************★\n");
printf(" ★ 通讯录管理系统 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1.新建联系人信息 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 2.浏览所有联系人 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 3.查找联系人信息 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 4.修改联系人信息 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 5.删除联系人信息 ☆\n");
printf(" ☆**************************************************************************★\n");
printf(" ★ 输入0退出系统 ☆\n");
printf(" ☆--------------------------------------------------------------------------★\n\n");
}
主函数
这个是程序的入口,开始我设置了下控制台打开的大小!
int main (){
system("mode con cols=100 lines=25");
int Input;
do{
Menu();
printf(" ");
scanf("%d",&Input);
switch (Input){
case 1:
system("cls");
Add ();
break;
case 2:
system("cls");
View_Contacts();
break;
case 3:
system("cls");
Find ();
break;
case 4:
system("cls");
revise();
break;
case 5:
system("cls");
Delete();
break;
case 0:return 0;
default:printf("请输入合适的数字!\n");
}
}while (1);
}
文件数据以链表方式读出
我是用fscanf读的文件中的内容,然后把他们链表方式连接,和链表的创建相似
pContacts Read_Contacts(){
pContacts Head,Tail,New;
FILE *fp;
fp=fopen("contacts.txt","r");
if (fp==NULL)
{
printf("通讯录打开失败!\n");
exit(-1);
}
Head=(pContacts)malloc(sizeof(Contact));
Head->Link=NULL;
Tail=Head;
char Name[NAME_SIZE];
char Sex[SEX_SIZE];
char Phone[PHONE_SIZE];
while (fscanf(fp,"%s%s%s",Name,Sex,Phone)!=EOF){
New=(pContacts)malloc(sizeof(Contact));
strcpy(New->Name,Name);
strcpy(New->Sex,Sex);
strcpy(New->Phone,Phone);
New->Link=NULL;
Tail->Link=New;
Tail=New;
}
fclose(fp);
return Head;
}
链表写入文件
我用的fprint把链表一个一个写到文件
void Write_Contacts(pContacts Head){
pContacts p;
FILE *fp;
fp=fopen("contacts.txt","w");
if (fp==NULL)
{
printf("通讯录打开失败!\n");
exit(-1);
}
p=Head->Link;
while (p!=NULL)
{
fprintf(fp,"%s %s %s\n",p->Name,p->Sex,p->Phone);
p=p->Link;
}
fclose(fp);
}
新建联系人
这里就是基本的链表操作了,唯一就是先在文件里面读出链表,插入新节点后再把链表读入到文件中
void Add (){
pContacts Head,New;
Head=Read_Contacts();
New=(pContacts)malloc(sizeof(Contact));
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ☆**************************************************************************★\n");
printf(" ★ 通讯录管理系统 ☆\n");
printf(" \n");
printf(" 请输入姓名:\n");
printf(" ");
scanf("%s",New->Name);
printf(" 请输入性别:\n");
printf(" ");
scanf("%s",New->Sex);
printf(" 请输入号码:\n");
printf(" ");
scanf("%s",New->Phone);
New->Link=Head->Link;
Head->Link=New;
Write_Contacts(Head);
printf(" 保存成功!\n");
Sleep(1500);
system("cls");
free(New);
free(Head);
}
查看所有联系人
对链表进行一次遍历
void View_Contacts(){
pContacts Head,p;
Head=Read_Contacts();
p=Head->Link;
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ☆**************************************************************************★\n");
printf(" ★ 通讯录管理系统 ☆\n");
printf(" \n");
if (p!=NULL){
printf(" \t\t姓名\t\t性别\t\t 号码\n");
printf(" ☆**************************************************************************★\n");
}
else{
printf(" 此通讯录为空!\n");
Sleep(1500);
system("cls");
}
while (p!=NULL){
printf(" \t\t%s\t\t %s\t\t%s\n",p->Name,p->Sex,p->Phone);
printf(" ☆**************************************************************************★\n");
p=p->Link;
}
printf("\n ");
system("pause");
system("cls");
free(Head);
free(p);
}
查找指定联系人
也是对链表遍历在做匹配
void Find (){
pContacts Head;
char Name[NAME_SIZE];
int flag=0;
Head=Read_Contacts();
pContacts p;
p=Head->Link;
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ☆**************************************************************************★\n");
printf(" ★ 通讯录管理系统 ☆\n");
printf(" \n");
printf(" 请输入查询联系人姓名:\n");
printf(" ");
scanf("%s",Name);
while (p!=NULL){
if (strcmp(p->Name,Name)==0)
{
flag=1;
printf("\n");
printf(" \t\t姓名\t\t性别\t\t 号码\n");
printf(" ☆**************************************************************************★\n");
printf(" \t\t%s\t\t %s\t\t%s\n",p->Name,p->Sex,p->Phone);
printf(" ☆**************************************************************************★\n");
break;
}
p=p->Link;
}
if (!flag)
{
printf(" ☆**************************************************************************★\n");
printf(" 查无此人!\n");
printf(" ☆**************************************************************************★\n");
}
printf("\n ");
system("pause");
system("cls");
}
修改联系人
遍历链表修改制定数据
void revise(){
pContacts Head,p;
Head=Read_Contacts();
char Name[NAME_SIZE];
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ☆**************************************************************************★\n");
printf(" ★ 通讯录管理系统 ☆\n");
printf(" \n");
printf(" 请输入需要修改的联系人姓名:\n");
printf(" ");
scanf("%s",Name);
p=Head->Link;
int flag=0;
while (p!=NULL){
if (strcmp(p->Name,Name)==0){
flag=1;
printf(" 请输入需要修改的联系人姓名:\n");
printf(" ");
scanf("%s",p->Name);
printf(" 请输入需要修改的联系人性别:\n");
printf(" ");
scanf("%s",p->Sex);
printf(" 请输入需要修改的联系人号码:\n");
printf(" ");
scanf("%s",p->Phone);
printf(" ☆**************************************************************************★\n");
printf(" 修改成功!\n");
printf(" ☆**************************************************************************★\n");
Write_Contacts(Head);
break;
}
p=p->Link;
}
free(Head);
free(p);
if (!flag)
{
printf(" ☆**************************************************************************★\n");
printf(" 查无此人!\n");
printf(" ☆**************************************************************************★\n");
}
Sleep(1500);
system("cls");
}
删除联系人
链表的基本删除
void Delete(){
pContacts Head;
pContacts *top,tail;
int flag=0;
char Name[NAME_SIZE];
Head=Read_Contacts();
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf(" ☆**************************************************************************★\n");
printf(" ★ 通讯录管理系统 ☆\n");
printf(" \n");
printf(" \t\t请输入删除联系人的姓名:\n");
printf(" \t\t");
scanf("%s",Name);
top=&Head->Link;
tail=*top;
while (tail!=NULL)
{
if (strcmp(tail->Name,Name)==0) {
flag=1;
*top=tail->Link;
free(tail);
printf(" 删除成功!\n");
break;
}
else{
top=&(tail->Link);
tail=tail->Link;
}
}
Write_Contacts(Head);
if (!flag)
{
printf(" 通讯录没有此人!\n");
}
Sleep(1500);
system("cls");
free(Head);
}