黑客X档案官方论坛's Archiver

lifuxing1225 发表于 2008-6-28 20:30

[提问] [求助]帮我用C语言编个通讯录的程序

[求助]帮我用C语言编个通讯录的程序
  问题描述:
通过该系统实现对有N个同学的通信信息进行录入、显示、修改、删除等操作的管理。
2、功能要求:
1)本系统采用一个包含N个数据的结构体数组,每个数据的结构应当包括:姓名、性别、单位、手机号、e-mail。
2)本系统显示这样的菜单:
请选择系统功能项:
e. 基本信息录入
f. 基本信息显示
g. 修改信息
h. 基本信息删除
i. 基本信息查询
(1) 按姓名(2) 查询
(3) 按单位查询
g. 退出系统
3)执行一个具体的功能之后,程序将重新显示菜单。
3、算法提示:
数据结构:结构体类型数组
数据库结构:该系统的基本数据库如下:

姓名 性别 单位 手机号 e-mail   
Char char  char Char char  
4、测试数据:
学生人数N=10

lovehui 发表于 2008-6-28 22:43

好像蛮多学校课程设计都是这个啊~~~
我上个学期写的,LZ修改一下就可以了~~~

lovehui 发表于 2008-6-28 22:44

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define LEN sizeof(struct linker)


typedef struct linker
{    char name[9];
     char fnum[21];
     char dnum[21];
     char mnum[12];
     char xnum[11];
     struct linker *next;
}link;

