这是我大一的时候写的,那时候没什么水平,现在翻电脑突然翻到了,于是就分享出来,高手勿喷。
1、菜单
2、运行结果
自行运行吧,源码放下面。
3、完整源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define LEN sizeof(struct People)
void views_people(struct People *head); //查看全部信息
void view_people(struct People *head); //查看单个信息
void add_people(struct People *head); //添加信息
void del_people(struct People *head); //删除单个联系人信息
void menu(struct People *head); //菜单
void Read(struct People *head); //读取信息到链表
void Write(struct People *head); //保存信息到文本
struct People{
char id[10]; //人员号
char name[10]; //姓名
char sex[4]; //性别
char num[20]; //电话号码
char birth[20]; //生日
char addr[30]; //家庭地址
struct People* next;//指向下一个结点
};
void Read(struct People *head){ //读取信息到链表
FILE *fp;//文件指针
fp=fopen("txl.txt","r");//以读的方式打开文件
if(fp==NULL){//文件不存在或打开失败则提示错误信息
printf("文件打开失败!\n");
return;
}
struct People *p1,*p2;//创建两个链表指针
p1=(struct People*)malloc(LEN);//开辟空间
p1=head;//指向头结点
while(!feof(fp)){//文件不为空,就一直读取
p2=(struct People*)malloc(LEN);//开辟空间
p2->next=NULL;//让下一节点为空
fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\n",&p2->id,&p2->name,&p2->sex,&p2->num,&p2->birth,&p2->addr);//读取文件
if (feof(fp)) break;//文件为空就退出
p1->next=p2;//指向下一结点
p1=p2;
}
fclose(fp);//关闭文件
}
void Write(struct People *head){ //保存链表信息到文本
FILE *fp;//文件指针
fp=fopen("txl.txt","w");//以写的方式打开文件
if(fp==NULL){//文件不存在或打开失败则提示错误信息
printf("文件打开失败!\n");
return;
}
struct People *p1;//创建一个链表指针
p1=(struct People*)malloc(LEN);//开辟空间
p1=head->next;//指向首元结点
while(p1!=NULL){//结点不为空
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\n",p1->id,p1->name,p1->sex,p1->num,p1->birth,p1->addr);//保存一条信息
p1=p1->next;//指向下一结点
}
fclose(fp);//关闭文件
printf("信息保存成功!\n");
system("pause");
}
void add_people(struct People *head){ //添加信息
system("cls");//清屏
struct People *p1,*p2;//创建两个结点
p1=p2=(struct People*)malloc(LEN);//给结点开辟空间
int i=0;
printf("------------------------------------\n");
p1->next=NULL;
p2=head;
printf("请输入人员号:\n");
scanf("%s",&p1->id);//输入人员号
while(p2->next!=NULL){//查找链表中是否存在相同人员号的人
if(strcmp(p2->next->id,p1->id)==0){//比较id,即人员号,存在则重新输入
printf("此人员号已存在!\n");
printf("请重新输入:");
scanf("%s",&p1->id);
}
p2=p2->next;
}
printf("请输入姓名:\n");
scanf("%s",&p1->name);
printf("请输入性别:\n");
scanf("%s",&p1->sex);
printf("请输入生日:\n");
scanf("%s",&p1->birth);
printf("请输入电话:\n");
scanf("%s",&p1->num);
printf("请输入所在地:\n");
scanf("%s",&p1->addr);
p2->next=p1;//连接到链表尾部,即添加
p2=p1;
system("cls");
printf("添加成功!\n");
system("pause");
}
void views_people(struct People *head){ //查看全部信息
system("cls");//清屏
struct People *pt;
if(head->next!=NULL){
printf("人员号\t姓名\t性别\t生日\t电话\t所在地\n");
for(pt=head->next;pt!=NULL;){//利用for循环遍历链表,打印各个结点的信息
printf("-------------------------------------------------------------\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\n",pt->id,pt->name,pt->sex,pt->num,pt->birth,pt->addr);
pt=pt->next;
printf("-------------------------------------------------------------\n");
}
}else{
printf("该系统中无数据!");
}
system("pause");
}
void view_people(struct People *head){ //单个查询,通过名字查询
system("cls");
struct People *pt;
printf("输入要查询的人员号:\n");
char m[20];
int flag=1;
scanf("%s",&m);
for(pt=head->next;pt!=NULL;){//遍历链表寻找是否存在输入的人员号
if(strcmp(pt->id,m)==0){//找到就输出信息并让flag=0,代表已找到
printf("成功找到!\n");
printf("人员号:%s\n姓名:%s\n性别:%s\n生日:%s\n电话:%s\n所在地:%s\n",pt->id,pt->name,pt->sex,pt->num,pt->birth,pt->addr);
flag=0;
break;
}
pt=pt->next;
}
if(flag==1){//flag等于1代表未找到,即没有此人
printf("查无此人!\n");
}
system("pause");
}
void del_people(struct People *head){ //删除单个联系人信息
system("cls");
struct People *p,*q;
p=head;
q=p->next;
printf("请输入要删除的联系人:");
char m[20];
scanf("%s",&m);
int flag=1;
while(q!=NULL){//遍历链表寻找是否存在输入的人员号
if(strcmp(m,q->id)==0){
p->next=q->next;
free(q);
printf("删除成功!\n");
flag=0;
system("pause");
break;
}
p=q;
q=q->next;
}
if(flag==1){
printf("查无此人!\n");
system("pause");
}
}
void menu(struct People *head){//菜单函数,功能是打印选项供用户选择
system("cls");
printf("---------------------------------\n");
printf("----------通讯录管理系统----------\n");
printf("----------1、录入信息 ---------\n");
printf("----------2、查看全部信息---------\n");
printf("----------3、查看单个信息---------\n");
printf("----------4、删除单个信息---------\n");
printf("----------5、保存以上操作---------\n");
printf("----------6、退出系统 ---------\n");
int choice;
printf("选择任意一个功能:\n");
scanf("%d",&choice);
switch (choice){//利用switch-case来选择菜单
case 1:
add_people(head);//添加信息
menu(head);
break;
case 2:
views_people(head);//查看全部信息
menu(head);
break;
case 3:
view_people(head);//查询
menu(head);
break;
case 4:
del_people(head);//删除
menu(head);
break;
case 5:
Write(head);//保存信息
menu(head);
break;
case 6:
exit(1);//退出系统
break;
default:
printf("输入错误!\n");
system("pause");
menu(head);
}
}
int main(){
struct People* head;
head=(struct People*)malloc(LEN);//创建一个链表
head->next=NULL;
Read(head);//读取文本信息到链表中;
menu(head);//调用菜单函数
return 0;
}