实现的通讯录功能有:查看通讯录、添加联系人、删除联系人、查询联系人、保存并退出。

通过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语言单向链表实现的更多相关文章

  1. C语言 - 基础数据结构和算法 - 单向链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  2. ZT C语言链表操作(新增单向链表的逆序建立)

    这个不好懂,不如看 转贴:C语言链表基本操作http://www.cnblogs.com/jeanschen/p/3542668.html ZT 链表逆序http://www.cnblogs.com/ ...

  3. C语言单向链表

    1,为什么要用到链表 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性.但数组也同样存在一些弊病.如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中 ...

  4. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

    #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...

  5. C语言基础 - 实现单向链表

    回归C基础 实现一个单向链表,并有逆序功能 (大学数据结构经常是这么入门的) //定义单链表结构体 typedef struct Node{ int value; struct Node *next; ...

  6. C语言:创建动态单向链表,创建完成后,输出每一个节点的数据信息。

    // //  main.c //  dynamic_link_list // //  Created by ma c on 15/8/5. //  Copyright (c) 2015. All ri ...

  7. C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码

    实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1-> ...

  8. C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,

    //将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...

  9. C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,

    //函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...

随机推荐

  1. Linux:Day18(上) dns服务基础进阶

    DNS:Domain Name Service,协议(C/S,53/udp,53/tcp):应用层协议. BIND:Bekerley Internat Name Domain,ISC(www.isc. ...

  2. springmvc源码分析——入门看springmvc的加载过程

    本文将分析springmvc是如何在容器启动的时候将各个模块加载完成容器的创建的. 我知道在web.xml文件中我们是这样配置springmvc的: 可以看到,springmvc的核心控制器就是Dis ...

  3. EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public?

    前言 不知我们是否思考过一个问题,在关系映射中对于导航属性的访问修饰符是否一定必须为public呢?如果从未想过这个问题,那么我们接下来来探讨这个问题. EF 6.x和EF Core 何种情况下必须配 ...

  4. [Alpha阶段]第十一次Scrum Meeting

    Scrum Meeting博客目录 [Alpha阶段]第十一次Scrum Meeting 基本信息 名称 时间 地点 时长 第六次Scrum Meeting 19/04/20 大运村寝室6楼 65mi ...

  5. (四)jdk8学习心得之函数式接口

    四.函数式接口 1. 格式 注:抽象方法就是通过lambda表达式或者方法引用实现. 2. Jdk提供的函数式接口(这里提供五个最为常用的) 3. 技巧 通过函数式接口,就可以把一个函数作为一个参数进 ...

  6. 五、Redis持久化配置

    转载:[https://www.cnblogs.com/xingzc/p/5988080.html] Redis提供的持久化机制(RDB和AOF) Redis提供的持久化机制 Redis是一种面向“k ...

  7. POJ 1915 Knight Moves

    POJ 1915 Knight Moves Knight Moves   Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 29 ...

  8. ABP中的依赖注入思想

    在充分理解整个ABP系统架构之前首先必须充分了解ABP中最重要的依赖注入思想,在后面会具体举出一些实例来帮助你充分了解ABP中的依赖注入思想,在了解这个之前我们首先来看看什么是依赖注入?来看看维基百科 ...

  9. Python基础:语法基础(3)

    本篇主要介绍Python中一些基础语法,其中包括:标识符.关键字.常量.变量.表达式.语句.注释.模块和包等内容. 1. 标识符和关键字 1.1 标识符 标识符是变量.常量.函数.属性.类.模块和包等 ...

  10. servlet(5) HttpSession

    Servlet 提供的 HttpSession 接口,提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式. Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP ...