用C语言设计一个通讯录系统
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
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=0i<numi++)
{
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<num)
{
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=0i<numi++)
{
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)<num)
{
printf("\t\t\t是否继续查找相同名字的用户信息:(y/n)\n")
if(getch()=='y' || getch()=='Y')
{
#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 //后移一个结点
}
}
通讯录一般由如下几个信息组成:姓名、性别、通讯地址、电话号码、邮编等组成。
如果想编写一个20个人的通讯录程序,那么就可以定义一个大小为 20 的结构数组。C 语言详细代码如下:
#include <stdio.h>
#define ADDRESS_LEN 100
#define PHONENUM_LEN 20
#define NUMBER 20
struct address
{
char name[20]
char sex[5]
char address[ADDRESS_LEN]
char telepone_num[PHONENUM_LEN]
char zip[10 ]
}
void main( )
{
int i = 0
struct address my_address[NUMBER] ;
for( i = 0 i <NUMBER i ++ )
{
gets(my_address[i].name)
gets(my_address[i].sex)
gets(my_address[i].address)
gets(my_address[i].telephone_num)
gets(my_address[i].zip)
}
for( i = 0 i <NUMBER i ++ )
printf("%s\t%s\t%s\t%s\t%s\n", my_address[i].name,my_address[i].sex,my_address[i].address,my_address[i].telephone_num,my_address[i].zip)
}
你可以将该程序输入到电脑中,上机编译、链接、并运行试一试。
剽窃代码即可。。
已经按照你的要求做了一个,VC6上运行确认了:
#include <stdio.h>#include <stdlib.h>
#include <string.h>
typedef struct PersonalInfo
{
char name[50]
char address[30]
char telno[30]
char postcode[30]
struct PersonalInfo *next
}INFO
INFO *head
void Initiate()
void Menu()
void Create()//的功能是:创建新的通讯录。
void Add()// 在通讯录的末尾,写入新的信息,并返回选单
void Find()//查找记录
void Alter()//修改记录如果未找到要修改的人,则提示通讯录中没有此人的信息,并返回选单。
void Delete()//删除某人的信息,如果未找到要删的人,提示通讯录中没有此人的信息,并返回选单。
void List()//的功能是:显示通讯录中的所有记录。
//初始化
void Initiate()
{
if((head=(INFO *)malloc(sizeof(INFO)))==NULL) exit(1)
head->next=NULL
}
//显示菜单
void Menu()
{
printf("**************欢迎使用通讯录系统**************")
printf("\n")
printf("\n")
printf(" 1.创建通讯录。\n")
printf(" 2.插入信息。\n")
printf(" 3.查询记录\n")
printf(" 4.修改记录\n")
printf(" 5.删除记录!\n")
printf(" 6.显示所有记录\n")
printf(" 0.退出通讯录\n")
printf(" 请输入0~6 \n")
}
//创建通讯录
void Create()
{
INFO *p1[100],*p2
int m,i
printf("请输入创建个数:")
scanf("%d",&m)
for(i=1i<=mi++)
{
p1[i]=(INFO *)malloc(sizeof(INFO))
printf("请输入第%d条信息!\n",i)
printf("姓名:\n")
scanf("%s",&p1[i]->name)
printf("地址:\n")
scanf("%s",&p1[i]->address)
printf("电话:\n")
scanf("%s",&p1[i]->telno)
printf("邮编:\n")
scanf("%s",&p1[i]->postcode)
p1[i]->next=NULL
if(head->next==NULL)
head->next=p1[i]
else
{
for(p2=headp2->next!=NULLp2=p2->next) //找到结点尾
p2->next=p1[i]
}
}
printf("信息已添加!\n")
return //保存到链表
}
//添加通讯录信息
void Add()
{
INFO *p,*q
if((q=(INFO *)malloc(sizeof(INFO)))==NULL) exit(1)
printf("请输入要添加的信息!\n")
printf("姓名:\n") //添加信息
scanf("%s",&q->name)
printf("性别:\n")
scanf("%s",q->address)
printf("电话:\n")
scanf("%s",q->telno)
printf("城市:\n")
scanf("%s",q->postcode)
for(p=headp->next!=NULLp=p->next)
p->next=q
q->next=NULL
printf("此信息已添加!")
return
}
//查找通讯录信息
void Find()
{
INFO *p
char name[50]
if(head->next==NULL)
{
printf("此通讯录为空!\n")
return
}
printf("请输入要查找的姓名:\n")
scanf("%s",&name)
for(p=head->nextp!=NULLp=p->next)
{
if(strcmp(p->name,name)==0)
{
printf("姓名\t地址\t邮编\t电话\n")
printf("%s\t%s\t%s\t%s\n",p->name,p->address,p->postcode,p->telno)
}
else if(p->next==NULL)
printf("无此信息!\n")
}
}
//修改通讯录信息
void Alter()
{
char name[50] //先查找 后删除
INFO *p, *p1
if (head->next == NULL)
{
printf("此通讯录为空!\n")
return
}
printf("请输入要修改的姓名:\n")
scanf("%s",name)
for(p=head->nextp!=NULLp=p->next)
{
if(strcmp(p->name,name)==0)
break
else if(p->next==NULL)
{
printf("无此信息!\n")
return
}
}
p1=(INFO *)malloc(sizeof(INFO))
printf("姓名:\n") //添加信息
scanf("%s",p1->name)
strcpy(p->name,p1->name)
printf("性别:\n")
scanf("%s",p1->address)
strcpy(p->address,p1->address)
printf("电话:\n")
scanf("%s",p1->telno)
strcpy(p->telno,p1->telno)
printf("城市:\n")
scanf("%s",p1->postcode)
strcpy(p->postcode,p1->postcode)
printf("此信息已修改!\n")
//显示修改的信息
printf("姓名\t地址\t邮编\t电话\n")
printf("%s\t%s\t%s\t%s\n",p->name,p->address,p->postcode,p->telno)
free(p1)
}
//删除通讯录信息
void Delete()
{
char name[50] //先查找 后删除
INFO *p = head->next, *p1 =head->next,*p2
if (head->next == NULL)
{
printf("此通讯录为空!\n")
return
}
printf("请输入要删除的姓名:\n")
scanf(" %s",name)
while ((strcmp(p->name,name)!=0 )&& p->next != NULL)
{
p1=p
p =p->next
}
if (strcmp(name, p->name)==0) //输出删除信息
{
if (p == head->next&&p->next!=NULL)
head->next = p->next
else if(p==head->next&&p->next==NULL)
{
head->next=p->next
printf("信息已删除,先此通讯录为空!!\n")
return
}
else
p1->next = p->next
}
else
{
printf("此信息不存在!!!\n")
return
}
printf("此信息已删除!")
printf("姓名\t地址\t邮编\t电话\n")
for(p2=head->nextp2!=NULLp2=p2->next)
printf("%s\t%s\t%s\t%s\n",p2->name,p2->address,p2->postcode,p2->telno)
}
//显示所有记录
void List()
{
INFO *p
if(head->next==NULL)
{
printf("此通讯录中无记录!\n")
return
}
printf("姓名\t地址\t邮编\t电话\n")
for(p=head->nextp!=NULLp=p->next)
printf("%s\t%s\t%s\t%s\n",p->name,p->address,p->postcode,p->telno)
}
void main()
{
int choice
char yes_no
system("color a")
Initiate()
do
{
Menu()
printf("请选择0-6的数字\n")
scanf("%d",&choice)
printf("\n")
switch(choice)
{
case 1:Create()
break
case 2:Add()
break
case 3:Find()
break
case 4:Alter()
break
case 5:Delete()
break
case 6:List()
break
case 0:
printf("************感谢您的使用************\n")
exit(0)
break
default:
printf("输入有误!请重新输入\n")
break
}
printf("是否继续 Y or N? \n")
do
{
scanf("%c",&yes_no)
}while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n')
}while(yes_no=='Y'||yes_no=='y')
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std
#define maxlen 15
struct persons
{int num
char name[20]
char e_addr[20]
char tel_no[15]
char sim_no
char arch
}persons[maxlen]
typedef struct lnode
{
int num
char name[20]
char e_addr[20]
char tel_no[15]
char sim_no
char arch
struct lnode *next
}listnode,*linklist
linklist head=NULL,r=NULL
listnode *s,*p0,*p1,*p2,*p3,*p4,*p5,*p6,*p7,*p8,*p9
int i
char name1[10],ch
char tel_no1[15]
char arch1
char sim_no1
char e_addr1[20]
char s1[20]
FILE *fp
void creat()
{ int j
long k
fp=fopen("数据文件.txt","r t")
if(fp!=NULL)
{for(i=0i<=maxleni++ )
{ j=fgetc(fp)
if(j==EOF)
return
k=i
fseek(fp,k*sizeof(struct persons),0)
fread(&persons[i],sizeof(struct persons),1,fp)
s=(linklist)malloc(sizeof(listnode))
s->num=persons[i].num
strcpy(s->name,persons[i].name)
strcpy(s->e_addr,persons[i].e_addr)
strcpy(s->tel_no,persons[i].tel_no)
s->sim_no=persons[i].sim_no
s->arch=persons[i].arch
if(head==NULL)
{head=sr=headhead->next=NULL}
else
{r->next=s
r=sr->next=NULL
}
}fclose(fp)
}
else
{ fp=fopen("数据文件.txt","w")
i=1
}
}
void Show()
{printf("成功调用该函数\n")}
void Delete()
{printf("成功调用该函数\n")}
void Input()
{ s=(linklist)malloc(sizeof(listnode))
printf("\n\n\t请输入该用户的信息:")
printf("姓名:")
scanf("%s",&s->name)
printf("电话号码:")
scanf("%s",&s->tel_no)
printf("单键拨号:")
scanf("%s",&s->sim_no)
printf("E-mail地址:")
scanf("%s",&s->e_addr)
printf("类别:")
scanf("%s",&s->arch)
if(head==NULL)printf("\n\n")
else
{p8=head
while(p8!=NULL&&strcmp(s->name,p8->name)!=0&&strcmp(s->tel_no,p8->tel_no)!=0)
p8=p8->next
if(p8!=NULL)
{printf("您添加的用户已存在!")
free(s)}}
if(head==NULL)
{
s->next = 0
head=s
r = s
}
else
{
s->next = 0
r->next = s
r = s
}
}
void Alter()
{ printf("success!\n")}
int main()
{
system("color a")
creat()
do
{
printf("\n\n\t\t请选择操作:")
printf("\n\t\t1.显示通讯录")
printf("\n\t\t2.删除通讯录")
printf("\n\t\t3.添加通讯录")
printf("\n\t\t4.编辑通讯录")
printf("\n\n\n")
printf("\t请选择:")
cin>>ch
switch(ch)
{ case '1': Show()
break
case '2': Delete()
break
case '3': Input()
break
case '4': Alter()
break
fclose(fp)
exit(0)
break
default:
printf("\n\t The num should 1-6!!! \n")
break
}
}
while(1)
}