C语言使用结构体实现简单通讯录

 更新时间:2018年02月15日 09:47:57   作者:玩的就是沧桑  
这篇文章主要为大家详细介绍了C语言使用结构体实现简单通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C语言用结构体实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括:

姓名、性别、年龄、电话、住址

提供方法:

1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人

代码实现:

头文件:

#ifndef __HEAD_H__     ////防止头文件被多次调用 
#define __HEAD_H__          
 
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
 
 
#define PEOPLE_MAX 1000 
#define NAME_LENTH 20 
#define SEX_LENTH 5 
#define AGE_LENTH 10 
#define TEL_LENTH 15 
#define ADDR_LENTH 50 //宏定义各个数据所需的大小,后续引用直接可以使用名称,或需修改时只用修改这里就可以了 
 
struct People 
{ 
  char name[NAME_LENTH]; 
  char sex[SEX_LENTH]; 
  int age; 
  char tel[TEL_LENTH ]; 
  char addr[ADDR_LENTH]; 
};     //定义人的信息结构体(包含各种信息) 
 
struct Contact 
{ 
  struct People person[PEOPLE_MAX]; 
  int user_count; 
};   //定义通讯录结构体(包含人的信息的结构体和用户个数) 
 
typedef struct Contact * pContact; 
 
int add_contact(pContact pcon); //pContact是一个结构体指针类型,pcon是一个指向struct Contact的一个指针 
int dele_contact(pContact pcon); //例如:typedef int * int 即 int *p ==> int p 
int find_contact(pContact pcon); 
int modify_contact(pContact pcon); 
int show_contact(pContact pcon); 
int clear_contact(pContact pcon); 
void menu();    //函数的声明 
 
#endif 

各种函数实现:

#include"head.h"     
 
 
int add_contact(pContact pcon) 
{ 
  if(pcon->user_count >= PEOPLE_MAX) 
  { 
    printf("contact is full!\n"); 
    return -1; 
  } 
  else 
  { 
    printf("input name,please!\n"); 
    scanf("%s",pcon->person[pcon->user_count].name); 
    printf("input sex,please!\n"); 
    scanf("%s",pcon->person[pcon->user_count].sex); 
    printf("input age,please!\n"); 
    scanf("%d",&pcon->person[pcon->user_count].age); //这里用%d输出int 
    printf("input tel,please!\n"); 
    scanf("%s",pcon->person[pcon->user_count].tel); 
    printf("input addr,please!\n"); 
    scanf("%s",pcon->person[pcon->user_count].addr); 
    (pcon->user_count)++; 
  } 
  return 0; 
}           //添加信息的实现 
 
 
int dele_contact(pContact pcon) 
{ 
  int ret = find_contact(pcon);  //调用查找函数并保存其值 
  if(ret != -1) 
  { 
    int i = 0; 
    i = ret;  //这里要用另一个变量来保存输入的姓名 
    for(i = 0;i < pcon->user_count-1;i++) 
    { 
      pcon->person[i] = pcon->person[i+1]; //用后一个覆盖前边的,如果要删除的是最后一个不进行此步骤 
       
    } 
    pcon->user_count --; //直接减去最后一个即count-- 
  } 
  return 0;   
} 
 
int find_contact(pContact pcon) 
{ 
  int i = 0; 
  char ret[NAME_LENTH]; //用另一个数组来保存name 
  printf("input name,please!\n"); 
  scanf("%s",ret); 
  while(i <= pcon->user_count) 
  { 
    if(strcmp(ret,pcon->person[i].name)== 0) //比较输入的姓名和通讯录中已有的姓名 
    { 
      printf("name\tsex\tage\ttel\taddr\t\n"); 
      printf("%s\t",pcon->person[i].name); 
      printf("%s\t",pcon->person[i].sex); 
      printf("%d\t",pcon->person[i].age); 
      printf("%s\t",pcon->person[i].tel); 
      printf("%s\t\n",pcon->person[i].addr);   
      return i; 
    } 
    i++; 
  } 
  printf("sorry,the name you find is not exist!\n"); 
  return -1; 
} 
 
int modify_contact(pContact pcon)  //修改函数,首先找到如要修改的姓名,然后重新输入 
{ 
  int ret = find_contact(pcon); 
  if(ret != -1) 
  { 
    printf("input name,please!\n"); 
    scanf("%s",pcon->person[ret].name); 
    printf("input sex,please!\n"); 
    scanf("%s",pcon->person[ret].sex); 
    printf("input age,please!\n"); 
    scanf("%d",&(pcon->person[ret].age)); 
    printf("input tel,please!\n"); 
    scanf("%s",pcon->person[ret].tel); 
    printf("input addr,please!\n"); 
    scanf("%s",pcon->person[ret].addr); 
  } 
  else 
  { 
    printf("sorry,the name you find is not exist!\n"); 
  } 
  return 0; 
} 
 
