先直接上代码,后面再对代码说明。
//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 #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
关于程序代码的说明
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 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();
本程序主要包含两大模块:主函数模块和子函数模块。
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)函数运行时调用。
此程序的保存操作只能为手动形式的。所以,对此通讯录的各项操作在完成后并不能自动完成保存,如当完成删除一个成员后,只是完成了在内存中的删除,info.txt中的相应信息并不没有被删除,若想将删除操作后的信息保存,还需要手动选择一次保存。操作时要特别注意每次退出前都要保存一次,否则之前的操作很有可能全部失效。
此程序的创建通讯录函数(void CreatABList(ABList &L))一旦执行之前建立的通讯录将清空,一切从新头开始建立通讯录,所以若想连续在已有信息的通讯录中增加多个成员信息,只能多次选择void Increase(ABList &L)函数来进行。
本文为原创博客,转载请注明转载自:http://blog.csdn.net/computerme/article/details/38750961