main()
{    FILE *fp;
     void welcome();   //欢迎界面
     void menu();   //菜单界面
     link *creat();   //创建一个链表
     link *print(link *);   //输出全部记录
     link *insert(link *);   //添加一条新记录
     link *change(link *);   //改变记录中的信息
     void search(link *);   //查找记录,支持模糊查找
     link *delet(link *);   //删除一条记录
     void saves(link *);   //将记录保存到文件中
     char identify;
     char fullname[10];
     link *head,*p,*p1,*p2,*p3;
     int choose;
     char absorb;
     int i;
     head=NULL;
     welcome();
     do   //确定输入是否为y或Y或n或N
        {   
            scanf("%c",&identify);
            scanf("%c",&absorb);
            if(identify=='y'||identify=='Y')
                system("cls");
            else
            if(identify=='n'||identify=='N')
                exit(0);
            else
                printf("                                请输入(Y/N):");
        }while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N');
   
       while(1)
{        
         menu();
         scanf("%d",&choose);
         scanf("%c",&absorb);

         switch(choose)
        {       case 1:  head=creat();   //创建链表,并将链表中的信息输入到文件中
                         saves(head);
                         system("cls");
                         break;
               
               case 2:   i=0;
                        
                         if((fp=fopen("tongxunlu","a+"))==NULL)
                        {      printf("       无法打开文件~~~\n");
                               exit(0);
                        }   //打开文件,并将文件中内容复制到链表中,若文件中无记录,则链表头指针为空
                         if(!feof(fp))
                        {     i++;
                              p2=p1;
                              p1=p2=(link *)malloc(LEN);
                              fread(p1,LEN,1,fp);
                              head=p1;     
                        }
                         while(!feof(fp))
                        {     i++;
                              p2=p1;
                              p1=(link *)malloc(LEN);
                              fread(p1,LEN,1,fp);
                              p2->next=p1;
                        }
                         if(i==1)
                              head=NULL;
                         p2->next=NULL;
                         fclose(fp);
                        
                         search(head);
                         system("cls");
                         break;
               
                case 3:  i=0;
                        
                         if((fp=fopen("tongxunlu","a+"))==NULL)
                        {      printf("       无法打开文件~~~\n");
                               exit(0);
                        }
                         if(!feof(fp))
                        {     i++;
                              p2=p1;
                              p1=p2=(link *)malloc(LEN);
                              fread(p1,LEN,1,fp);
                              head=p1;     
                        }
                         while(!feof(fp))
                        {     i++;
                              p2=p1;
                              p1=(link *)malloc(LEN);
                              fread(p1,LEN,1,fp);
                              p2->next=p1;
                        }
                         if(i==1)
                              head=NULL;
                         p2->next=NULL;   
                         fclose(fp);
                        
                         if(head==NULL)
                        {
                            printf("\n");
                            printf("                           通讯录中无记录,请返回~~~");
                        }
                         else
                            change(head);
                            saves(head);
                            system("cls");
                         break;
               
                case 4:  i=0;
                        
                         if((fp=fopen("tongxunlu","a+"))==NULL)
                        {      printf("       无法打开文件~~~\n");
                               exit(0);
                        }
                         if(!feof(fp))
                        {     i++;
                              p2=p1;
                              p1=p2=(link *)malloc(LEN);
                              fread(p1,LEN,1,fp);
                              head=p1;     
                        }
                         while(!feof(fp))
                        {     i++;
                              p2=p1;
                              p1=(link *)malloc(LEN);
                              fread(p1,LEN,1,fp);
                              p2->next=p1;
                        }
                         if(i==1)
                              head=NULL;
                         p2->next=NULL;
                         fclose(fp);
                        
                         if(head==NULL)
                        {     printf("\n");
                              printf("                           通讯录中无记录,请创建~~~");   
                        }
                         else
                        {     head=insert(head);
                              saves(head);
                        }
                         system("cls");
                         break;
               
                case 5:  i=0;
                        
                         if((fp=fopen("tongxunlu","a+"))==NULL)
                        {      printf("       无法打开文件~~~\n");
                               exit(0);
                        }
                         if(!feof(fp))
                        {     i++;
                              p2=p1;
                              p1=p2=(link *)malloc(LEN);
                              fread(p1,LEN,1,fp);
                              head=p1;     
                        }
                         while(!feof(fp))
                        {     i++;
                              p2=p1;
                              p1=(link *)malloc(LEN);
                              fread(p1,LEN,1,fp);
                              p2->next=p1;
                        }
                         if(i==1)
                              head=NULL;
                         p2->next=NULL;
                         fclose(fp);
                        
                         if(head==NULL)
                           {
                            printf("\n");
                            printf("                           通讯录中无记录,请返回~~~");
                           }
                         else
                            head=delet(head);
                            saves(head);
                            system("cls");
                         break;
              
                case 6:  i=0;
                        
                         if((fp=fopen("tongxunlu","a+"))==NULL)
                        {      printf("       无法打开文件~~~\n");
                               exit(0);
                        }
                         if(!feof(fp))
                        {     i++;
                              p2=p1;
                              p1=p2=(link *)malloc(LEN);
                              fread(p1,LEN,1,fp);
                              head=p1;     
                        }
                         while(!feof(fp))
                        {     i++;
                              p2=p1;
                              p1=(link *)malloc(LEN);
                              fread(p1,LEN,1,fp);
                              p2->next=p1;
                        }
                         if(i==1)
                              head=NULL;
                         p2->next=NULL;
                         fclose(fp);
                        
                         if(head==NULL)
                           {
                            printf("\n");
                            printf("                           通讯录中无记录,请返回~~~");
                           }
                         else
                        {    print(head);
                             printf("\n");
                             printf("                               按任意键返回~~~");
                        }
                         getch();
                         system("cls");  
                         break;
               
                case 7:  printf("\n");
                         printf("                             确认要退出吗?(Y/N):");
                         do
                       {   
                            scanf("%c",&identify);
                            scanf("%c",&absorb);
                            if(identify=='y'||identify=='Y')
                           {     p=p3=head;//释放链表占用的内存  
                                 while(p!=NULL)   
                               {    p3=p3->next;
                                    p=p3;
                                    free(p3);        
                               }   
                                 exit(0);
                           }     
                            else
                            if(identify=='n'||identify=='N')
                                system("cls");
                            else
                                 printf("                                请输入(Y/N):");
                        } while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N');
                          break;
                        
                default:  printf("\n");
                          printf("\n");
                          printf("                请输入正确数字(1-7)!");
        }
}                  
      system("pause");
}

