C语言实现电话簿项目管理

本文实例为大家分享了C语言实现电话簿项目管理的具体代码,供大家参考,具体内容如下

1.前言

在C语言的学习,经常有一个需要完成的项目就是电话簿的管理,在刚学习玩C语言基本内容后,面对这么多的项目需求往往无从下手,本文将一步一步完成电话簿的创建。本文提供一种思路,如有更好的实现欢迎讨论。

2.实现功能

本电话簿需要实现的功能有
实现电话簿的初始创建
实现电话簿的后添加
实现电话簿的删除
实现电话簿的查看(按链表的排序)
实现电话簿的查找(名字以及号码)
实现电话簿的排序(名字以及号码)

3.思路解析

3.1二级目录实现电话簿的初始创建

创建电话簿需要知道要保存什么信息,这是用我们的结构体来创建保存信息

typedef struct phone_book
{
 char job[30];//工作信息
 char number[20];//电话号码
 char name[15];//名字拼音
 char email[30];//邮箱信息
 struct phone_book* next;//指向下一个节点
}phone_book;

由于电话簿没有限定有多大,并且是动态变化的,这时候用数组来保存信息显然不合适,这时候就需要链表来实现。
在电话簿第一次运行时,里面没有任何信息,我们需要来创建电话簿。我们需要三个指针来帮助我们解决问题。 其中一个是链表的头指针,两外两个帮助我们开辟新的节点并指向下一个节点让我们的链表接下去。

phone_book* head, * p1, * p2;
head = NULL;//头指针初始化为空
p1 = (phone_book*)malloc(LEN);
p2 = p1;

完成指针的创建我们要输入信息,就是下面这串代码帮我们实现,创建联系人我不想一个一个输入,就用一个循环让它一直跑,直到名字输入0结束。(没有想到其他的好方法来结束欸~)
每输入信息后要往链表里加入,用一个变量记录联系人数量,创建第一个是把它弄到头指针里面去,后面的联系人通过两个指针处理接下去。

while (1)
 {
  printf("请输入姓名(姓名为0时停止创建):"); gets_s(p1->name);
  if (strcmp(p1->name, "0") == 0) break;
  printf("请输入电话号码:"); gets_s(p1->number);
  printf("请输入工作单位:"); gets_s(p1->job);
  printf("请输入E-mail:"); gets_s(p1->email);
  n = n + 1;
  if (n == 1)
   head = p1;
  else
   p2->next = p1;
  p2 = p1;
  p1 = (phone_book*)malloc(LEN);
 }p2->next = NULL;
 return head;

3.2二级目录实现电话簿的后添加

后添加的操作几乎和创建一模一直,只是操作时为了方便把他们加到头指针后面,所以这时候链表的排列并不是按照添加事件的顺序了。(头指针yyds)

3.3二级目录实现电话簿的删除

联系人的删除就有些难以理解了,不过也好理解。找到这个节点后,释放它,在这之前要标记它前一个节点后一个节点,让它俩连接起来。直接上代码。
通过查找我们发现要删除节点p,如果要删除的人正好在第一个,直接把头指针接到后面,如果不是,就让p1和p后面的节点相连,并且释放p

phone_book* p = head, * p1;//p1是p的前一个节点
  if (p == head)
  {
   head = p->next;
   free(p);
  }
  else
  {
   p1->next = p->next;
      free(p);
  }

3.4二级目录实现电话簿的查找

只需要比较信息即可实现,不过分为按名字和号码来实现,这就需要三个小函数来实现看代码即可理解

3.5二级目录实现电话簿的查找

只需要比较信息即可实现,不过分为按名字和号码来实现,这就需要三个小函数来实现看代码即可理解

3.6二级目录实现电话簿的排序

只需要比较信息即可实现,不过分为按名字和号码来实现,这就需要三个小函数来实现看代码即可理解

4.源代码及注释

