先直接上代码,后面再对代码说明。
//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