void welcome()
{     printf("\n");
      printf("\n");
      printf("\n");
      printf("\n");
      printf("                 * * * * * * * * * * * * * * * * * * * * * * *\n");
      printf("                 *                              制作人:lovehui  *\n");
      printf("                 *                                           *\n");
      printf("                 *                                           *\n");
      printf("                 *                                           *\n");
      printf("                 *              欢迎使用:通讯录              *\n");
      printf("                 *                                           *\n");
      printf("                 *                                           *\n");
      printf("                 *                                           *\n");
      printf("                 *                                           *\n");
      printf("                 * * * * * * * * * * * * * * * * * * * * * * *\n");
      printf("                 请按提示操作:\n");
      printf("                                是否进入(Y/N):");      
}

void menu()
{      printf("\n");
       printf("\n");
       printf("\n");
       printf("\n");
       printf("                ☆ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ☆\n");
       printf("                ☆                                           ☆\n");
       printf("                ☆                                           ☆\n");
       printf("                ☆                [1]  新建:                 ☆\n");
       printf("                ☆                [2]  查询:                 ☆\n");
       printf("                ☆                [3]  修改:                 ☆\n");
       printf("                ☆                [4]  添加:                 ☆\n");
       printf("                ☆                [5]  删除:                 ☆\n");
       printf("                ☆                [6]  显示:                 ☆\n");
       printf("                ☆                [7]  退出:                 ☆\n");
       printf("                ☆                                           ☆\n");
       printf("                ☆                                           ☆\n");
       printf("                ☆ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ☆\n");
       printf("                               请输入数字(1-6):");
}

link *creat()
{      link *head;
       link *p1,*p2;
       char identify,absorb;
       p1=p2=(link *)malloc(LEN);
       head=p1;
       printf("\n");
       printf("\n");
       printf("\n");
       printf("\n");
       printf("                               姓名:");
       gets(p1->name);
       printf("                               家庭电话号码:");
       gets(p1->fnum);
       printf("                               单位电话号码:");
       gets(p1->dnum);
       printf("                               手机号码:");
       gets(p1->mnum);
       printf("                               小灵通号码:");
       gets(p1->xnum);
       printf("\n");
       printf("\n");
       printf("                        内容已保存,是否继续?(Y/N):");
       scanf("%c",&identify);
       scanf("%c",&absorb);
       while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N')
      {       printf("                                请输入(Y/N):");
              scanf("%c",&identify);
              scanf("%c",&absorb);
      }                                                                  
       while(identify=='y'||identify=='Y')
      {      
                p2->next=p1;
                p2=p1;
                p1=(link*)malloc(LEN);
                printf("\n");
                printf("\n");
                printf("\n");
                printf("\n");
                printf("                                姓名:");
                gets(p1->name);
                printf("                                家庭电话号码:");
                gets(p1->fnum);
                printf("                                单位电话号码:");
                gets(p1->dnum);
                printf("                                手机号码:");
                gets(p1->mnum);
                printf("                                小灵通号码:");
                gets(p1->xnum);
                printf("\n");
                printf("\n");
                printf("                        内容已保存,是否继续?(Y/N):");
                scanf("%c",&identify);
                scanf("%c",&absorb);
                while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N')
               {       printf("                                请输入(Y/N):");
                       scanf("%c",&identify);
                       scanf("%c",&absorb);
               }                                                                    
        }
         p2->next=p1;
         p2=p1;
         p2->next=NULL;
         return (head);
}

