C语言通讯录系统——C语言单向链表实现
实现的通讯录功能有:查看通讯录、添加联系人、删除联系人、查询联系人、保存并退出。
通过txt文件保存和读取通讯录数据。
#include <stdio.h>
#include <string.h>
#include <Windows.h> void showMenu();
void initL();
void addPerson();
void displayPersons();
void deletePerson();
void saveList();
void searchPerson(); struct person_node {
char name[10];
char tel_num[20];
char company_or_school[20];
char sex[5];
person_node* next;
}; person_node* L = (person_node *)malloc(sizeof(person_node)); int main()
{
initL(); int k;
while (1)
{
system("cls");
showMenu();
scanf("%d", &k);
if (k == 1)
{
system("cls");
displayPersons();
}
else if (k == 2)
{
system("cls");
addPerson();
}
else if (k == 3)
{
system("cls");
deletePerson();
}
else if (k == 4)
{
system("cls");
searchPerson();
}
else if (k == 0)
{
saveList();
exit(0);
}
} system("pause");
return 0;
} void showMenu()
{
printf("------------------------------------------------------\n");
printf("\t\t\t通讯录系统\n\n");
printf("\t\t 1.查看通讯录\n");
printf("\t\t 2.添加联系人\n");
printf("\t\t 3.删除联系人\n");
printf("\t\t 4.查询联系人\n");
printf("\t\t 0.保存并退出\n");
printf("------------------------------------------------------\n");
} void addPerson()
{
int k = 1; while (k == 1)
{
printf("-------------------新建联系人--------------------------------\n");
person_node* new_person = (person_node *)malloc(sizeof(person_node));
printf("请输入联系人姓名:");
scanf("%s", new_person->name);
printf("请输入联系人性别:");
scanf("%s", new_person->sex);
printf("请输入联系人电话:");
scanf("%s", new_person->tel_num);
printf("请输入联系人单位:");
scanf("%s", new_person->company_or_school);
printf("------------------------------------------------------\n"); person_node* ptr = L;
while (ptr->next != NULL) //ptr指向链表L末尾结点
ptr = ptr->next; ptr->next = new_person;
new_person->next = NULL; printf("...输入'0'返回菜单...输入'1'继续添加...\n");
scanf("%d", &k);
if (k == 0)
return;
}
} void displayPersons()
{
person_node* ptr = L->next;
if (ptr == NULL)
printf("...暂未添加任何联系人...\n");
else
{
while (ptr != NULL)
{
printf("->姓名:%s", ptr->name);
printf("\t性别:%s", ptr->sex);
printf("\t电话:%s", ptr->tel_num);
printf("\t学校或公司:%s<-", ptr->company_or_school);
printf("\n");
ptr = ptr->next;
}
}
printf("...输入'0'返回菜单...");
int k = 10;
while (k != 0)
{
scanf("%d", &k);
}
return;
} void initL()
{
L->next = NULL; FILE *fp;
if ((fp = fopen("list_file.txt", "r")) == NULL)
{
printf("...打开联系人文件时出错...\n");
return;
} person_node* tail_ptr = L;
char name[10], tel_num[20], company_or_school[20], sex[5];
while (!feof(fp))
{
fscanf(fp, "%s%s%s%s", name, sex, tel_num, company_or_school);
person_node* new_node = (person_node *)malloc(sizeof(person_node));
strcpy(new_node->name, name);
strcpy(new_node->sex, sex);
strcpy(new_node->tel_num, tel_num);
strcpy(new_node->company_or_school, company_or_school);
tail_ptr->next = new_node;
new_node->next = NULL;
tail_ptr = new_node;
getc(fp);
}
fclose(fp);
} void deletePerson()
{
int k = 1;
while (k == 1)
{
printf("-------------------删除联系人--------------------------------\n");
person_node* ptr = L->next;
person_node* pre = L;
if (ptr == NULL)
printf("...通讯录中暂无联系人...\n");
else
{
printf("请输入删除联系人的姓名:");
char del_name[10];
scanf("%s", del_name);
while (ptr != NULL)
{
if (strcmp(ptr->name, del_name) == 0)
{
printf("...删除联系人条目...\n");
printf("->姓名:%s", ptr->name);
printf("\t性别:%s", ptr->sex);
printf("\t电话:%s", ptr->tel_num);
printf("\t学校或公司:%s<-", ptr->company_or_school); printf("\n确认删除吗?y/n\n");
char input = '0';
while (input != 'y' && input != 'n')
{
scanf("%c", &input);
}
if (input == 'n')
{
ptr = ptr->next;
pre = pre->next;
continue;
}
else if (input == 'y')
{
pre->next = ptr->next;
free(ptr);
ptr = pre->next;
continue;
}
}
ptr = ptr->next;
pre = pre->next;
}
}
printf("------------------------------------------------------\n");
printf("...输入'0'返回菜单...输入'1'继续删除...\n");
scanf("%d", &k);
if (k == 0)
return;
}
} void saveList()
{
if (L->next == NULL)
return; FILE *fp;
if ((fp = fopen("list_file.txt", "w")) == NULL)
printf("...打开联系人文件时出错...\n"); person_node* ptr = L->next;
while (ptr != NULL)
{
fprintf(fp, "\n%s %s %s %s", ptr->name, ptr->sex, ptr->tel_num, ptr->company_or_school);
ptr = ptr->next;
}
fclose(fp);
} void searchPerson()
{
int k = 1;
while (k == 1)
{
printf("-------------------查询联系人--------------------------------\n");
char search_name[10];
printf("请输入查询姓名:");
scanf("%s", search_name);
person_node* ptr = L->next;
if (ptr == NULL)
printf("...通讯录中暂无联系人...\n");
else
{
int count = 0;
while (ptr != NULL)
{
if (strcmp(ptr->name, search_name) == 0)
{
count++;
printf("...查询到联系人条目%d...\n", count);
printf("->姓名:%s", ptr->name);
printf("\t性别:%s", ptr->sex);
printf("\t电话:%s", ptr->tel_num);
printf("\t学校或公司:%s<-\n", ptr->company_or_school);
}
ptr = ptr->next;
}
}
printf("------------------------------------------------------\n");
printf("...输入'0'返回菜单...输入'1'继续查询...\n");
scanf("%d", &k);
if (k == 0)
return;
}
}
截图:


