test3.cpp
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW 0
typedef int Elemtype;
/*通讯录的结构*/
typedef struct MailList{
int num;
char name[20];
char tel1[12];
char tel2[12];
char email[50];
}MailList;
/*用于恢复删除信息的结构*/
typedef struct DeleteList{
MailList data;
DeleteList *next;
}DeleteList,*LinkList;
/*顺序表的定义结构*/
typedef struct{
MailList *elem; //存储空间基址
int length; //当前长度
int Listsize; //当前分配的存储容量
}SqList;
int InitList_Sq(SqList &L);//初始化通讯录
bool InitList_Delete(MailList &L);//初始化回收站
int ListIsert_Sq(SqList &L,int i,Elemtype e);//插入数据
void ShowAll(SqList &L);//显示全部通讯录内容
int deleteList(SqList &L1,int i,MailList &e);//删除某一条并以e返回
void ListInsert(LinkList &L,MailList x);//添加到回收站
void WatchList(LinkList &L);//查看回收站
bool find_int(SqList &L,int x);//按照编号查找数据
void find_char(SqList &L,char x[]);//按照姓名查找数据
bool recoverList(LinkList &L2,int n,MailList &e);//从回收站中删除并以e返回
bool ChangeList(SqList &L1,int n);//修改信息
#include"test3_Seq.h"
#include"test3_Link.h"
int main(void)
{
SqList L1;
InitList_Sq(L1);
LinkList L2;
InitList_Delete(L2);
MailList M;
int i = 1;
printf("请创建新的通讯录,格式为:姓名 电话1 电话2 电子邮箱。(输入数字“0”结束)\n");
while(1)
{
M.num = i;
scanf("%s",M.name);
if(M.name[0] == '0') break;
scanf("%s %s %s",M.tel1,M.tel2,M.email);
ListIsert_Sq(L1,M);
i ++;
}
printf("输入成功!^_^\n");
int number;
while(1){
printf("请输入数字进行相关操作\n1.查看通讯录\n2.查找通讯录\n3.添加通讯录\n4.修改通讯录\n5.删除通讯录\n6.查看已删除的通讯录\n7.恢复通讯录\n0.退出菜单\n");
scanf("%d",&number);
switch(number)
{
case 1:
ShowAll(L1);
break;
case 2:
int n,m;
char find_name[20];
printf("选择查找方式\n1.按编号查找\n2.按姓名查找\n");
scanf("%d",&n);
if(n == 1)
{
printf("请输入编号: ");
scanf("%d",&m);
find_int(L1,m);
}
else if(n == 2)
{
printf("请输入姓名: ");
scanf("%s",find_name);
find_char(L1,find_name);
}
break;
case 3:
printf("请输入你要添加的内容: ");
M.num = i;
scanf("%s %s %s %s",M.name,M.tel1,M.tel2,M.email);
ListIsert_Sq(L1,M);
i ++;
break;
case 4:
int c;
printf("请输入你要修改的条目编号: ");
scanf("%d",&c);
ChangeList(L1,c);
break;
case 5:
int a;
printf("请输入你要删除的成员序号: ");
scanf("%d",&a);
MailList N;
deleteList(L1,a,N);
ListInsert(L2,N);
break;
case 6:
WatchList(L2);
break;
case 7:
int b;
printf("请输入要还原的成员在回收站中的编号: ");
scanf("%d",&b);
recoverList(L2,b,M);
ListIsert_Sq(L1,M);
break;
case 0:
free(L1.elem);
return 0;
default:
printf("请输入正确的数字!\n");
break;
}
}
}
test_Link.h
#include<stdio.h>
#include<stdlib.h>
//此函数用于创建链表
int InitList_Delete(LinkList &L)
{
L = NULL;
L = (LinkList)malloc(sizeof(DeleteList));
if(L == NULL) return 0;
LinkList P = L -> next;
P = NULL;
return 1;
}
//此函数用于在链表中(回收站)插入元素
void ListInsert(LinkList &L,MailList x)
{
LinkList p,q;
p = L;
while(p->next)
p = p->next;
q = (LinkList)malloc(sizeof(DeleteList));
q->data = x;
q->next = p->next;
p->next = q;
printf("删除成功!可在回收站中查看。\n");
}
//此函数用于查看回收站
void WatchList(LinkList &L)
{
LinkList p;
p = L->next;
while(p)
{
printf("%d %s %s %s %s\n",p->data.num,p->data.name,p->data.tel1,p->data.tel2,p->data.email);
p = p->next;
}
}
//此函数用于从回收站中删除数据并以e返回
int recoverList(LinkList &L2,int n,MailList &e)
{
LinkList p,q;
int i,k = 0;
q = L2->next;
while(q){
q = q->next;
k ++;
}
if(n < 1 || n > k){
printf("输入错误\n");
return 0;
}
p = L2;
for(i = 0;i < n - 1;i ++)
p = p->next;
e = p->next->data;
p->next = p->next->next;
printf("恢复成功!\n");
return 1;
}
test_Seq.h
#include<stdio.h>
#include<stdlib.h>
/*此函数用于初始化顺序表*/
int InitList_Sq(SqList &L)
{
L.elem = (MailList *)malloc(LIST_INIT_SIZE*sizeof(MailList)); //为线性表分配100个空间
if(! L.elem) exit(OVERFLOW); //如果分配失败则返回0
L.length = 0;
L.Listsize = LIST_INIT_SIZE;
return 1;
}
//此函数用于删除第i条内容
int deleteList(SqList &L1,int i,MailList &e)
{
if((i<1)||(i>L1.length))
{
printf("请输入正确的数字!\n");
return 0;
}
int j;
e = L1.elem[i - 1];
for(j = i;j <= L1.length -1;j ++)
{
L1.elem[j].num --;
L1.elem[j - 1] = L1.elem[j];
}
L1.length --;
return 1;
}
/*此函数用于在顺序表末尾插入数据元素*/
int ListIsert_Sq(SqList &L,MailList e)
{
MailList *newbase ;
if(L.length >=L.Listsize)
{
newbase = (MailList *)realloc(L.elem,(L.Listsize + LISTINCREMENT) * sizeof(MailList));
if(! newbase) exit(OVERFLOW);
L.elem = newbase;
L.Listsize +=LISTINCREMENT;
}
MailList *p;
p = &(L.elem[L.length]);
*p = e;
++ L.length;
return 1;
}
//此函数用于显示整个通讯录内容
void ShowAll(SqList &L)
{
MailList* p;
p = &(L.elem[0]);
for (p = &(L.elem[0]);p < &(L.elem[L.length]);p ++)
printf("%d %s %s %s %s\n",p->num,p->name,p->tel1,p->tel2,p->email);
}
//此函数用于通过编号查找成员信息
int find_int(SqList &L,int x)
{
if(x < 1 || x > L.length)
{
printf("编号不存在!\n");
return 0;
}
MailList *p;
int i;
p = &(L.elem[0]);
for(i = 1;i < x;i ++)
p += 1;
printf("%d %s %s %s %s\n",p->num,p->name,p->tel1,p->tel2,p->email);
}
//此函数用于通过姓名查找成员信息
void find_char(SqList &L,char x[])
{
MailList* p;
int h = 0,i;
p = &(L.elem[0]);
for(i = 0;i < L.length;i ++)
{
if(strcmp(p->name,x) == 0)
{
printf("%d %s %s %s %s\n",p->num,p->name,p->tel1,p->tel2,p->email);
h = 1;
}
p ++;
}
if(h == 0)
printf("编号不存在!\n");
}
//此函数用于修改成员信息
int ChangeList(SqList &L1,int n)
{
if(n < 1 || n > L1.length)
{
printf("编号不存在!\n");
return 0;
}
MailList *p;
int i;
p = &(L1.elem[0]);
for(i = 1;i < n;i ++)
p += 1;
int s = 1;
while(s != 0){
printf("请选择你要修改的信息:\n1.姓名\n2.电话1\n3.电话2\n4.电子邮箱\n0.退出\n");
scanf("%d",&s);
printf("修改为:");
switch(s)
{
case 1:
char nm[20];
scanf("%s",nm);
strcpy(p->name , nm);
printf("修改成功!\n");
break;
case 2:
char t1[12];
scanf("%s",t1);
strcpy(p->tel1 , t1);
printf("修改成功!\n");
break;
case 3:
char t2[12];
scanf("%s",t2);
strcpy(p->tel2 , t2);
printf("修改成功!\n");
break;
case 4:
char em[50];
scanf("%s",em);
strcpy(p->email , em);
printf("修改成功!\n");
break;
case 0:
return 1;
default:
printf("请输入正确的数字!\n");
}
}
}