link *print(link *head)
{       link *p1,*p2,*p3;
        link *p4;
        char _name[9];
        char _fnum[21];
        char _dnum[21];
        char _mnum[12];
        char _xnum[21];
        p1=head;
        p2=head;
        int n=0;
      
        while(p2!=NULL)   //将链表中记录按姓名顺序排列
       {      p1=p2;
              while(p1!=NULL)
             {      if(strcmp(p2->name,p1->name)>0)
                   {     
                         strcpy(_name,p2->name);
                         strcpy(p2->name,p1->name);
                         strcpy(p1->name,_name);
                        
                         strcpy(_fnum,p2->fnum);
                         strcpy(p2->fnum,p1->fnum);
                         strcpy(p1->fnum,_fnum);
                        
                         strcpy(_dnum,p2->dnum);
                         strcpy(p2->dnum,p1->dnum);
                         strcpy(p1->dnum,_dnum);
                        
                         strcpy(_mnum,p2->mnum);
                         strcpy(p2->mnum,p1->mnum);
                         strcpy(p1->mnum,_mnum);
                        
                         strcpy(_xnum,p2->xnum);
                         strcpy(p2->xnum,p1->xnum);
                         strcpy(p1->xnum,_xnum);
                   }
                 p1=p1->next;
             }
           p2=p2->next;
       }
      
        printf("\n");
        printf("\n");
        printf("序号  姓名      家庭电话号码   单位电话号码   手机号码       小灵通号码\n");        
        p3=head;
      
        do   //输出链表中信息
       {      
              n++;
              printf(" %-5d%-10s%-15s%-15s%-15s%-15s\n",n,p3->name,p3->fnum,p3->dnum,p3->mnum,p3->xnum);
              p3=p3->next;
       }while(p3!=NULL);
      
        return (head);   
}                        
                                                                                                               
  link *insert(link *head)
{     link *pp1=NULL,*pp2=NULL;
      char identify,absorb;
      do
      {
            pp1=head;
            pp2=(link *)malloc(LEN);
            printf("\n");
            printf("\n");
            printf("\n");
            printf("\n");
            printf("                                姓名:");
            gets(pp2->name);
            printf("                                家庭电话号码:");
            gets(pp2->fnum);
            printf("                                单位电话号码:");
            gets(pp2->dnum);
            printf("                                手机号码:");
            gets(pp2->mnum);
            printf("                                小灵通号码:");
            gets(pp2->xnum);
            while(pp1->next!=NULL)
                  pp1=pp1->next;
            pp1->next=pp2;
            pp2->next=NULL;
            printf("\n");
            printf("\n");
            printf("                        内容已保存,是否继续?(Y/N):");
            scanf("%c",&identify);
            scanf("%c",&absorb);
            while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N')
           {       printf("                                请输入(Y/N):");
                   scanf("%c",&identify);
                   scanf("%c",&absorb);
           }
      }while(identify!='n'&&identify!='N');
       return (head);                                                                           
}

link *change(link *head)
{      link *p1,*p2,*p3;
       p1=p3=head;
       void print(link *);
       print(p3);
       int choose,i,n=0;
       char _choose,absorb,identify;
       char input[21];
       printf("\n");
       printf("\n");
       printf("                   请输入需修改内容所在行序列号:");
       scanf("%d",&choose);
       scanf("%c",&absorb);
     
       while(p1!=NULL)   //计算链表中记录数目
      {      n++;
             p1=p1->next;
      }
       p1=head;
      
       while(choose<0||choose>n)
      {      printf("                    查无此内容,请确认后重新输入:");
             scanf("%d",&choose);
             scanf("%c",&absorb);
      }
     
       printf("\n");
       for(i=1;i<choose;i++)   //将指针指向指定位置
             p1=p1->next;
   
       printf("a.姓名   b.家庭电话号码   c.单位电话号码   d.手机号码   e.小灵通号码\n");      
       printf("                         请输入修改内容类型:");
       scanf("%c",&_choose);
       scanf("%c",&absorb);
       printf("\n");
       printf("                          请输入修改内容:");
       gets(input);
       printf("\n");
       printf("                         确认要替换吗?(Y/N):");
       scanf("%c",&identify);
       scanf("%c",&absorb);
       printf("\n");
      
       while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N')
      {       printf("                    请输入(Y/N):");
              scanf("%c",&identify);
              
      }
      
       if(identify=='y'||identify=='Y')
      {      switch(_choose)
           {   case 'a':  strcpy(p1->name,input);
                          printf("                       内容已修改,按任意键返回。");
                          break;
               case 'b':  strcpy(p1->fnum,input);
                          printf("                       内容已修改,按任意键返回。");
                          break;
               case 'c':  strcpy(p1->dnum,input);
                          printf("                       内容已修改,按任意键返回。");
                          break;                                                                                         
               case 'd':  strcpy(p1->mnum,input);
                          printf("                       内容已修改,按任意键返回。");
                          break;
               case 'e':  strcpy(p1->xnum,input);
                          printf("                       内容已修改,按任意键返回。");
                          break;
            }      
      }
      getch();
      return (head);
}

