C语言实现通讯录链表版(文件读写)

本文档展示了作者大学时期使用C语言编写的通讯录管理系统,包括添加、查看、删除和保存功能的源代码,适合学习链表操作和基础程序设计。
摘要由CSDN通过智能技术生成

这是我大一的时候写的,那时候没什么水平,现在翻电脑突然翻到了,于是就分享出来,高手勿喷。

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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值