[C代码]通讯录

本文介绍了一个简单的通讯录管理系统,包括添加、显示、查找、删除、更新联系人信息等功能,并提供了保存联系人信息到文件的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*****************test.c****************/
#include <stdio.h>
#include <stdlib.h>
#include "addr.h"
int main()
{
 int flag=1;
 while(flag)
 {
  switch(choose_menu())
  {
  case 1:add_person();break;
  case 2:show_person_info();break;
  case 3:search_person();break;
  case 4:delete_person();break;
  case 5:updata_person();break;
  case 6:save_info();break;
  case 7:quit();break;
  default:break;
  }
 }
}
 
/*****************addr.c****************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "addr.h"
/*****************常量声明****************/
char menu[]=
"+======================================================+/n"
"| 通讯薄管理系统                                |/n"
"+------------------------------------------------------+/n"
"| 1 添加联系人                                  |/n"
"| 2 显示所有联系人                              |/n"
"| 3 查找联系人                                  |/n"
"| 4 删除联系人                                  |/n"
"| 5 更新联系人                                  |/n"
"| 6 保存到文件                                  |/n"
"| 7 退出                                        |/n"
"+======================================================+/n";
/*******************全局变量**********************/
person_list first=NULL;
/*****************主要处理函数声明*****************/
void add_person();         /*添加联系人信息*/
void show_person_info();   /*显示联系人信息*/
void search_person();      /*查找联系人信息*/
void delete_person();      /*删除联系人信息*/
void updata_person();      /*更新联系人信息*/
void save_info();          /*保存到文件*/
void quit();               /*退出*/
/*****************辅助函数声明*****************/
int choose_menu();                      /*打印主菜单界面,并选择*/
person_list get_last(person_list p);   /*取得链表的最后一个值*/
void print_person(info_list p);        /*显示一个联系人的信息*/
void input_person(info_list p);        /*输入一个联系人的具体信息*/
/****************************************************************
*函数功能:添加联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void add_person()
{
 char input = 'N';
 person_list last = NULL;
 person_list new_person = (person_list)malloc(sizeof(person));
 memset(new_person, 0, sizeof(person));  /*将new_person中的前person个长度的初始值设置为0*/
 new_person->next=NULL;
 if(first==NULL)
 {
  first=new_person;
 }
 else
 {
  last=get_last(first);
  last->next=new_person;
 }
 input_person(&(new_person->per));
 printf(">继续输入?(Y 继续, N 返回菜单)");
 getchar();
 input=getchar();
 if(input=='Y'||input=='y')
 {
  add_person();
 }
}
/****************************************************************
*函数功能:显示联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void show_person_info()
{
 int i=0;
 person_list p=first;
 while(p!=NULL)
 {
  i++;
  printf("********第%d个联系人********/n",i);
  print_person(&(p->per));
  p=p->next;  
 }
 if(i==0)
 {
  printf("没有联系人!");
 }
 printf("按任意键返回菜单...");
 getchar();
 getchar();
}
/****************************************************************
*函数功能:查找联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void search_person()
{
 int count=0;
 char input='N';
 char name[MAX_NAME]={0};
 person_list p=first;
 printf(">请输入要查找的联系人姓名(最大%d个字符):",MAX_NAME-1);
 scanf("%s",name);
 while(p!=NULL)
 {
  if(strcmp(p->per.name,name)==0)
  {
   print_person(&(p->per));
   count++;
   break;
  }
  p=p->next;
 }
 if(count==0)
 {
  printf("没有找到姓名为%s的人.",name);
 }
 
 printf("继续查找吗?(Y 继续查找, N 返回菜单)");
 getchar();
 input=getchar();
 if(input=='Y'||input=='y')
 {
  search_person();
 }
}
/****************************************************************
*函数功能:删除联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void delete_person()
{
 int count=0;
 char input='N';
 char name[MAX_NAME]={0};
 person_list p=first;
    person_list p1=NULL;
 printf(">请输入要删除的联系人姓名(最大%d个字符):",MAX_NAME-1);
 scanf("%s",name);
 while(p!=NULL)
 {
  if(strcmp(p->per.name,name)==0)
  {
   print_person(&(p->per));
   count++;
   break;
  }
  p=p->next;
 }
 if(count==0)
 {
  printf("没有找到姓名为%s的人.",name);
 }
 else
 {
  printf("确定要删除姓名为[%d]的联系人吗?(Y 确认, N 取消)",name);
  getchar();
  input=getchar();
  if(input=='Y'||input=='y')
  {
   if(p==first)
    first=p->next;
   else
   {
    p1=first;
    while(p1!=NULL)
    {
     if(p1->next==p)
     {
      p1->next=p->next;
      break;
     }
     p1=p1->next;
    }     
   }
   free(p);
  }
 }
 printf("继续查找吗?(Y 继续查找, N 返回菜单)");
 getchar();
 input=getchar();
 if(input=='Y'||input=='y')
 {
  delete_person();
 } 
}
/****************************************************************
*函数功能:更新联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void updata_person()
{
 int count=0;
 char input='N';
 char name[MAX_NAME]={0};
 person_list p=first;
    person_list p1=NULL;
 printf(">请输入要更新的联系人姓名(最大%d个字符):",MAX_NAME-1);
 scanf("%s",name);
 while(p!=NULL)
 {
  if(strcmp(p->per.name,name)==0)
  {
   print_person(&(p->per));
   count++;
   break;
  }
  p=p->next;
 }
 if(count==0)
 {
  printf("没有找到姓名为%s的人.",name);
 }
 else
 {
  input_person(&(p->per));
 }
 printf("继续更新其它联系人吗?(Y 继续更新, N 返回菜单)");
 getchar();
 input=getchar();
 if(input=='Y'||input=='y')
 {
  updata_person();
 }
}
/****************************************************************
*函数功能:保存联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void save_info()
{
 FILE *fp;
 char file[100];
 person_list p=first;
 printf("请输入文件名:");
 scanf("%s",file);
 fp=fopen(file,"w");
 while(p!=NULL)
 {
  fprintf(fp,"%s,%s,%s,%s,%s,%s,%s,%s/n",p->per.name,p->per.sex,p->per.birthday,
   p->per.tel,p->per.mobile,p->per.fax,p->per.address,p->per.postal_code);
  p=p->next;
 }
 fclose(fp);
 printf("保存成功!/n按任意键返回菜单../n");
 getchar();
 getchar();
}
/****************************************************************
*函数功能:退出系统函数
*入口参数:无
*出口参数:无
****************************************************************/
void quit()
{
 person_list pdel=first;
 person_list p=NULL;
 if(pdel==NULL)
 {
  exit(0);
 }
 /*如果pdel的next指针不为空,表示有下一条数据*/
 /*先将p指向pdel,释放掉pdel,再将p重复给pdel*/
 while(pdel->next!=NULL)
 {
  p=pdel->next;
  free(pdel);
  pdel=p;
 }
 free(pdel);/*如果pdel的next指针为空,表示没有下一条数据,直接删除该节点*/
 exit(0);
}
/****************************************************************
*函数功能:显示方菜单界面,并提供选择
*入口参数:无
*出口参数:无
****************************************************************/
int choose_menu()
{
 int;
 system("cls");
 printf(menu);
 printf(">请选择[1~7]:");
 scanf("%d",&selected);
 if(selected<1||selected>7)
 {
  printf("错误的选择!(请输入1~7).按任意键继续...");
  getchar();
  getchar();
 }
 return selected;
}
/****************************************************************
*函数功能:输入联系人相关信息
*入口参数:指向info的指针p
*出口参数:无
****************************************************************/
void input_person(info_list p)
{  
 system("cls");
 printf(">请输入联系人信息:/n");
 printf(">请输入姓名(最大长度%d个字符):",MAX_NAME-1);
 scanf("%s",p->name);
 printf(">请输入性别(最大长度%d个字符):",MAX_SEX-1);
 scanf("%s",p->sex);
 printf(">请输入出生日期(最大长度%d个字符):",MAX_BIRTHDAY-1);
 scanf("%s",p->birthday);
 printf(">请输入电话(最大长度%d个字符):",MAX_TEL-1);
 scanf("%s",p->tel);
 printf(">请输入手机(最大长度%d个字符):",MAX_MOBILE-1);
 scanf("%s",p->mobile);
 printf(">请输入传真(最大长度%d个字符):",MAX_FAX-1);
 scanf("%s",p->fax);
 printf(">请输入地址(最大长度%d个字符):",MAX_ADDRESS-1); 
 scanf("%s",p->address);
 printf(">请输入邮编(最大长度%d个字符):",MAX_POSTAL_CODE-1);
 scanf("%s",p->postal_code);
}
/****************************************************************
*函数功能:显示一个联系人的相关信息
*入口参数:指向info的指针p
*出口参数:无
****************************************************************/
void print_person(info_list p)
{
 system("cls");
 printf("姓名: %s/t 性别: %s/t 生日: %s/n",p->name,p->sex,p->birthday);
 printf("电话: %s/n",p->tel);
 printf("手机: %s/n",p->mobile);
 printf("传真: %s/n",p->fax);
 printf("地址: %s/n",p->address);
 printf("邮编: %s/n",p->postal_code);
 printf("/n");
}
/****************************************************************
*函数功能:取得链表的最后一个值
*入口参数:指向info的指针p
*出口参数:指向最后一个节点的指针
****************************************************************/
person_list get_last(person_list from)
{
 person_list p=from;
 while(p->next!=NULL)
 {
  p=p->next;
 }
 return p;
}
 