#define _CRT_SECURE_NO_WARNINGS
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct phone_book
{
 char job[30];
 char number[20];
 char name[15];
 char email[30];
 struct phone_book* next;
}phone_book;
#define LEN sizeof(phone_book)
phone_book* creat_list()
{
 phone_book* head, * p1, * p2;
 char name[15];
 int n = 0;
 head = NULL;
 p1 = (phone_book*)malloc(LEN);
 p2 = p1;
 while (1)
 {
  printf("请输入姓名(姓名为0时停止创建):"); gets_s(p1->name);
  if (strcmp(p1->name, "0") == 0) break;
  printf("请输入电话号码:"); gets_s(p1->number);
  printf("请输入工作单位:"); gets_s(p1->job);
  printf("请输入E-mail:"); gets_s(p1->email);
  n = n + 1;
  if (n == 1)
   head = p1;
  else
   p2->next = p1;
  p2 = p1;
  p1 = (phone_book*)malloc(LEN);
 }p2->next = NULL;
 return head;
}//链表创建函数
void print_list(phone_book* head)
{
 void menu();
 int n = 0;
 printf("现在通讯录中有如下成员:");
 while (head != NULL)
 {
  printf("\n名字:"); puts(head->name);
  printf("\n电话号码:"); puts(head->number);
  printf("\n工作单位:"); puts(head->job);
  printf("\nE-mail:"); puts(head->email);
  putchar('\n');
  head = head->next;
  n++;
  if (n % 8 == 0)
  {
   printf("按回车键显示下一页");
   getchar();
   system("cls");
   menu();
  }
 }
 printf("总共%d个联系人\n", n);
}
int length(phone_book* head)
{
 int n = 0;
 phone_book* p;
 p = head;
 while (p != NULL)
 {
  p = p->next; n++;
 }
 return n;
}//判断联系人个数
void sortbynumber(phone_book* head)
{
 void menu();
 int n = length(head);
 int i, j;
 phone_book temp, * p;
 p = head;
 phone_book a[1000];
 for (i = 1; i <= n; i++)
 {
  strcpy(a[i].name, p->name);
  strcpy(a[i].number, p->number);
  strcpy(a[i].job, p->job);
  strcpy(a[i].email, p->email);
  p = p->next;
 }
 for (i = 1; i <= n - 1; i++)
 {
  for (j = 1; j <= n - i; j++)
  {
   if (strcmp(a[j].number, a[j + 1].number) > 0)

   {
    temp = a[j];
    a[j] = a[j + 1];
    a[j + 1] = temp;
   }
  }
 }
 printf("现在通讯录中有如下成员:");
 for (i = 1; i <= n; i++)
 {
  printf("\n名字:"); puts(a[i].name);
  printf("\n电话号码:"); puts(a[i].number);
  printf("\n工作单位:"); puts(a[i].job);
  printf("\nE-mail:"); puts(a[i].email);
  putchar('\n');
  if (i % 8 == 0)
  {
   printf("按回车键显示下一页");
   getchar();
   system("cls");
   menu();
  }
 }
 printf("总共%d个联系人\n", n);
}
void sortbyname(phone_book* head)
{
 void menu();
 int n = length(head);
 int i, j;
 phone_book temp, * p;
 p = head;
 phone_book a[100];
 for (i = 1; i <= n; i++)
 {
  strcpy(a[i].name, p->name);
  strcpy(a[i].number, p->number);
  strcpy(a[i].job, p->job);
  strcpy(a[i].email, p->email);
  p = p->next;
 }
 for (i = 1; i <= n - 1; i++)
 {
  for (j = 1; j <= n - i; j++)
  {
   if (strcmp(a[j].name, a[j + 1].name) > 0)
   {
    temp = a[j];
    a[j] = a[j + 1];
    a[j + 1] = temp;
   }
  }
 }
 printf("现在通讯录中有如下成员:");
 for (i = 1; i <= n; i++)
 {
  printf("\n名字:"); puts(a[i].name);
  printf("\n电话号码:"); puts(a[i].number);
  printf("\n工作单位:"); puts(a[i].job);
  printf("\nE-mail:"); puts(a[i].email);
  putchar('\n');
  if (i % 8 == 0)
  {
   printf("按回车键显示下一页");
   getchar();
   system("cls");
   menu();
  }
 }
 printf("总共%d个联系人\n", n);
}//排序按照电话号码
void sort_list(phone_book* head)
{
 void menu();
 if (head == NULL)
 {
  printf("电话簿为空,请重新创建!");
  return;
 }
 char a;
 printf("1,按电话号码升序排序\n2,按姓名字母升序排序\n");
 printf("请选择一种排序方法:");
 a = getchar();
 getchar();
 switch (a)
 {
 case'1':sortbynumber(head); break;
 case'2':sortbyname(head); break;
 default:printf("输入有误!\n"); break;
 }
}
void findbyname(phone_book* head)
{
 if (head == NULL)
 {
  printf("电话簿为空,请重新创建"); return;
 }
 char name[15]; printf("请输入名字:");
 gets_s(name);
 while (strcmp(name, head->name) != 0)
 {
  head = head->next;
  if (head == NULL)
  {
   printf("电话簿未有此联系人\n");
   return;
  }
 }
 printf("%s的电话号码为:", name);
 puts(head->number);
 printf("\n工作单位:");
 puts(head->job);
 printf("\nE-mail:");
 puts(head->email);
}
void findbynumber(phone_book* head)
{
 if (head == NULL)
 {
  printf("电话簿为空,请重新创建");
  return;
 }
 char number[20];
 printf("请输入电话号码:");
 gets_s(number);
 while (strcmp(number, head->number) != 0)
 {
  head = head->next;
  if (head == NULL)
  {
   printf("电话簿未有此联系人\n");
   return;
  }
 }
 printf("%s的主人为:", number);
 puts(head->name);
 printf("\n工作单位:");
 puts(head->job);
 printf("\nE-mail:");
 puts(head->email);
}
void find(phone_book* head)
{
 int n;
 printf("    1,通过名字查找\n    2,通过电话号码查找\n    3,退出\n请选择你需要的服务:");
 scanf("%d", &n);
 getchar();
 while (1)
 {
  if (n == 1)
  {
   findbyname(head);
   printf("请选择服务项:");
   scanf("%d", &n);
   getchar();
  }
  if (n == 2)
  {
   findbynumber(head);
   printf("请选择服务项:");
   scanf("%d", &n);
   getchar();
  }
  if (n == 3)
   return;
  else
  {
   printf("输入不正确!");
   printf("请选择服务项:");
   scanf("%d", &n);
   getchar();
  }
 }
}//查找联系人
void add_list(phone_book* head)
{
 phone_book* p1, * p2, * h;
 h = NULL;
 char name[15];
 p1 = (phone_book*)malloc(LEN);
 p2 = p1;
 int n = 0;
 while (1)
 {
  printf("请输入名字(名字为0时停止)"); gets_s(p1->name);
  if (strcmp(p1->name, "0") == 0)break;
  printf("请输入电话号码:"); gets_s(p1->number);
  printf("请输入工作单位:"); gets_s(p1->job);
  printf("请输入E-mail:"); gets_s(p1->email);
  n = n + 1;
  if (n == 1)
   h = p1;
  else
   p2->next = p1;
  p2 = p1;
  p1 = (phone_book*)malloc(LEN);
 }
 p1 = head->next;
 head->next = h;
 p2->next = p1;
}//添加链表函数
phone_book* delete_list(phone_book* head)
{
 char a[20];
 printf("请输入联系人名字或电话:");
 gets_s(a);
 if (head == NULL)
 {
  printf("电话簿为空,请重新创建");  return head;
 }
 phone_book* p = head, * p1;
 p1 = NULL;
 while (strcmp(a, p->name) != 0 && strcmp(a, p->number) != 0)
 {
  p1 = p;
  p = p->next;
  if (p == NULL)
  {
   printf("电话簿未有此联系人\n");
   return head;
  }
 }
 printf("查找到了!");
 printf("\n名字:"); puts(p->name);
 printf("\n电话号码:"); puts(p->number);
 printf("\n工作单位:"); puts(p->job);
 printf("\nE-mail:"); puts(p->email);
 putchar('\n'); char b[10]; printf("是否删除该联系人(Y/N)");
 gets_s(b);
 if (strcmp(b, "y") == 0 || strcmp(b, "Y") == 0)
 {
  if (p == head)
  {
   head = p->next;
   free(p);
  }
  else
  {
   p1->next = p->next; free(p);
  }
  printf("成功删除!");
 }
 else if (strcmp(b, "n") == 0 || strcmp(b, "N") == 0)
  printf("取消删除!");
 else
  printf("输入错误!");
 return head;
}//删除链表函数
void save_list(phone_book* head)
{
 FILE* fp;
 if ((fp = fopen("dianhuabu.dat", "wb")) == NULL)
 {
  printf("File cannot be opened\n");
  exit(0);
 }
 if (head == NULL)
 {
  printf("通讯录为空\n");
  return;
 }
 phone_book* p1 = head;
 while (p1 != NULL)
 {
  if (fwrite(p1, LEN, 1, fp) != 1)
  {
   printf("cannot open file\n");
   return;
  }
  p1 = p1->next;
 }
 printf("保存完毕!\n"); fclose(fp);
}//文件写入函数
phone_book* load_list(phone_book* head)
{
 FILE* fp;
 if ((fp = fopen("dianhuabu.dat", "rb")) == NULL)
 {
  printf("电话簿为空,请重新创建\n");
  exit(0);
 }phone_book* p1, * p2;
 p1 = (phone_book*)malloc(LEN);
 if (fread(p1, LEN, 1, fp) == 0)
 {
  printf("电话簿为空,请重新创建");
  return head;
 }
 head = p1;
 p2 = p1; p1 = (phone_book*)malloc(LEN);
 while (fread(p1, LEN, 1, fp))
 {
  p2->next = p1;
  p2 = p1;
  p1 = (phone_book*)malloc(LEN);
 }
 p2->next = NULL;
 free(p1);
 return(head);
 fclose(fp);
}//文件读取函数
void menu()
{
 printf("           欢迎进入电话簿系统            \n");
 printf("********************************************\n");
 printf("        1、创建电话簿(会将原有电话簿覆盖)\n");
 printf("        2、查找联系人               \n");
 printf("        3、添加联系人               \n");
 printf("        4、删除联系人               \n");
 printf("        5、显示联系人               \n");
 printf("        6、查看电话簿(排序)         \n");
 printf("        7、退出系统                 \n");
 printf("********************************************\n");
}//菜单界面
void main()
{
 system("cls");
 menu();//进入菜单界面
 printf("          请选择你所需要的服务:");
 int n;
 scanf("%d", &n);
 getchar();
 phone_book* head;
 head = NULL;
 while (1)
 {
  system("cls");
  menu();
  switch (n)
  {
  case 1:
  {
   head = creat_list();
   system("cls");
   menu();
   print_list(head);
   save_list(head);
   printf("********************************************\n");
   printf("\n如需要其他服务,请重新输入:");
   scanf("%d", &n);   getchar(); }break;//创建电话簿(创建链表、写入文件,释放链表)
  case 2:
  {
   head = load_list(head);
   find(head);
   printf("********************************************\n");
   printf("\n如需要其他服务,请重新输入:");
   scanf("%d", &n);   getchar(); }break;//查找联系人(读入文件、查找函数、释放链表)
  case 3:
  {
   head = load_list(head);
   add_list(head);
   system("cls");
   menu();
   save_list(head);
   printf("********************************************\n");
   printf("\n如需要其他服务,请重新输入:");
   scanf("%d", &n);   getchar(); }break;//添加联系人(读入文件、添加链表、写入文件、释放链表)
  case 4:
  {
   head = load_list(head);
   head = delete_list(head);
   save_list(head);
   printf("********************************************\n");
   printf("\n如需要其他服务,请重新输入:");
   scanf("%d", &n);
   getchar(); }break;//删除联系人(读入文件,删除链表、写入文件、释放链表)
  case 5:
  {
   head = load_list(head);
   print_list(head);
   save_list(head);
  }
  case 6:
  {
   head = load_list(head);
   sort_list(head);
   printf("********************************************\n");
   printf("\n如需要其他服务,请重新输入:");
   scanf("%d", &n);   getchar(); }break;//查看电话簿(读入文件,排序链表、释放链表)
  case 7:
  {   system("cls");   return; }break;//退出
  default:
  {
   printf("\n输入有误,请重新输入:");
   scanf("%d", &n);
   getchar();
  }break;
  }
 }
}

