从给定的代码片段来看,这是一个用C++编写的简单通讯录系统,旨在管理联系人的姓名、地址和电话号码。该程序通过几个关键函数实现了基本的功能:创建通讯录、显示联系人信息、删除联系人、查找联系人以及添加或修改联系人信息。下面将详细解析这些功能及其实现方式。 ### 1. 创建通讯录(`creat()`) 在`creat()`函数中,程序首先尝试打开一个名为`people.txt`的文件,如果文件存在,则读取其中的联系人信息并将其加载到链表中。这里使用了`fopen()`函数以读写模式打开文件,接着利用`fgetc()`和`fread()`函数读取文件中的数据。如果文件不存在,则创建一个新的文件用于存储联系人信息。该函数利用动态内存分配函数`malloc()`为每个联系人创建一个新的链表节点,并将文件中的信息复制到新节点中。更新链表头指针和尾指针,确保链表的完整性和正确性。 ### 2. 显示联系人信息(`Show()`) `Show()`函数遍历整个链表,打印出所有联系人的信息。这通过一个循环实现,每次迭代都会访问链表中的下一个节点,直到链表结束。每个节点的信息包括联系人的姓名、地址和电话号码。 ### 3. 删除联系人(`Delete()`) `Delete()`函数允许用户输入要删除的联系人姓名,然后在链表中查找匹配的节点并将其删除。该函数首先检查链表头节点是否是要删除的节点,如果是,则更新链表头指针指向下一个节点。如果不是,函数将继续在链表中搜索,直到找到匹配的节点或到达链表末尾。一旦找到匹配的节点,就更新前一个节点的`next`指针,使其指向被删除节点的下一个节点,然后释放被删除节点的内存。 ### 4. 查找联系人(`Find()`) `Find()`函数让用户输入要查找的联系人姓名,然后在链表中搜索匹配的节点。如果找到匹配项,函数将打印出该联系人的详细信息;如果没有找到,则输出相应的提示信息。 ### 5. 添加或修改联系人信息(`Input()`和`Alter()`) `Input()`函数允许用户向通讯录中添加新的联系人信息。它首先分配新的链表节点,然后请求用户输入联系人的姓名、地址和电话号码,并将这些信息存储在新节点中。如果链表为空,则新节点成为链表头;否则,新节点将连接到链表的最后一个节点之后。 `Alter()`函数尚未完全展示其功能实现,但从代码注释和部分代码推测,其目的是允许用户修改现有联系人的信息。用户需输入要修改的联系人姓名,程序会在链表中查找该联系人,找到后应允许用户更新其信息,具体实现细节未在提供的代码中完全展现。 这个简单的通讯录系统虽然代码量不大,但涵盖了基本的联系人管理功能,包括读取、显示、添加、修改和删除联系人信息。这对于学习C++的链表操作、文件处理和字符串操作等基础概念非常有帮助,是一个很好的教学案例。
#include <stdlib.h> /*与malloc.h差不多*/
#include <string.h>
#define maxlen 100
strUCt persons
{ char name[10]; /*定义结构体数组用于缓存数据*/
char addr[20];
char phnum[10];
}persons[maxlen];
;
;
;
typedef struct lnode{ /*通讯录结构中结点的定义*/
char name[10]; /*姓名*/
char addr[20]; /*地址*/
char phnum[10]; /*电话*/
struct lnode *next;
}listnode,*linklist;
;
;
;
linklist head=NULL,r=NULL; /*定义头指针和尾指针*/
listnode *s,*p0,*p1,*p2,*p3,*p4,*p5,*p6,*p7;
int i;
char name1[10],ch;
char str1[20];
FILE *fp; /*定义文件指针*/
;
;
void creat() /*将文件的信息读入结构体数组在转存入链表中*/
long k;
fp=fopen("people.txt","r+t"); /*打开文件*/
if(fp!=NULL)
{for(i=1;i<maxlen;i++)
{ j=fgetc(fp);
if(j==EOF)
return;
k=i-1;
fseek(fp,k*sizeof(struct persons),0); /*读取一个人的信息*/
fread(&persons[i],sizeof(struct persons),1,fp);
s=(linklist)malloc(sizeof(listnode)); /*装存入链表中*/
strcpy(s->name,persons[i].name);
strcpy(s->addr,persons[i].addr);
strcpy(s->phnum,persons[i].phnum);
if(head==NULL) /*用尾插法将其插入链表中*/
head=s;
else
r->next=s;
r=s;}
}
else
{ fp=fopen("people.txt","w"); /*不能打开另开辟一个文件*/
i=1;
}
}
;
;
;
void Show() /*显示所有的信息*/
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- bdwptqmxgj11.zip
- onnxruntime-win-x86
- onnxruntime-win-x64-gpu-1.20.1.zip
- vs2019 c++20 语法规范 头文件 <ratio> 的源码阅读与注释,处理分数的存储,加减乘除,以及大小比较等运算
- 首次尝试使用 Win,DirectX C++ 中的形状渲染套件.zip
- 预乘混合模式是一种用途广泛的三合一混合模式 它已经存在很长时间了,但似乎每隔几年就会被重新发现 该项目包括使用预乘 alpha 的描述,示例和工具 .zip
- 项目描述 DirectX 引擎支持版本 9、10、11 库 Microsoft SDK 功能相机视图、照明、加载网格、动画、蒙皮、层次结构界面、动画控制器、网格容器、碰撞系统 .zip
- 项目 wiki 文档中使用的代码教程的源代码库.zip
- 面向对象的通用GUI框架.zip
- 基于Java语言的PlayerBase游戏角色设计源码