void search(link *head)
{     char fullname[9];
      printf("\n");
      printf("\n");
      printf("                                请输入姓名:");
      gets(fullname);
      link *p1,*p2;
      char _name[9]="";   
      int n=0;
      p1=head;
      printf("\n");
      printf("序号  姓名      家庭电话号码   单位电话号码   手机号码       小灵通号码\n");  
   
      while(p1!=NULL)
     {      strncpy(_name,p1->name,strlen(fullname));   //按输入姓名字符数截取每个姓名,和输入姓名比较
            if(strcmp(fullname,_name)==0)
                 {    n++;   //计算链表中记录的序号
                      printf(" %-5d%-10s%-15s%-15s%-15s%-15s\n",n,p1->name,p1->fnum,p1->dnum,p1->mnum,p1->xnum);                                          
                      p1=p1->next;
                 }
            else
                  p1=p1->next;
     }
     
      printf("\n");
      printf("                        共找到%d条信息,按任意键返回。",n);
      getchar();
}

link *delet(link *head)
{     
      print(head);
      link *p1,*p2,*pp;
      char absorb,identify;
      int i,choose,n=0;
      p1=p2=pp=head;
      printf("\n");
      printf("                  请选择要删除的内容所在行的序号:");
      scanf("%d",&choose);
      scanf("%c",&absorb);
   
      while(p1!=NULL)   //计算链表中的记录数目
      {      n++;
             p1=p1->next;
      }
       p1=head;
      
       while(choose<0||choose>n)
      {      printf("                   查无此内容,请确认后重新输入:");
             scanf("%d",&choose);
             scanf("%c",&absorb);
      }                                   
      
       printf("                        确认要删除吗?(Y/N)");
       scanf("%c",&identify);
      
        while(identify!='y'&&identify!='Y'&&identify!='n'&&identify!='N')
      {       printf("                    请输入(Y/N):");
              scanf("%c",&identify);
      }
      
       if(identify=='y'||identify=='Y')
      {       if(choose==1)
             {     p1=p1->next;
                   head=p1;
                   free(pp);   //释放删除结点所占内存
             }        
              else   
             {      for(i=1;i<choose;i++)
                   {
                     p2=p1;
                     p1=p1->next;
                   }
                    p2->next=p1->next;
                    free(p1);   ////释放删除结点所占内存
             }        
       printf("                     已成功删除,按任意键返回。");                                         
       getchar();
      }        
      
       return (head);                                 
}

void saves(link *p)   //将原文件中内容清空,将链表中的内容存入文件   
{   FILE *fp;   
      if((fp=fopen("tongxunlu","w"))==NULL)
     {      printf("       无法打开文件~~~\n");
            exit(0);
     }   
    while(p!=NULL)   
   {    fwrite(p,LEN,1,fp);  
        p=p->next;   
   }   
      fclose(fp);
}               


使用DEV编译~~~

页: [1]


Powered by Discuz! 6.1.0  © 2001-2007 Comsenz Inc.