先直接上代码,后面再对代码说明。
//mainf.cpp
#include
#include
#include // malloc()等
#include // INT_MAX等
#include // EOF(=^Z或F6),NULL
#include // atoi()
#include // eof()
#include // floor(),ceil(),abs()
#include // exit()
#include // 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;jID == 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;icount)
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
#include
#include // malloc()等
#include // INT_MAX等
#include // EOF(=^Z或F6),NULL
#include // atoi()
#include // eof()
#include // floor(),ceil(),abs()
#include // exit()
#include // 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