int show_contact(pContact pcon) 
{ 
  int i = 0; 
  printf("name\tsex\tage\ttel\t\taddr\t\n"); //制表符来制作表头 
  for(i = 0;i < pcon->user_count;i++) 
  { 
    printf("%s\t",pcon->person[i].name); 
    printf("%s\t",pcon->person[i].sex); 
    printf("%d\t",pcon->person[i].age); 
    printf("%s\t",pcon->person[i].tel); 
    printf("%s\t\n",pcon->person[i].addr); 
  } 
  printf("\n"); 
  return 0; 
} 
 
int clear_contact(pContact pcon) 
{ 
  pcon->user_count = 0 ; 
  return 0; 
}      //清除所有人,直接让成员个数变为0即可 
 
void menu() 
{ 
  printf("-------contact---------\n"); 
  printf(" 1.添加联系人信息   \n"); 
  printf(" 2.删除指定联系人信息 \n"); 
  printf(" 3.查找指定联系人信息 \n"); 
  printf(" 4.修改指定联系人信息 \n"); 
  printf(" 5.显示所有联系人信息 \n"); 
  printf(" 6.清空所有联系人   \n"); 
  printf(" 0.谢谢使用      \n"); 
  printf("-------contact---------\n"); 
} 

主函数:

#include"head.h" 
 
int main() 
{   
  int n=1; 
  struct Contact people;   //调用通讯录结构体 
  people.user_count = 0;   //初始化user_count 
  while(n) 
  { 
    menu(); 
    printf("please input\n"); 
    scanf("%d",&n); 
    switch(n) 
    { 
      case 1: 
      { 
        add_contact(&people); 
        break; 
      } 
      case 2: 
      { 
        dele_contact(&people); 
        break; 
      } 
      case 3: 
      { 
        find_contact(&people); 
        break; 
      }   
      case 4: 
      { 
        modify_contact(&people); 
        break; 
      } 
      case 5: 
      { 
        show_contact(&people); 
        break; 
      } 
      case 6: 
      { 
        clear_contact(&people); 
        break; 
      } 
      default: 
      { 
        return 0; 
        break; 
      } //switch case语句分支选择不同函数实现不同作用 
    } 
  } 
  return 0; 
} 

结果实现:

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

相关文章

  • C++二叉树的直径与合并详解

    C++二叉树的直径与合并详解

    这篇文章主要为大家详细介绍了C++实现二叉树基本操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-08-08
  • 解读C++编程的相关文件操作

    解读C++编程的相关文件操作

    这篇文章主要介绍了解读C++编程的相关文件操作,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++实现在文本中找出某个单词的位置信息

    C++实现在文本中找出某个单词的位置信息

    本文给大家分享的是使用C++实现在文本中找出某个单词的位置信息,就是给出此单词所在的行和列,有需要的小伙伴可以参考下。
    2016-02-02
  • C++实现栈与分析栈的知识点

    C++实现栈与分析栈的知识点

    这篇文章主要介绍了C++实现栈与分析栈的知识点,栈(stack)是计算机中常用的一种线性数据结构,经常有资料使用“操作受限”来形容栈,因为它的压入栈和弹出栈操作只能在栈顶进行,下文更多相关资料,需要的小伙伴可以参考一下
    2022-03-03
  • Qt使用随机验证码的实现示例

    Qt使用随机验证码的实现示例

    有时候在登录界面需要验证码功能,这样能够防止被恶意程序攻击,本文主要介绍了Qt使用随机验证码的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C语言编写猜数游戏

    C语言编写猜数游戏

    这篇文章主要为大家详细介绍了C语言编写猜数游戏,可以自定义猜数范围和机会次数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C++实现LeetCode(164.求最大间距)

    C++实现LeetCode(164.求最大间距)

    这篇文章主要介绍了C++实现LeetCode(164.求最大间距),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++实现LeetCode(35.搜索插入位置)

    C++实现LeetCode(35.搜索插入位置)

    这篇文章主要介绍了C++实现LeetCode(35.搜索插入位置),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言数据结构之堆排序详解

    C语言数据结构之堆排序详解

    堆是计算机科学中一类特殊的数据结构的统称,通常是一个可以被看做一棵完全二叉树的数组对象。而堆排序是利用堆这种数据结构所设计的一种排序算法。本文将通过图片详细介绍堆排序,需要的可以参考一下
    2022-03-03
  • c++中拷贝构造函数的参数类型必须是引用

    c++中拷贝构造函数的参数类型必须是引用

    如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数。因此拷贝构造函数的参数必须是一个引用
    2013-07-07

最新评论