数据结构课程设计--通讯录管理(C语言实现)

         直接上代码,后面再对代码说明。

//mainf.cpp
#include<string.h>
#include<ctype.h>
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include<io.h> // eof()
#include<math.h> // floor(),ceil(),abs()
#include<process.h> // exit()
#include<iostream.h> // cout,cin
#include"ABlist.h"
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE
struct AddressBook *start;
struct AddressBook *last;
Status load(ABList &L);//装载函数,
int menu();//菜单显示函数
void CreatABList(ABList &L);//创建通讯录
void Increase(ABList &L);//在通讯录中增加成员
Status del(ABList &L);//删除通讯录中的一个成员
Status Modify(ABList &L);//修改通讯录中指定成员的信息
Status search(ABList &L);//查找通讯录中指定编号的元素信息
Status display(ABList &L);//显示通讯录中各成员的信息
Status save(ABList &L);//保存输入的信息
void inputs(char *s,int count);//此函数专用于建立函数用的输入操作
void destroy(ABList &L);
AddressBook creat_e();
void main()
{
 ABList L;
 printf("\n\n\t\tWelcom to the information management system!\n\t\t\t Copyright.Computerme,2010.\n");
 InitList_AB(L);
    load(L);
    system("color 18");
 int flag=1;
 while(flag)
 {
  
  switch(menu())
  {
  case 1:CreatABList(L);break;
  case 2:Increase(L);break;
  case 3:del(L);break;
  case 4:Modify(L);break;
  case 5:search(L);break;
  case 6:save(L);break;
  case 7:destroy(L);break;
  case 8:system("cls");break;
  case 9:flag = 0;printf("\t\t\t欢迎下次使用! \n\t\tCopyright.Computerme,2010.\n");
  }
 }
 
}
Status load(ABList &L)
{
 FILE *fp,*fq;
 int i,j;
 if( ((fq = fopen("amout.txt","rb")) == NULL)||((fp= fopen("info.txt","rb"))== NULL) )
 {
  printf("file read error,maybe you have not creat a file to save the information!\n");
  return ERROR;
 }
 fread(&i,sizeof(int),1,fq);
 for (j=0;j<i;j++)
 {
  fread(&L.elem[j],sizeof(struct AddressBook),1,fp); 
  L.length++;
 }
 printf("\nfile read succeed!!\n");
 fclose(fp);
 return OK;
}
int menu()
{
 int a;
    printf("\t\t┏━━━━━━━━操作目录━━━━━━━┑\n");
    printf("\t\t┃                                      ┃\n");
    printf("\t\t┃    1. 建立通讯录  2.增加    3.删除   ┃\n");
    printf("\t\t┃                                      ┃\n");
    printf("\t\t┃    4.修改      5.查询       6.保存   ┃\n");
    printf("\t\t┃                                      ┃\n");
    printf("\t\t┃    7.销毁      8.清屏       9.退出   ┃\n");
    printf("\t\t┗━━━━━━━━━━━━━━━━━━━┛\n");
 printf("\n\n\t\t\t   请选择操作:");
 scanf("%d",&a);
 getchar();
 printf("\n");
    return a;   
 
}
void CreatABList(ABList &L)
{
 char c[2];
 int j = 0;
 if(InitList_AB(L) == 1)
 {
  printf("建立通讯录分配空间成功,现在您可以开始输入数据建立不超过100个人的信息!\n");
  
  printf("您是否想从现在开始建立?Y/N.\n");
  gets(c);
  while((((c[0]=='y')||(c[0]=='Y')))&&(j<100))
  {
   printf("请输入第%d位同学的编号:",j+1);
   scanf("%d",&L.elem[j].ID);
   getchar();
   printf("第%d位同学的姓名: ",j+1);
   inputs(L.elem[j].name,10);
   printf("第%d位同学的性别: ",j+1);
   inputs(&L.elem[j].ch,1);
   printf("第%d位同学的电话: ",j+1);
   inputs(L.elem[j].phone,13);
   printf("第%d位同学的地址: ",j+1);
   inputs(L.elem[j].addr,31);
   L.length = j+1;
   j++;
   printf("是否继续??Y/N.\n");
   gets(c);
  }
 }
 else{
  printf("对不起!建立通讯录分配空间失败。\n");exit(1);
 } 
}
void Increase(ABList &L)
{ 
 
 ListInsert_AB(L,L.length+1,creat_e());
 printf("增加成功!!!\n");
}
Status del(ABList &L)
{
 if(display(L) == 0)
  return ERROR;
 printf("请从上面屏幕上选择输入准备删除同学的编号:  ");
 int a;
 scanf("%d",&a);
 getchar();
 ListDelete_AB(L,a);
 return OK;
}
Status Modify(ABList &L)
{
 int a;
 if(display(L) == 0)
  return ERROR;
 printf("\n请输入要修改同学的编号: \n");
 scanf("%d",&a);
 fflush(stdin);
 if (L.length == 0) {
  printf("对不起,此通讯录目前还没有建立信息。没有可删除的对象!\n");
  return ERROR;
 }
  AddressBook *p, *q;
  int j = 0;
  p = L.elem;
  q = &L.elem[L.length-1];// 表尾元素的位置
  for (p; p<=q;p++)
   if(p->ID == a)
   {
    printf("编号已找到,现在开始修改此编号所对应同学的信息.\n");
   *p = creat_e();
   j = 1;
   break;
   }
  
   if (j == 0)
   {
    printf("对不起,没有具有此编号的元素!\n");
    return ERROR;
   }
 printf("修改成功!\n");
 return OK;
}
Status search(ABList &L)
{
 if(display(L) == 0)
  return ERROR;
 printf("请输入要查询同学的具体编号(若不想查询具体元素,请输入 -1 以便退出):  ");
 int a;
 scanf("%d",&a);
 fflush(stdin);
 if(a == -1)
  return ERROR;
 if (LocateABook(L,a) == 0)
  printf("\n对不起!您所选择的编号不在此通讯录中。\n\n");
 return OK;
}
Status display(ABList &L)
{
 AddressBook *p;
 if (L.length == 0) {
  printf("此通讯录还没有建立,请先建立!!!\n\n\n");
  return ERROR;
 }
 int i=1;
 printf("此通讯录共建立了%d位同学的信息!\n\n",L.length);
 for(p = L.elem;p<=&L.elem[L.length-1];p++,i++)
 {
  printf("第%d位同学的信息如下: \n",i);
  printf("\t编号: %d\t\t",p->ID);
  printf("姓名: %s\n",p->name);
 }
 return OK; 
}
Status save(ABList &L)
{
 FILE *fp,*fq;
 int i;
 if((fq = fopen("amout.txt","wb"))== NULL)
 {
  printf("file write error\n");
  fclose(fq);
  return ERROR;
 }
 if ((fp = fopen("info.txt","wb")) ==  NULL)
 {
  printf("file write error\n");
  fclose(fp);
  fclose(fq);
  return ERROR;
 }
 for (i=0;i<L.length;i++)
 {
  fwrite(&L.elem[i],sizeof(struct AddressBook),1,fp);
 }
 fwrite(&i,sizeof(int),1,fq);
 printf("保存成功!\n");
 fclose(fp);
 fclose(fq);
 return OK;
}
void inputs(char *s,int count)
{
    char p[200];      
    do
 {
  gets(p);   
  if (strlen(p)>count)    
   printf("\n字符太长、请重新输入\n");
 }
    while (strlen(p)>count);      
    strcpy(s,p);
}
AddressBook creat_e()
{
 AddressBook e;
 printf("请输入编号:");
 scanf("%d",&e.ID);
 getchar();
 printf("姓名: ");
 inputs(e.name,11);
 printf("性别: ");
 inputs(&e.ch,2);
 printf("电话: ");
 inputs(e.phone,14);
 printf("地址: ");
 inputs(e.addr,32);
 return e;
}
void destroy(ABList &L)
{
 free(L.elem);
 save(L);
 printf("销毁成功!!!\n");
 L.length = 0;
}