C语言通讯录系统——C语言单向链表实现的更多相关文章
- C语言 - 基础数据结构和算法 - 单向链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- ZT C语言链表操作(新增单向链表的逆序建立)
这个不好懂,不如看 转贴:C语言链表基本操作http://www.cnblogs.com/jeanschen/p/3542668.html ZT 链表逆序http://www.cnblogs.com/ ...
- C语言单向链表
1,为什么要用到链表 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性.但数组也同样存在一些弊病.如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中 ...
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...
- C语言基础 - 实现单向链表
回归C基础 实现一个单向链表,并有逆序功能 (大学数据结构经常是这么入门的) //定义单链表结构体 typedef struct Node{ int value; struct Node *next; ...
- C语言:创建动态单向链表,创建完成后,输出每一个节点的数据信息。
// // main.c // dynamic_link_list // // Created by ma c on 15/8/5. // Copyright (c) 2015. All ri ...
- C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码
实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1-> ...
- C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,
//将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...
- C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,
//函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...
随机推荐
- 影响Linux发展的四位天才黑客
影响Linux发展的四位天才黑客 相信大家对 Linux 再熟悉不过了.我们都知道 Linux继承自 Unix,但其实他们上一代还有一个 Multics.从最早的 Multics 发展到最早版本的 L ...
- 机器翻译评价指标 — BLEU算法
1,概述 机器翻译中常用的自动评价指标是 $BLEU$ 算法,除了在机器翻译中的应用,在其他的 $seq2seq$ 任务中也会使用,例如对话系统. 2 $BLEU$算法详解 假定人工给出的译文为$re ...
- windows 10隐藏各种文件夹
1.windows键+R打开运行,或者Ctrl+Alt+Del键调出任务管理器--文件--运行新的任务,然后出入"regedit"打开注册表: 2.按目录找到:[-HKEY_CLA ...
- node.js、js读取excel、操作excel、创建excel之js-xlsx.js
node.js篇 第一步引入包 npm install xlsx -save 第二步使用 var xl =require('xlsx'); //workbook 对象,指的是整份 Excel 文档.我 ...
- 【MongoDB异常】Exception authenticating MongoCredential解决方法
我们通过ideal编辑器编辑 springboot时候,出现这个错误: com.mongodb.MongoSecurityException: Exception authenticating Mon ...
- jmeter 安装
3.1 windows10环境下测试工具jmeter安装与配置 3.1.1下载安装java 浏览器中打开链接:http://down-www.7down.net/pcdown/soft/xiazai/ ...
- webpack基本用法
1. 压缩代码(production模式) optimization: { minimizer: [new UglifyJsPlugin({ cache: true, parallel: true, ...
- django-haystack全文检索
一:使用的工具haystack是django的开源搜索框架,该框架支持Solr,Elasticsearch,Whoosh, *Xapian*搜索引擎,不用更改代码,直接切换引擎,减少代码量.搜索引擎使 ...
- [NOI 2018] 归程
Description 传送门 Solution 65分做法 先求出每个点到\(1\)号点的最短路,记为\(d[i]\).然后按照海拔从大到小依次加边,并查集维护每个连通块中\(d[i]\)的最小值, ...
- Redis读取出错,JSON序列化的问题
报错 org.springframework.web.util.NestedServletException: Request processing failed; nested exception ...