5结束语

以上就是电话簿管理完全过程,欢迎探讨。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言设计简易电话簿

    本文实例为大家分享了C语言实现电话簿的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdbool.h> #include <string.h> #include <stdlib.h> #include <getch.h> typedef struct Contact{ //定义联系人结构体 char name[20]; //姓名 char sex; //性别 char tel[12]; //电话

  • C语言实现电话簿管理系统

    本文实例为大家分享了C语言电话簿管理系统的具体代码,供大家参考,具体内容如下 /*大二实践周所作, 时间:2017.9,11 电话簿管理系统 */ #include<string.h> #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define NULL 0 typedef struct lianxiren{ char job[30]; char number[20]; char name[

  • C语言实现电话簿项目

    本文实例为大家分享了C语言实现电话簿项目的具体代码,供大家参考,具体内容如下 实现思路 这个程序的整体思路和实现还是很简单的,我们利用了动态分配内存的方式首先创建了电话簿联系人类型,然后创建电话簿类,其实事联系人类型构成的全局数组,然后分别实现,界面函数,增删改查打印等功能,在主函数离实现总体思路,利用while循环让用户选择具体功能调用函数的方式进行总体实现. ------------------------ 2019.3.12更新: 利用文件操作使得系统可以进行数据的保存. 实现代码 #in

  • C语言用函数实现电话簿管理系统

    本文实例为大家分享了C语言用电话簿管理系统的具体代码,供大家参考,具体内容如下 c语言上机课程 纠结了很久用函数还是链表,顺序表 感觉函数比较简单 实现: 最后显示对齐还可以使用"%3d%20s%20s%20s\n"使字节对齐 我用的\t 不够灵活 输入位数不一样的数时就不能对齐了 #include<stdio.h> #include<string.h> typedef struct Contact { char name[21]; char phone[21]

  • C语言实现电话簿项目管理

    本文实例为大家分享了C语言实现电话簿项目管理的具体代码,供大家参考,具体内容如下 1.前言 在C语言的学习,经常有一个需要完成的项目就是电话簿的管理,在刚学习玩C语言基本内容后,面对这么多的项目需求往往无从下手,本文将一步一步完成电话簿的创建.本文提供一种思路,如有更好的实现欢迎讨论. 2.实现功能 本电话簿需要实现的功能有 实现电话簿的初始创建 实现电话簿的后添加 实现电话簿的删除 实现电话簿的查看(按链表的排序) 实现电话簿的查找(名字以及号码) 实现电话簿的排序(名字以及号码) 3.思路解

  • C语言实现电话簿管理系统课程设计

    本文实例为大家分享了C语言课程设计:电话簿管理系统,供大家参考,具体内容如下 文件目录: 初始界面 现在显示一部分代码: //添加联系人 void add() { int i; FILE *fp1;//定义文件指针fp1,使其指向电话簿文本文件 fp1=fopen("电话簿.txt","a+"); printf("请输入要增加的联系人的个数:"); scanf("%d",&n); for(i=num;i<num+

  • C语言实现手机电话簿管理系统

    本文实例为大家分享了C语言实现手机电话簿管理系统的具体代码,供大家参考,具体内容如下 一.任务概述(文章仅供参考) 用c设计出模拟手机通讯录管理系统,实现对手机中的通讯录进行管理 二.设计功能 查看功能:选择此功能时,列出下列三类选择.A办公类,B个人类,C商务类,当选中某类时,显示出此类中的所有数据.增加功能:能录入新数据,一个结点包括:姓名.电话号码.分类(可选项有:A 办公类,B 个人类,C 商务类).电子邮件.拨号功能:能显示出通讯录中所有人的姓名,当选中某个姓名时,屏幕上模拟打字机的效

  • 无线标记语言(WML)基础之WMLScript 基础第1/2页

    WML Script是属于无限应用协议WAP应用层的一部分,使用它可以向WML卡片组和卡片中添加客户端的处理逻辑,目前最新的版本是1.1版.WML Script1.1是在欧洲计算机制造商协议会制定的ECMAScript脚本语言的基础上,经过修改和优化而指定的.它能够更好的支持诸如移动电话类的乍带宽通信设备,在WML编程中使用WML Script可以有效的增强客户端应用的灵活性,而且,我们也可以把WML Script作为一个工具使用,开发出功能强大的WAP网络应用和无限网页.本章我们将详细讲解WM

  • C语言为何不会过时?你需要掌握多少种语言?

    01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"s b!"这个在心理学上有个专业的名字:叫做"二b"现象! 先说一个表,这个就是著名的TIOBE语言排行榜.目前它是一个最权威的一个语言流行度的排行榜,从这个排行榜上看,你会得到一个最直观的结论.Java和C都在下降,而下降的部分被第三名以后的语言所瓜分. 而就在5月,时隔5年,C语言再次领先Java,荣

  • Go语言基础go install命令使用示例详解

    目录 go install 一.使用 二.包名和目录名的关系 三.注意 go install 编译并安装代码包,对于库,会生成目标库文件,并且放置到GOPATH/pgk目录下. 对于可执文件,会生成目标可执行文件,并且放置到GOPATH/bin目录下 一.使用 命令 描述 go install lib 编译安装package lib,会为main包在bin下生成可执行exe文件 go install lib2 lib/util 同时编译安装lib2和lib/util两个package. 二.包名

随机推荐