建材秒知道
登录
建材号 > 设计 > 正文

用C语言设计一个通讯录系统

傲娇的云朵
激动的玉米
2023-03-05 15:43:39

用C语言设计一个通讯录系统

最佳答案
细心的过客
糟糕的小天鹅
2025-10-05 05:57:40

#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')

{

最新回答
时尚的水蜜桃
哭泣的红酒
2025-10-05 05:57:40

#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 //后移一个结点

}

}

花痴的小猫咪
傻傻的红牛
2025-10-05 05:57:40
关于这道题的基本思路,我可以告诉你:

通讯录一般由如下几个信息组成:姓名、性别、通讯地址、电话号码、邮编等组成。

如果想编写一个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)

}

你可以将该程序输入到电脑中,上机编译、链接、并运行试一试。

复杂的悟空
复杂的美女
2025-10-05 05:57:40

剽窃代码即可。。

已经按照你的要求做了一个,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')

}

发嗲的洋葱
威武的未来
2025-10-05 05:57:40
以前写了一个简单的:

#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)

}