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> ...
随机推荐
- 数据库MySQL和Redis实践
1.关于数据库设计的那些事 2.MySQL 3.Redis
- jupyter notebook修改默认路径和浏览器
1.jupyter notebook --generate-config 2.修改jupyter_notebook_config.py配置文件 3.修改默认路径: c.NotebookApp.note ...
- NOIP 2018 大翻车记
都9102年了我才想起来写游记啊 Day -1 肚子里翻江倒海,一天去了七次厕所.吃了PPA把病压下去.安慰一下自己,说这样会涨人品. Loli讲述学长们的翻车笔记.我大概像是玩笑一样听过去了.(伏笔 ...
- ssrfme 复现
这道题搞了我很长时间,主要太菜了,开始复现吧 <?php $sandbox = "sandbox/" . md5("orange" . $_SER ...
- iOS截屏并修改截图然后分享的功能实现
一. 实现的效果类似微博的截图分享 不仅截图分享的时候还进行图片的修改,增加自己的二维码 二.实现方式 苹果在ios7之后提供了一个新的通知类型:UIApplicationUserDidTakeScr ...
- Net包管理NuGet(2)nuget包的生成方法
1,下载NuGetPackageExplorer,可以下载运行源码,也可以直接下载安装包安装安装之后打开 设置好内容之后点击绿色的打钩保存然后操作右边空白处 然后点击File>Save;保存之后 ...
- Django(五)母版继承、Cookie、视图装饰器等
大纲 一.内容回顾 补充:默认值 补充:命名空间 二.模板语言 1.母版继承 2.include 3.自定义simple_tag 三.Cookie Cookie 使用总结 四.视图 1.获取用户请求相 ...
- StringBuilder的常用方法
转自:https://www.cnblogs.com/jack-Leo/p/6684447.html 在程序开发过程中,我们常常碰到字符串连接的情况,方便和直接的方式是通过"+"符 ...
- JavaScript判断是否为微信浏览器或支付宝浏览器
可以用手机安装的微信和支付宝扫描下方二维码测试 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- Q_UNUSED 的使用
在构建比较大型的工程的时候,若继承,重构虚函数,写数据model等等比较多的时候,会给出大量的 “未引用的形参” ,“warning: unused parameter ” 的告警.这种告警多了会影 ...