//ABList.h

////ABlist.h
 #include<string.h>
 #include<ctype.h>
 #include<malloc.h> // malloc()等
 #include<limits.h> // INT_MAX等
 #include<stdio.h> // EOF(=^Z或F6),NULL
 #include<stdlib.h> // atoi()
 #include<io.h> // eof()
 #include<math.h> // floor(),ceil(),abs()
 #include<process.h> // exit()
 #include<iostream.h> // cout,cin
 // 函数结果状态代码
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 // #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
 typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
 typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE
 #define LIST_INIT_SIZE 100  //线性表存储空间的初始分配量
 #define LISTINCREMENT  10   //线性表存储空间的分配增量
struct AddressBook
{
  int ID;        //编号
        char name[10];  //姓名
     char ch;    //性别
  char phone[13];  //电话
  char addr[31];  //地址
};
typedef struct
{
   AddressBook *elem;
   int length;
   int listsize;
}ABList;
Status InitList_AB(ABList &L)
{ 
  // 构造一个空的线性表L。
  L.elem = (AddressBook *)malloc(LIST_INIT_SIZE*sizeof(AddressBook));
  if (!L.elem) return ERROR;        // 存储分配失败
  L.length = 0;                  // 空表长度为0
  L.listsize = LIST_INIT_SIZE;   // 初始存储容量
  return OK;
} // InitList_ABList
Status ListInsert_AB(ABList &L,int i,AddressBook e) { 
  // 在顺序线性表L的第i个元素之前插入新的元素e,
 AddressBook *p;
   if (i < 1 || i > L.length+1) return ERROR;  // i值不合法
   if (L.length >= L.listsize) {   // 当前存储空间已满,增加容量
    AddressBook *newbase = (AddressBook *)realloc(L.elem,
                  (L.listsize+LISTINCREMENT)*sizeof (AddressBook));
    if (!newbase) return ERROR;   // 存储分配失败
    L.elem = newbase;             // 新基址
    L.listsize += LISTINCREMENT;  // 增加存储容量
  }
  AddressBook *q = &(L.elem[i-1]);   // q为插入位置
  for (p = &(L.elem[L.length-1]); p>=q; --p) *(p+1) = *p;
                                  // 插入位置及之后的元素右移
  *q = e;       // 插入e
  ++L.length;   // 表长增1
  return OK;
} // ListInsert_ABList
Status ListDelete_AB(ABList &L, int i) {  // i为编号
 if (L.length == 0) {
  printf("对不起,此通讯录目前还没有建立信息。没有可删除的对象!\n");
  return ERROR;
 }
  AddressBook *p, *q;
  int j = 0;
  p = L.elem;
  q = &L.elem[L.length-1];// 表尾元素的位置
  for (p; p<=q;p++)
   if(p->ID == i)
   {
    for (p++;p<=q;p++) {
     *(p-1) = *p;// 被删除元素之后的元素左移
    }
    --L.length; // 表长减1
   printf("删除成功!!\n");
   j = 1;
   break;
   }
  
   if (j == 0) { printf("对不起,没有具有此编号的元素!\n");
   }
      
  return OK;
} // ListDelete_ABList
Status LocateABook(ABList &L, int a)
{ 
  AddressBook *p;
 printf("\n");
   p = L.elem;
   int f = 0;//状态判断量(临时使用)
  for (int i=1;i<=L.length;i++)
  {
    if (p->ID== a)
    {
  printf("编号已找到,此编号的个人信息如下: \n");
  printf("\t姓名: %s\n",p->name);
  printf("\t编号: %d\n",p->ID);
  printf("\t性别: %c\n",p->ch);
  printf("\t地址: %s\n",p->addr);
  printf("\t电话号码: %s\n",p->phone);
  f = 1;
  break;
    }
    p++;
  }
  
  if( f == 0) {return ERROR;} 
 else return OK;
} // LocateElem_Sq

