用C语言写一个通讯录
答案:2 悬赏:50 手机版
解决时间 2021-02-28 10:40
- 提问者网友:泪痣哥哥
- 2021-02-28 04:25
这是要求:1、通讯录管理,包括单通讯链表的建立、通讯者的插入、通讯者的删除、通讯者的查询以及通讯录表的输出等;2、数据必须按照链表的规定进行存储,具体的存储格式自行选定;3、程序要给出用户能够做出选择的界面,比如数据录入、数据查询、该界面还要给出可以查询全部数据的功能。
最佳答案
- 五星知识达人网友:一袍清酒付
- 2021-02-28 05:02
#include
#include
#include
#include
struct record
{
char name[20]; //姓名
char phone[12]; //电话
char adress[50]; //地址
char postcode[8]; //邮政编码
char e_mail[20]; //电子邮件。
}student[100]; //假设最大数为100.
//定义全局变量num,表示已经输入的人数 。
int num; //这里使用数组解决通讯录的问题,实际上使用链表更好。
int menu_select()
{
char s[80];
int a;
system("cls");
printf("\t\t***********欢迎进入通讯管理界面********\n\n");
printf("\t\t\t0. 输入记录\n");
printf("\t\t\t1. 显示记录\n");
printf("\t\t\t2. 按姓名查找\n");
printf("\t\t\t3. 按电话号码查找\n");
printf("\t\t\t4. 插入记录 \n");
printf("\t\t\t5. 按姓名排序\n");
printf("\t\t\t6. 删除记录\n");
printf("\t\t\t7. quit\n");
printf("\t\t***********************************************\n\n");
do{
printf("enter you choice(0~7):");
scanf("%s",s);
a=atoi(s);
}
while (a<0 || a>7);
return a;
}
int adduser()
{
printf("\t\t\t**************** 请输入用户信息 ****************\n");
printf("\t\t\t输入姓名:\n");
scanf("%s",student[num].name);
printf("\t\t\t输入电话号码:\n");
scanf("%s",student[num].phone);
printf("\t\t\t输入地址:\n");
scanf("%s",student[num].adress);
printf("\t\t\t输入邮编:\n");
scanf("%s",student[num].postcode);
printf("\t\t\t输入e-mail:\n");
scanf("%s",student[num].e_mail);
num++;
printf("\t\t\t是否继续添加?(y/n):\n");
if(getch()=='y' || getch()=='y')
adduser();
return(0);
}
void list()
{
int i;
system("cls");
if(num!=0)
{
printf("\t\t\t*************** 以下为通讯录所有信息************\n");
for (i=0;i {
printf("\t\t\t姓名:%s\n",student[i].name);
printf("\t\t\t电话:%s\n",student[i].phone);
printf("\t\t\t地址:%s\n",student[i].adress);
printf("\t\t\t邮编:%s\n",student[i].postcode);
printf("\t\t\te-mail:%s\n",student[i].e_mail);
if(i+1 {
system("pause");
}
}
printf("\t\t\t************************************************\n");
}
else
printf("\t\t\t通讯录中无任何纪录\n");
printf("\t\t\t按任意键返回主菜单:\n");
getch(); //这里是无回显的输入字符,你输入的字符不会显示在屏幕上。
return;
}
int searchbyname()
{
int mark=0;
int i;
printf("\t\t\t***************** 按姓名查找 *******************\n");
char name[20];
printf("\t\t\t请输入姓名:\n");
scanf("%s",name);
for(i=0;i {
if (strcmp(student[i].name,name)==0)
{
printf("\t\t\t************* 以下是您查找的用户信息 ***********\n");
printf("\t\t\t姓名: %s",student[i].name);
printf("\t\t\t电话: %s",student[i].phone);
printf("\t\t\t地址: %s",student[i].adress);
printf("\t\t\te-mail:%s",student[i].e_mail);
printf("\t\t\t************************************************\n");
mark++;
if((i+1) {
printf("\t\t\t是否继续查找相同名字的用户信息:(y/n)\n");
if(getch()=='y' || getch()=='y')
{
全部回答
- 1楼网友:人间朝暮
- 2021-02-28 06:30
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef struct { //通讯录结点类型
char num[5]; //编号
char name[9]; //姓名
char sex[3]; //性别
char phone[13]; //电话
char addr[31]; //地址
} DataType;
typedef struct node { //结点类型定义
DataType data; //结点数据域
struct node *next; //结点指针域
} ListNode;
typedef ListNode *LinkList;
LinkList head;
ListNode *p;
//函数说明
int menu_select();
LinkList CreateList(void);
void InsertNode(LinkList head,ListNode *p);
ListNode *ListFind(LinkList head);
void DelNode(LinkList head);
void printList(LinkList head);
//主函数
void main()
{
for( ; ; ){
switch(menu_select( ) )
{
case 1:
printf("**********************************\n");
printf("* 通 讯 录 链 表 的 建 立 *\n");
printf("**********************************\n");
head=CreateList( );
break;
case 2:
printf("**********************************\n");
printf("* 通 讯 者 信 息 的 添 加 *\n");
printf("**********************************\n");
printf("编号(4) 姓名(8) 性别(3) 电话(11) 地址(31)\n");
printf("************************************* \n");
p=(ListNode *)malloc(sizeof(ListNode)); //申请新结点
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,
p->data.phone,p->data.addr);
InsertNode(head,p);
break;
case 3:
printf("***********************************\n");
printf("* 通 讯 录 信 息 的 查 询 *\n");
printf("***********************************\n");
p=ListFind(head);
if (p!=NULL) {
printf("编号 姓 名 性别 联系电话 地址 \n");
printf("--------------------------------------------------\n");
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,
p->data.sex,p->data.phone,p->data.addr);
printf("---------------------------------------------------\n");
}
else
printf("没有查到要查询的通讯者!\n");
break;
case 4:
printf("***********************************\n");
printf("* 通 讯 录 信 息 的 删 除 *\n");
printf("***********************************\n");
DelNode(head); //删除结点
break;
case 5:
printf("************************************\n");
printf("* 通 讯 录 链 表 的 输 出 *\n");
printf("************************************\n");
printList(head);
break;
case 0:
printf("\t 再 见! \n");
return;
}
}
}
int menu_select( )
{
int sn;
printf(" 通讯录管理系统 \n");
printf("===================\n");
printf(" 1.通讯链表的建立\n");
printf(" 2.通讯者结点的插入\n");
printf(" 3.通讯者结点的查询\n");
printf(" 4.通讯者结点的删除\n");
printf(" 5.通讯录链表的输出\n");
printf(" 0.退出管理系统\n");
printf("==========================\n");
printf(" 请 选 择 0-5: ");
for( ; ; )
{
scanf("%d",&sn);
if (sn<0||sn>5)
printf("\n\t输入错误,重选0-5:");
else
break;
}
return sn;
}
LinkList CreateList(void)
{//尾插法建立带头结点的通讯录链表算法
LinkList head=(ListNode *)malloc(sizeof(ListNode)); //申请头结点
ListNode *p,*rear;
int flag=0; //结束标志置0
rear=head; //尾指针初始指向头结点
while (flag==0)
{ p=(ListNode *)malloc(sizeof(ListNode)); //申新结点
printf("编号(4) 姓名(8) 性别 电话(11) 地址(31)\n");
printf("--------------------------------------------------------------------------------------\n");
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,
p->data.addr);
rear->next=p; //新结点连接到尾结点之后
rear=p; //尾指针指向新结点
printf("结束建表吗?(1/0):");
scanf("%d",&flag);
}
rear->next=NULL; //终端结点指针置空
return head; //返回链表头指针
}
void InsertNode(LinkList head,ListNode *p)
{
ListNode *p1,*p2;
p1=head;
p2=p1->next;
while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0)
{
p1=p2; //p1指向刚访问过的结点
p2=p2->next; //p2指向表的下一个结点
}
p1->next=p; //插入p所指向的结点
p->next=p2; //连接表中剩余的结点
}
ListNode *ListFind(LinkList head)
{// 有序通讯录链表上的查找
ListNode *p;
char num[5];
char name[9];
int xz;
printf("==================\n");
printf(" 1. 按编号查询 \n");
printf(" 2. 按姓名查询 \n");
printf("==================\n");
printf(" 请 选 择: ");
p=head->next; //假定通讯 录表带头结点
scanf("%d",&xz);
if (xz==1) {
printf("请输入要查找者的编号:");
scanf("%s",num);
while (p&&strcmp(p->data.num,num)<0)
p=p->next;
if ((p==NULL)||strcmp(p->data.num,num))0;
p=NULL; //没有查到要查找的通讯者
}
else
if (xz==2) {
printf(" 请输入要查找者的姓名:");
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!=0)
p=p->next;
}
return p;
}
void DelNode(LinkList head)
{
char jx;
ListNode *p,*q;
p=ListFind(head); //调用查找函数
if (p==NULL) {
printf("没有查到要删除的通讯者!\n");
return;
}
printf("真的要删除该结点吗?(y/n):");
scanf("%c",&jx);
if (jx=='y'||jx=='Y') {
q=head;
while ((q!=NULL) &&(q->next!=p))
q=q->next;
q->next=p->next; //删除结点
free(p); //释放被删结点空间
printf("通讯者已被删除!\n");
}
}
void printList(LinkList head)
{
ListNode *p;
p=head->next;
printf("编号 姓 名 性别 联系电话 地址 \n");
printf("--------------------------------------------------------------------------------\n");
while (p!=NULL)
{ printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,
p->data.phone,p->data.addr);
printf("---------------------------------------------------------------------------------\n");
p=p->next; //后移一个结点
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