/*****************addr.h****************/
#ifndef _addr_h_
#define _addr_h_
/*****************宏定义*****************/
#define MAX_NAME        11
#define MAX_SEX         3
#define MAX_BIRTHDAY    9
#define MAX_TEL         21
#define MAX_MOBILE      21
#define MAX_FAX         21
#define MAX_ADDRESS     101
#define MAX_POSTAL_CODE 7
/*****************数据类型定义****************/
typedef struct _info
{
 char name[MAX_NAME];          /*姓名*/
 char sex[MAX_SEX];            /*性别*/
 char birthday[MAX_BIRTHDAY];  /*出生日期*/
 char tel[MAX_TEL]; 
 char mobile[MAX_MOBILE]; /*手机*/
 char fax[MAX_FAX];        /*传真*/
 char address[MAX_ADDRESS];/*地址*/
 char postal_code[MAX_POSTAL_CODE];/*邮编*/
}info,*info_list;
typedef struct _person
{
 info per;
 struct _person *next;
}person,*person_list;
/*****************主要处理函数声明*****************/
extern void add_person();         /*添加联系人信息*/
extern void show_person_info();   /*显示联系人信息*/
extern void search_person();      /*查找联系人信息*/
extern void delete_person();      /*删除联系人信息*/
extern void updata_person();      /*更新联系人信息*/
extern void save_info();          /*保存到文件*/
extern void quit();               /*退出*/
/*****************辅助函数声明*****************/
extern int choose_menu();                      /*打印主菜单界面,并选择*/
extern person_list get_last(person_list p);   /*取得链表的最后一个值*/
extern void print_person(info_list p);        /*显示一个联系人的信息*/
extern void input_person(info_list p);        /*输入一个联系人的具体信息*/
#endif
数据结构课程设计 include "stdio.h" #include "ctype.h" #include "string.h" #include"stdlib.h" #include "malloc.h" struct list { char name[10]; char street[10]; char city[10]; char state[10]; char eip[10]; struct list *prior; struct list *next; }; void mainmenu(struct list * head); void read_file(struct list * head); void read_file(); void px_menu(struct list * head); void px_name(struct list * head); void px_street(struct list * head); void px_city(struct list * head); void px_state(struct list * head); void px_eip(struct list * head); void delete_menu(struct list * head); void delete_name(struct list * head); void search_menu(struct list * head); void search_name(struct list * head); void search_street(struct list * head); void search_city(struct list * head); void search_state(struct list * head); void search_eip(struct list * head); void add_new(struct list * head); void prin_list(struct list * head); void write_file(struct list * head); int flag=0; int flag1=0;//删除为空标志位 void main() { struct list *head; read_file(); mainmenu(head); return; } /**************************************************** 主菜单 ****************************************************/ void mainmenu(struct list * head) { char tmp; system("cls"); printf("输入要进行的操作:\n"); printf("\t '1'-----------------------添加记录\n"); printf("\t '2'-----------------------排序记录\n"); printf("\t '3'-----------------------显示记录\n"); printf("\t '4'-----------------------查找记录\n"); printf("\t '5'-----------------------删除记录\n"); printf("\t '6'---------------------------退出\n"); printf("\t '0'---------------------保存并退出\n"); printf("\n\t请选择:"); tmp=getchar(); switch(tmp) { case '1':add_new(head);break; case '2':px_menu(head);break; case '3':prin_list(head);break; case '4':search_menu(head);break; case '5':delete_menu(head);break; case '6':exit(0);break; case '0':write_file(head);break; default :{printf("错误操作返回主菜单");mainmenu(head);} } } /**************************************** 双链表建立以及文件读取 ****************************************/ //void read_file(struct list * head) void read_file() { int i; struct list *p1,*p2; struct list *head; FILE *fp; fp=fopen("list.txt","a"); fclose(fp); if ((fp = fopen ( "list.txt" , "rt" ) ) == NULL ) { printf("打开文件失败\n"); exit(0) ; } rewind(fp);//将文件指针重新指向流的开头 fseek(fp,0,2);//重定位流上的文件指针 if ((ftell(fp)==0))//返回当前文件指针 { printf("没有记录:\n"); head=p1=p2=(struct list *)malloc(sizeof(struct list)); head->name[10]='\0'; head->street[10]='\0'; head->city[10]='\0'; head->state[10]='\0'; head->eip[10]='\0'; head->next=head; head->prior=head; flag=1; } else { rewind(fp); head=p1=p2=(struct list *)malloc(sizeof(struct list)); head->next=head; head->prior=head; if(fread(p1,sizeof(struct list),1,fp)!=1)//从流中读数据 { p2->next=p1; p1->next=head; head->prior=p1; p1->prior=p2; p2=p1; } else { for (i=0;;i++) { p2->next=p1; p1->next=head; head->prior=p1; p1->prior=p2; p2=p1; if (feof ( fp ))//检测流上的文件结束符用 { p1->next=head; head->prior=p1; printf("记录读入完成\n"); break; } else { p1=(struct list *)malloc(sizeof(struct list)); p1->name[10]='\0'; p1->street[10]='\0'; p1->city[10]='\0'; p1->state[10]='\0'; p1->eip[10]='\0'; if(fread(p1,sizeof(struct list),1,fp)!=1) { break; } } } } } printf("记录读入完成\n"); fclose ( fp ) ; printf("按任意键进入主菜单\n"); getchar(); mainmenu(head); return; } /**************************************** 增添 ****************************************/ void add_new(struct list * head) { int k=0; int n; char tmp1,tmp2; struct list *p; struct list *p1,*p2; p1=(struct list *)malloc(sizeof(struct list)); p1->name[10]='\0'; p1->street[10]='\0'; p1->city[10]='\0'; p1->state[10]='\0'; p1->eip[10]='\0'; printf("请输入所要添加的名字:\n"); scanf("%s",p1->name); printf("请输入所要添加的街道:\n");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值