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

截图:

原文地址:https://www.cnblogs.com/dew0/p/10597668.html

时间: 2024-07-30 08:00:44

C语言通讯录系统——C语言单向链表实现的相关文章

C语言之字符单向链表

/* * @Author: suifengtec * @Date:   2017-09-02 16:06:33 * @Last Modified by:   suifengtec * @Last Modified time: 2017-09-02 20:47:13 **/ /* 字符单向链表 gcc -o a.exe main.c && a  */ #include <stdio.h> #include <stdlib.h> #include <stdbool

写给过去的自己-No.1-数据结构篇-单向链表C语言的实现

过去的自己,你好.     今天我来教你单向链表,不知道你何时会看到这篇文章,也不知道你此刻对C语言的掌握,我会尽可能讲解细一点.     讲链表之前我先讲一下数组.相信你不管怎样肯定用过数组对吧,数组就是一种数据的组织形式,特点是所有的数据在逻辑上是顺序摆放的,通过数组名和数组下标 就可以找到某个元素,而且在内存中存放的物理地址也是连续的,定义数组时,一旦中括号中的数字确定了,数组中元素个数也就确定了.那么问题来了,因为数组 的大小需要提前确定,所以定义数组时必须统计好程序中用了多少元素,用多

C语言反转单向链表的代码

学习过程中中,把内容过程中常用的内容片段做个珍藏,下边内容段是关于C语言反转单向链表的内容,应该能对大伙有较大用处. #include "stdafx.h" enum{N = 3};class Node{public:int var;Node(int i):pNext(NULL), var(i){}}; {if(pHead->pNext->pNext != NULL)helper(pHead->pNext, reverseHead);elsereverseHead =

单向链表 c语言实现

定义(引用百度百科)单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据. 场景 在实际生产中,有可能在软件启动后,对一些数据进行多态扩容,比如,网卡收发包的时候,从协议栈上产生一个需求的包,需要暂时排队,等网卡把数据发送出去后,在在队列里处理,所以这种利用堆中分散的内存,以结点为单位的数据结果是有一定的意义

C语言之单向链表

1,单向链简洁.单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指针成员变量指列表中的下一个结点:?列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针: 2,例子要求:根据示例代码中的例子,完成单向链表(single linked list)中的以字符串为数据的链表的插入.删除以及查找,并支持单向链表的反转:

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

实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1->2->5->3->4 相当于仅仅实现了插入.遍历2个功能(当然遍历功能稍微修改就是销毁链表了) 用纯C写了份测试代码 /* 基本数据结构的定义以及函数的声明 */ typedef int ElemType; typedef struct Node { ElemType elem; struc

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

// //  main.c //  dynamic_link_list // //  Created by ma c on 15/8/5. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:写一个函数建立有3名学生数据的动态单向链表,并输出链表中每个结点的所有内容. /* 建立动态链表的思想: 1.开辟一个新结点,并使p1,p2指向它: 2.读入一个学生数据给p1所指的结点: 3.head = NULL,n = 0; 4.判断读

C语言学习之单向链表操作

该文件为单向链表操作的一些接口:(如发现有错误的地方,及时告知,不胜感激!) list.h #ifndef  _CHAINLIST_H_ #define  _CHAINLIST_H_ typedef struct { char key[15]; char name[20]; int age; }DATATYPE_T; typedef struct Node { DATATYPE_T  data; struct Node *next; }chainListType; /* 添加节点到链表末尾 */

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

#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student //结构体声明 { long num; int score; struct Student* next; }; int n; struct Student* creat() //创建单向链表 { struct Student *head=NULL, *p_before, *p_later; p_before =