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

通过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新手随手笔记

    RPM通过将安装规则与源代码打包到一起,来降低软件的安装难度 yum 通过将大量的常用RPM软件存放在一起,解决软件包之间的依赖关系,进一步降低软件的安装难度 rhel 5\6 init rhel 7 ...

  2. EntityFramework Core 2.1重新梳理系列属性映射(一)

    前言 满血复活啦,大概有三个月的时间没更新博客了,关于EF Core最新进展这三个月也没怎么去看,不知现阶段有何变化没,本文将以EF Core 2.1稳定版本作为重新梳理系列,希望对看本文的你有所帮助 ...

  3. modelsim10.1a安装破解说明

    安装包网盘下载链接:https://pan.baidu.com/s/1X9kUUXMCoikyjCQ_HKdD5g 提取码:3lfd 1.下载文件解压找到"modelsim-win32-10 ...

  4. H(X|Y)的推到过程

  5. Spark报错

    1. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at com.mysql.jdb ...

  6. 私有仓库 gitlab 部署笔记

    --------------------------------------------gitlab简介------------------------------------------------ ...

  7. Android 1.7 中不支持 lambda 表达式

    Error:(129, 32) 错误: -source 1.7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) lambda expressio ...

  8. C++开发python windows版本的扩展模块示例

    C++开发python windows版本的扩展模块示例 测试环境介绍和准备 测试环境: 操作系统:windows10 Python版本:3.7.0 VS版本:vs2015社区版(免费) 相关工具下载 ...

  9. 【python 字符串】 字符串的相关方法(二)

    查找元素所在的第一个的索引位置    text.find() 可有开始和结束位置查找  find('ex',3,6) # 查找元素的索引位置 text = 'alexalex' ret = text. ...

  10. LODOP打印用JS获取的当前日期

    该文详细一步步解释JS获取当前时间的方法,新手小白也看到懂,最后是实际的获取当前年月份的方法.JS中的Date()对象,包含很多当前系统时间的方法,首先建立一个Date()对象,这里取名为date,然 ...