C语言用结构体写一个通讯录

今天写了个通讯录,给大家看一下

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern meau();//目录函数就没写出来了,大家可以自己写一下
typedef struct T//定义一个结构体
{
char name[10];
char sex[4];
int age;
char tetl[13];
char add[20];
}T;
int count = 0;//全局变量,用来记录电话个数
void add(T *p)//添加目录
{
int falg = 0;
do
{
printf("请输入姓名:\n");//这里需要注意的是结构体指针的运用,根据scanf函数的特性
scanf("%s", (*(p + count)).name);//输入字符串的时候不用取地址,输入整形的时候需要取地址
printf("请输入性别:\n");
scanf("%s", (*(p + count)).sex);
printf("请输入年龄:\n");
scanf("%d", &((*(p + count)).age));
printf("请输入电话号码:\n");
scanf("%s", (*(p + count)).tetl);
printf("请输入用户地址:\n");
scanf("%s", (*(p + count)).add);
count++;
printf("输入完成!按0退出,按任意键继续输入!\n");
scanf("%d", &falg);
} while (falg);
}
void dele(T*p)            //删除通讯录的函数
{
int i = 0;
int flag = 0;
char goal[10] = {0};
do
{
printf("请输入要删除的用户名:\n");
scanf("%s", goal);
for (i = 0; i < count; i++)
{
if (!strcmp(goal, (*(p + i)).name))
{
while (i <= count)//这里是个讲数组第i个元素以后的元素向前挪动,达到删除i元素的目的得一个/                  //算法
{
*(p + i) = *(p + i + 1);
i++;
}
count--;
flag = 0;
}
else
flag = 1;
}
if (flag)
{
printf("输入用户不存在,按任意键重新输入,按0意键退出:\n");
scanf("%d", &flag);
}
} while (flag);
}
void find(T*p)//查找函数
{
int i = 0;
int flag = 0;
char goal[10] = { 0 };
do
{
printf("请输入要查找的用户名:\n");
scanf("%s", goal);
for (i = 0; i <  count; i++)
{
if (!strcmp(goal, (*(p + i)).name))
{
printf("姓名:%s\n", (*(p + i)).name);
printf("性别:%s\n", (*(p + i)).sex);
printf("年龄:%d\n", (*(p + i)).age);
printf("电话号码:%s\n", (*(p + i)).tetl);
printf("家庭地址:%s\n", (*(p + i)).add);
flag = 0;
}
else
flag = 1;
}
if (flag)
{
printf("输入用户不存在,选择0退出,按任意键继续查找\n");
scanf("%d", &flag);
}
} while (flag);
}
void revise(T*p)//修改函数
{
int i = 0;
int flag = 0;
char goal[10] = { 0 };
do
{
printf("请输入要查找的用户名:\n");
scanf("%s", goal);
for (i = 0; i < count; i++)
{
if (!(strcmp(goal, (*(p + i)).name)))
{
printf("请选择你要修改的内容:\n1.姓名\n2.性别\n3.年龄\n4.电话号码\n5.家庭住址\n");
scanf("%d", &flag);
switch (flag)
{
case 1:
{
  printf("请输入新的姓名:\n");
  scanf("%s", (*(p + i)).name);
  break;
}
case 2:
{
  printf("请输入新的性别:\n");
  scanf("%s", (*(p + i)).sex);
  break;
}
case 3:
{
  printf("请输入新的年龄:\n");
  scanf("%d", &((*(p + i)).age));
  break;
}
case 4:
{
  printf("请输入新的电话号码:\n");
  scanf("%s", (*(p + i)).tetl);
  break;
}
case 5:
{
  printf("请输入新的用户地址:\n");
  scanf("%s", (*(p + i)).add);
  break;
}
default:
{
   printf("指令有误,请重新输入!\n");
   break;
}
}
flag = 0;
}
else
flag = 1;
}
if (flag)
{
printf("输入用户不存在,选择任意键继续,按0键退出:\n");
scanf("%d", &flag);
}
} while (flag);
}
void display(T*p)//打印所有电话簿的函数
{
int i = 0;
if (count)
{
for (i = 0; i < count; i++)
{
printf("姓名:%s\n", (*(p + i)).name);
printf("性别:%s\n", (*(p + i)).sex);
printf("年龄:%d\n", (*(p + i)).age);
printf("电话号码:%s\n", (*(p + i)).tetl);
printf("家庭地址:%s\n", (*(p + i)).add);
}
}
else
{
printf("电话簿内无内容!\n");
}
}
void empty(T*p)//清空函数,这里我没有将数组内容清空,而是将count改为0,使电话薄刷新
{
count = 0;
}
void dobble(T*p)//冒泡排序对姓名排序
{
int i = 0;
int j = 0;
for (i = 0; i < count; i++)
{
for (j = 0; j < count - i - 1; j++)
{
if (strcmp((*(p + j)).name, (*(p + j+1)).name) > 0)
{
*(p + count) = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = *(p + count);
}
}
}
}
int main()
{
T tel[1000];
T*p = tel;
int key = 0;
do
{
meau();
printf("请选择:\n");
scanf("%d", &key);
switch (key)
{
case 1:
{
  add(p);
  break;
}
case 2:
{
  dele(p);
  break;
}
case 3:
{
  find(p);
  break;
}
case 4:
{
  revise(p);
  break;
}
case 5:
{
  display(p);
  break;
}
case 6:
{
  empty(p);
  break;
}
case 7:
{
  dobble(p);
  break;
}
case 0:
{
  return 0;
}
default:
{
   printf("输入错误,请重新输入!\n");
   break;
}
}
} while (key);
system("pause");
return 0;
}