关于程序代码的说明

1、线性表中数据元素的结构体定义及线性表L的结构形式

struct AddressBook
{
         int ID;                //编号
         char name[10];         //姓名
         char ch;               //性别
         char phone[13];        //电话
         char addr[31];         //地址
};
typedef struct
{
   AddressBook *elem;
   int length;
   int listsize;
}ABList;

2、本程序部分函数及申明

Status load(ABList &L);//装载函数,
int menu();//菜单显示函数
void CreatABList(ABList &L);//创建通讯录
void Increase(ABList &L);//在通讯录中增加成员
Status del(ABList &L);//删除通讯录中的一个成员
Status Modify(ABList &L);//修改通讯录中指定成员的信息
Status search(ABList &L);//查找通讯录中指定编号的元素信息
Status display(ABList &L);//显示通讯录中各成员的信息
Status save(ABList &L);//保存输入的信息
void inputs(char *s,int count);//此函数专用于建立函数用的输入操作
void destroy(ABList &L);
AddressBook creat_e();

3、本程序包含的所有功能及对应的函数

      本程序主要包含两大模块:主函数模块和子函数模块。

     main( )主函数,是程序的入口,程序执行由此开始执行,程序一开始就申明一个ABList L,以便以后子函数调用时作为参数传递,并通过此主函数调用其他所有子函数。

     Status load(ABList &L)装载函数,读取用户以前操作时保存的信息,并将这些信息通过内存建立成一个线性表,以便用户进行操作。此函数要读取两个文件,info.txt 和amout.txt ,第一个保存的是通讯人的信息,第二个保存的是通讯录中元素的个数,此数据用于建立线性表时确定表长。

      menu( )目录函数,在屏幕上显示对通讯录进行操作的所有操作。

      void CreatABList(ABList &L)创建通讯录输入函数,为了判断输入的数据的有效性,在此函数中还调用了void inputs(char *s,int count)函数,专门用于输入数据的操作。

      void Increase(ABList &L)在通讯录中增加成员,通过调用AddressBook creat_e()实现。

      Status del(ABList &L)成员删除函数,实现删除要删除的成员的所有信息,通过调用display函数使屏幕显示每位同学的姓名与ID之间的对应关系。然后能通过输入ID的方式来删除要删除的元素,若输入ID不在在,则提示出错。

      Status Modify(ABList &L)此函数也是通过调用display函数使屏幕显示每位同学的姓名与ID之间的对应关系。然后能通过输入ID的方式来修改要修改的元素信息,若输入ID不在在,则提示出错。

      Status search(ABList &L) 此函数也是通过调用display函数使屏幕显示每位同学的姓名与ID之间的对应关系。然后能通过输入ID的方式来查找要查找的元素详细信息,若输入ID不在在,则提示出错。

     Status save(ABList &L)保存函数,实现将顺序表的信息保存到info.txt文件中,并将顺序表的长度保存在另一个amoun.txt文件中,以方便以后用户对通讯录进行各项操作,防止因误操作信息丢失。

     void inputs(char *s,int count)此函数专用于建立通讯录时的输入操作,它的主要功能是判断输入的数据是否有效,供void CreatABList(ABList &L)调用。

     void destroy(ABList &L)销毁函数,用于将之前建立的及保存的通讯录作息销毁。

     AddressBook creat_e()此函数主要用于建立一个通讯录元素,供Status Modify(ABList &L)和void Increase(ABList &L)函数运行时调用。

     main( )主函数,是程序的入口,程序执行由此开始执行,程序一开始就申明一个ABList L,以便以后子函数调用时作为参数传递,并通过此主函数调用其他所有子函数。

     Status load(ABList &L)装载函数,读取用户以前操作时保存的信息,并将这些信息通过内存建立成一个线性表,以便用户进行操作。此函数要读取两个文件,info.txt 和amout.txt ,第一个保存的是通讯人的信息,第二个保存的是通讯录中元素的个数,此数据用于建立线性表时确定表长。

      menu( )目录函数,在屏幕上显示对通讯录进行操作的所有操作。

      void CreatABList(ABList &L)创建通讯录输入函数,为了判断输入的数据的有效性,在此函数中还调用了void inputs(char *s,int count)函数,专门用于输入数据的操作。

      void Increase(ABList &L)在通讯录中增加成员,通过调用AddressBook creat_e()实现。

      Status del(ABList &L)成员删除函数,实现删除要删除的成员的所有信息,通过调用display函数使屏幕显示每位同学的姓名与ID之间的对应关系。然后能通过输入ID的方式来删除要删除的元素,若输入ID不在在,则提示出错。

      Status Modify(ABList &L)此函数也是通过调用display函数使屏幕显示每位同学的姓名与ID之间的对应关系。然后能通过输入ID的方式来修改要修改的元素信息,若输入ID不在在,则提示出错。

      Status search(ABList &L) 此函数也是通过调用display函数使屏幕显示每位同学的姓名与ID之间的对应关系。然后能通过输入ID的方式来查找要查找的元素详细信息,若输入ID不在在,则提示出错。

     Status save(ABList &L)保存函数,实现将顺序表的信息保存到info.txt文件中,并将顺序表的长度保存在另一个amoun.txt文件中,以方便以后用户对通讯录进行各项操作,防止因误操作信息丢失。

     void inputs(char *s,int count)此函数专用于建立通讯录时的输入操作,它的主要功能是判断输入的数据是否有效,供void CreatABList(ABList &L)调用。

     void destroy(ABList &L)销毁函数,用于将之前建立的及保存的通讯录作息销毁。

     AddressBook creat_e()此函数主要用于建立一个通讯录元素,供Status Modify(ABList &L)和void Increase(ABList &L)函数运行时调用。

4、程序功能的不足之处

      此程序的保存操作只能为手动形式的。所以,对此通讯录的各项操作在完成后并不能自动完成保存,如当完成删除一个成员后,只是完成了在内存中的删除,info.txt中的相应信息并不没有被删除,若想将删除操作后的信息保存,还需要手动选择一次保存。操作时要特别注意每次退出前都要保存一次,否则之前的操作很有可能全部失效。

     此程序的创建通讯录函数(void CreatABList(ABList &L))一旦执行之前建立的通讯录将清空,一切从新头开始建立通讯录,所以若想连续在已有信息的通讯录中增加多个成员信息,只能多次选择void Increase(ABList &L)函数来进行。


本文为原创博客,转载请注明转载自:http://blog.csdn.net/computerme/article/details/38750961

你可能感兴趣的:(数据结构,通讯录,c语言代码,数据结构课程设计)