IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【c语言】写了一个简单的通讯录程序 -> 正文阅读

[C++知识库]【c语言】写了一个简单的通讯录程序

【c语言】写了一个简单的通讯录程序


刚学习完单链表,赶紧写了一个通讯录小程序练练手!光看不练是很难提升的,自己真正动起手来才会发现许多问题。这次练习的过程中忽略了刚进入循环时的条件和逻辑符号的短路求值特性。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024 	//内存池的最大结点数量
void addPerson(struct Person **head);
void getInput(struct Person *person);
void printfPerson(struct Person *person);
void findPerson(struct Person *head);
void changePerson(struct Person **head);
void delPerson(struct Person **head);
void displayContent(struct Person *head);
void releasePool(void);
//为了不产生内存碎片,在程序中加入了内存池管理,用一个链表来存储内存
struct Person *pool = NULL;		
int count; 		//用于记录内存池中结点数量
struct Person
{
		char name[40];
		char phone[44];
		struct Person *next;
};

void getInput(struct Person *person)
{
		printf("请输入联系人姓名:");
		scanf("%s" , &person->name);
		printf("请输入联系人电话:");
		scanf("%s" , &person->phone);
}

void printfPerson(struct Person *person)
{
		printf("联系人姓名:%s\n" , person->name);
		printf("联系人电话:%s\n" , person->phone);
}

void addPerson(struct Person **head)  //这里要修改head指针,所以要传入二级指针(即指向head指针的指针)
{
		struct Person *_new;
		static struct Person *tail; 		//静态变量(全局)指向链表尾部,用于尾插法 
		
		//如果内存池非空,则直接从里面获取空间
		if (pool != NULL)
		{
				_new = pool;
				pool = pool->next;
				count--;	
		} 
		//如果内存池为空,则调用malloc函数申请新的内存空间 
		else
		{
				_new = (struct Person *)malloc(sizeof(struct Person)); 	
				if(_new == NULL)
				{
						printf("内存分配失败!\n");
						exit(1);
				}
		}
		getInput(_new);
		if(*head != NULL)
		{
				tail->next = _new;
				_new->next = NULL;
		}
		else
		{
				*head = _new;
				_new->next = NULL;
		}
		tail = _new;
		printf("录入成功!\n\n");	
}

void findPerson(struct Person *head)
{
		struct Person *person;
		person = head;
		char name[40];
		printf("请输入联系人姓名:");
		scanf("%s" , &name);
		
		while( person != NULL && strcmp(person->name , name) ) 		//注意判断条件的先后顺序!!!若person为NULL,就没有person->name,程序就卡在那无法判断  
		{
				person = person->next;	
		}
		if(person == NULL)
		{
				printf("找不到该联系人!\n\n");
		}
		else
		{
				printfPerson(person);	
				putchar('\n');
		}
			
}

void changePerson(struct Person **head)
{
		char name[40];
		struct Person *person;
		printf("请输入要查找的联系人姓名:");
		scanf("%s" , &name);
		person = *head;
		while( person != NULL && strcmp(person->name , name) )
		{
				person = person->next;
		}
		
		if(person == NULL)
		{
				printf("找不到该联系人!\n\n");
				return;
		}
		else
		{
				printf("请输入新的联系电话:" );
				
				scanf("%s" , &person->phone);
				printf("修改成功!\n\n");
		}
}

void delPerson(struct Person **head)
{
		struct Person *previous;
		struct Person *temp;
		struct Person *person;
		char name[40] ;
		char judge; 
		
		previous = NULL;
		person = *head;
		
		printf("请输入要删除的联系人姓名:");
		scanf("%s" , &name);
		
		while( person != NULL && strcmp(person->name , name) )
		{
				previous = person;
				person = person->next;
		}
		if(person == NULL)
		{
				printf("该联系人不存在!\n\n");
				return;
		}
		else
		{
				getchar(); 		//没加的时候出错 
				printf("确认删除该联系人吗?(Y/N):");
				scanf("%c" , &judge);
				if(judge == 'Y')
				{
						if(previous == NULL)				//这里要注意考虑删除第一个结点的情况,一开始忽略了 
						{
								*head = person->next;
						}
						else
						{
								previous->next = person->next;
								
						}
						printf("删除成功!\n\n");
						//判断内存池有没有空位
						if (count < MAX)
						{
								//用头插法把内存加入内存池 
								if (pool != NULL)
								{
										temp = pool;
										pool = person;
										person->next = temp;
								}
								else
								{
										pool = person;
										person->next = NULL;
								}
								count++;
						} 
						else
						{
								free(person);
						}
						
				}	
		}
}

void displayContent(struct Person *head)
{
		struct Person *person;
		person = head;
		if(person == NULL)
		{
				printf("通讯录为空!\n");
		}
		else
		{
				while(person != NULL)
				{
						printfPerson(person);
						person = person->next;
				}
				putchar('\n');
		}
}


void releaseContacts(struct Person **contacts)
{
		struct Person *temp;
		while(*contacts != NULL)
		{
				temp = *contacts;
				*contacts = (*contacts)->next;
				free(temp);
		}
}

void releasePool(void)
{
		struct Person *temp;
		while(pool != NULL)
		{
				temp = pool;
				pool = pool->next;
				free(temp);
		}
}
int main()
{
		printf("============通讯录程序2.0===========\n\
|---------1.插入新的联系人---------|\n\
|---------2.查找已有联系人---------|\n\
|---------3.更改已有联系人---------|\n\
|---------4.删除已有联系人---------|\n\
|---------5.显示当前通讯录---------|\n\
|---------6.退出通讯录程序---------|\n\
|--------Powered by PencilX--------|\n\n");

		struct Person *head = NULL; 		//链表头指针 
		
		while(1)
		{
				int order;		//指令 
				printf("请输入指令:");
				scanf("%d" , &order);
				
				switch(order)
				{
						case 1 : addPerson(&head);break;
						case 2 : findPerson(head);break;
						case 3 : changePerson(&head);break;
						case 4 : delPerson(&head);break;
						case 5 : displayContent(head);break;
						case 6 : goto END;
						default:{printf("请输入正确的指令!\n");putchar('\n');break;}
				}
		}
END:	
		releaseContacts(&head);
		releasePool();
		return 0;
}

实现效果如下:
运行效果

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 08:51:02  更:2021-08-28 08:51:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 21:27:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计