如有不足之处,希望指正

时间: 2024-10-07 19:04:32

C语言用结构体写一个通讯录的相关文章

C语言利用结构体实现一个通讯录

实现一个通讯录: 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 提供以下方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 以名字排序所有联系人 7. 清空所有联系人 student.h: #ifndef __CRT #define _CRT_SECURE_NO_WARNINGS 1 #endif #ifndef __STUDENT #ifndef __STDIO_H

【Go语言】【12】GO语言的结构体

当我第一次接触到C语言时,就对结构体投入了极大的兴趣,认为这个东西以后大有作为,后来接触Java.C++,面向对象编程中的对象进入我的视线,经过了这么多年的磨练,回过头来再看结构体依旧是那么亲切:同时从另一个角度上看结构体与面向对象中的成员对象是多么的相像 :) 一.结构体元素 结构体由关键字.结构体类型名称和具体成员构成,如下: 二.结构体初步认识 下面通过对比数组(复合类型)来了解一下结构体: 1.从存储类型来看 数组只能存储相同的类型: s := []string{"a", &q

柔性数组(结构体最后一个域为0/1数组)

结构体最后的长度为0或1数组的作用(转载) 2012-05-07 17:07:09 其实很 早在看LINUX下就看到这个东西,后来在MFC内存池里同样也看到了类似的东西,还依照MFC写过一个类似的小内存池,(MFC用的是return this + 1)后来在李先静的<系统程序员成长计划>里看到了类似的定义,于是心里想着总结一下,结果发现网上已经有牛人总结的很好了,于是乎就转了过来,谢谢你们 的分享,这是我前进的动力!同时,需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,

【剑仙教程】易语言的结构体。自定义数据类型。

1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言的IDE,IDE,是开发环境. 点击“插入”菜单,选择“数据类型” 这时,代码编辑框就会增加一个数据类型的窗口. 把“数据类型1”命名为“精易_座标”,勾选“公开项”. 这样,一个 精易_座标 的类就做好了. . 再按回车键,给这个类增加2个成员. x 整数型 y 整数型 . 访问时,直接写代码就O

黑 马 程 序 员_视频学习总结&lt;C语言&gt;----05 结构体

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.什么是结构体 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型.为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的. 二.结构体的定义 结构体内部的元素,也就是

关于结构体的一个特殊用法(总觉得遇到的问题就该记录一下哇)

关于结构体的一个特殊用法 //写法一 struct array { int count; char *buf; } //写法二 struct array { int count; char buf[0]; } 如果一个buf用作一个buffer的话,这时候如果malloc一块内存, 用方法一,buf是指针的话,指向这块申请出的内存的话,这里array结构体和buf指向的buffer就是分开的. 而用方法二的时候,申请出的buffer和结构体buffer是连接在一起的. 这么说有点抽象. 非常感谢

C语言的结构体和 C++结构体的区别

 C语言的结构体和 C++结构体的区别 关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的初始化方法> 接着下面两个代码截图(一个是C源码,一个是C++源码)对比你就初步体会到C语言的结构体和C++结构体的区别了:      对于右边的C++结构体的使用类似Java,C++,Swift中的类,类中有构造器方法,然后构造器创建这个类的实例对象. 当然Sw

C语言之结构体

1 概述 结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型. 2 定义结构体类型变量的方法 定义结构体变量的一般格式为: struct 结构名 { 类型  变量名; 类型  变量名: ... }结构变量; 代码如下: struct Student{         char name[8];         int age;     }stu1; 上面的代码声明了一个名为Student的结构体,它包含两个成员name和age,成员name的数据类型为字符数组,成员ag

黑马程序员---C语言基础---结构体

------iOS培训.Java培训.Android培训, iOS学习型技术博客,期待与您交流------ C语言基础---结构体 一.什么是结构体 介绍结构体之前,我想先简单介绍下数组.我想大家对数组都再熟悉不过了,顾名思义,数组就是将一些数据(元素)组合在一起,作为一个整体.使用数组需要注意的是这些元素必须是相同类型.而结构体和数组类似,也是将一些数据组合在一起作为一个整体,但是这些元素可以是不同类型.可以这么理解:结构体是更加灵活的数组,因为它允许元素是不同的类型. 实际生活中,如果我们要