语言:c语言
格式: 编号 姓 名 住址 电话 住宅电话
201701 * xxxx 183****5668
要求:使用结构体形式对数据存储
功能:使用链表实现增加(在增加人员的过程中有一个自动排序功能,比如按姓名排序)、删除、修改、查找(比如:工号查找、电话查找)的功能;
(1)添加用户信息(号码长度 号码是否重复)
(2)列出好友信息(按姓名排序)
(3)查找好友信息(按姓名查找)
(4)删除好友
(5)退出
头文件: AddressBook.h
#ifndef _ADDRESSBOOK_H_
#define _ADDRESSBOOK_H_
#define FAILURE 10000
#define SUCCESS 20000
#define FALSE 30000
typedef struct node //定义一个结构体,保存结点信息
{
char name[20];
char number[20];
char ID[20];
char address[20];
char homephone[20];
struct node *next;
}Node;
typedef Node *LinkList;
#endif
接口函数: AddressBook.c
#include
#include
#include "AddressBook.h"
#include
#include
#include
#include
#include
/* 初始化模块 */
int ListInit(LinkList *L)
{
(*L) = (LinkList)malloc(sizeof(Node)); //为链表分配空间
(*L)->next = NULL;
}
/* 插入模块(并按姓名排序)*/
int InsertInfo(LinkList *L)
{
LinkList p = *L;
LinkList s;
printf("请输入好友信息(姓名 工号 手机号 住址 家庭电话):\n");
s = (LinkList)malloc(sizeof(Node));
scanf("%s%s%s%s%s",s->name, s->ID, s->number, s->address, s->homephone);
if(strlen(s->number) != 11) //手机号长度不为11
{
printf("输入手机号码错误!\n");
return FALSE;
}
if(strlen(s->homephone) != 8) //家庭电话长度不为8
{
printf("输入家庭电话错误!\n");
return FALSE;
}
/* 此部分还需完善,对重名的处理还有其他很多方式,此处可以检测到重名,但是并未替换 */
int flag;
while(p->next != NULL)
{
if(strcmp((p->next)->name,s->name) == 0) //判断重名
{
printf("该名字已存在,是否替换?\n");
printf("1.是 2 . 否\n" );
scanf("%d", &flag);
if(1 == flag)
{
p = s ;
break;
}
if(2 == flag)
{
PrintInfo();
}
}
if(strcmp((p->next)->number,s->number) == 0) //判断重号
{
printf("已存在相同手机号码!\n"); //家庭号码可以重复,无需考虑
return FALSE;
}
p = p->next;
}
p = *L;
if(p -> next == NULL)
{
s->next = p->next;
p->next = s;
}
else
{
/* 对输入的信息按人名排序 */
while(p->next)
{
if(strcmp((p -> next)->name, s -> name) > 0)
{
s->next = p->next;
p->next = s;
break;
}
p = p -> next;
}
if(NULL == p->next)
{
s->next = p->next;
p->next = s;
}
}
printf("是否继续输入联系人?\n");
printf("1.是 2.否\n");
scanf("%d",&flag);
if( 1 == flag)
{
InsertInfo(L); //继续输入
}
else if( 2 == flag)
{
return 0;
}
else
{
printf("输入错误!\n");
}
}
/* 显示模块 */
int ShowInfo(LinkList L)
{
if(L->next == NULL)
{
printf("通讯录为空!\n");
}
else
{
LinkList p = L->next;
while(p)
{
printf("Name: %s Id: %s number: %s homephone: %s Address: %s\n",p->name,p->ID,p->number,p->homephone,p->address);
p=p->next;
}
}
}
/* 查询模块 */
int SearchInfo (LinkList L)
{
LinkList p = L -> next;
char n[10];
printf("输入想要查询的好友的姓名:\n");
scanf("%s",n);
while(p)
{
if(strcmp(p->name,n) == 0) //查询到此人
{
printf("ID: %s Tele: %s Mobile: %s Address: %s\n",p->ID,p->homephone,p->number,p->address);
break;
}
else
{
p =p->next;
}
}
if(NULL == p)
printf("查无此人!\n");
}
/* 删除模块 */
int DeleteInfo(LinkList L)
{
LinkList p = L;
LinkList tmp;
char n[10];
printf("输入想要删除的好友的姓名:\n");
scanf("%s",n);
if(p -> next == NULL)
{
printf("通讯录为空!\n");
return FALSE;
}
else
{
while(p -> next)
{
if(strcmp((p->next)->name,n) == 0) //找到这个人
{
tmp = p->next;
p->next = tmp->next;
free(tmp);
printf("删除好友信息成功!\n");
return SUCCESS;
}
p =p->next;
}
if(p -> next == NULL)
{
printf("查无此人!\n");
return FALSE;
}
}
}
/* 修改模块 */
int ChangeInfo(LinkList *L)
{
LinkList t;
LinkList p = (*L)->next;
LinkList s ;
char n[10];
char a[10];
char b[10];
char c[10];
char d[10];
char e[10];
printf("输入想要修改的好友的姓名:\n");
scanf("%s",n);
int flag;
while(p)
{
if(strcmp(p->name,n) == 0)
{
printf("请输入您要修改的信息:1.姓名 2.编号 3.电话 4.家庭电话 5.住址\n"); //5个选项是输入分别对应上面的abcde
scanf("%d",&flag);
t = p;
switch(flag)
{
/* 修改姓名 */
case 1:
printf("Please input a new name:\n");
scanf("%s",a );
p = (*L)->next;
while(p)
{
if(strcmp(p->name,a) == 0)
{
printf("此名字已在通讯录中!\n");
return FAILURE;
}
p = p->next;
}
if( NULL == p)
{
strcpy(p->name , a);
printf("修改姓名成功!\n");
return SUCCESS;
}
p = (*L)->next;
while(p->next)
{
if(strcmp((p -> next)->name, a) > 0)
{
s->next = p->next;
p->next = s;
break;
}
p = p -> next;
}
/* 修改工号 */
case 2:
printf("%s 的工号为:%s\n",p->name, p->ID);
printf("Please input a new ID:\n");
scanf("%s",b );
p = (*L)->next;
while(p)
{
if(strcmp(p->ID,b) == 0)
{
printf("此工号已在通讯录中!\n");
break;
}
p = p->next;
}
strcpy(t->ID , b);
printf("修改工号成功!\n");
return SUCCESS;
/* 修改电话 */
case 3:
p = (*L)->next;
printf("%s 的电话为:%s\n",p->name, p->number);
printf("Please input a new number:\n");
scanf("%s",c );
while(p)
{
if(strlen(p->number) != 11)
{
printf("无效手机号码!\n");
return FAILURE;
}
if(strcmp(p->ID,c) == 0)
{
printf("此号码已在通讯录中!\n");
return FAILURE;
}
p = p->next;
}
if( NULL == p)
{
strcpy(t->ID , b);
printf("修改号码成功!\n");
return SUCCESS;
}
/* 修改家庭电话 */
case 4:
printf("%s 的家庭电话为:%s\n",p->name, p->homephone);
printf("Please input a new homephone:\n");
scanf("%s",d );
p = (*L)->next;
while(p)
{
if(strlen(p->homephone) != 8)
{
printf("无效家庭电话号码!\n");
return FAILURE;
}
p = p->next;
}
if( NULL == p)
{
strcpy(t->homephone , d);
printf("修改家庭电话成功!\n");
return SUCCESS;
}
/* 修改家庭住址 */
case 5:
printf("%s 的家庭住址为:%s\n",p->name, p->address);
printf("Please input a new address:\n");
scanf("%s",e );
strcpy(t->address , e);
printf("修改地址成功!\n");
return SUCCESS;
default :
printf("输入错误!\n");
}
}
p = p->next;
if(p == NULL)
{
printf("查无此人!\n");
return FAILURE;
}
}
printf("是否继续修改:\n");
printf("1.是 2.否\n");
scanf("%d",&flag);
if(1 == flag)
{
ChangeInfo(L);
}
else if(2 == flag)
{
PrintInfo();
}
else
{
printf("输入错误!\n");
return FAILURE;
}
}
/* 保存模块 */
int SaveInfo(LinkList L)
{
printf("保存中,请稍等...\n");
sleep(2);
printf("正在退出...\n");
sleep(2);
LinkList p = L->next;
FILE *fp;
fp = fopen("address.txt","w"); //以只写方式打开这个文件(会在当前目录创建一个address.txt的文件)
if (NULL == fp)
{
perror("fopen");
exit(1);
}
while(p)
{
fwrite(p, sizeof(Node), 1, fp);
p = p->next;
}
fclose(fp);
}
/* 打开文件 */
void ReadInfo(LinkList L)
{
FILE *fp;
LinkList p;
p = L->next;
size_t ret;
p = NULL;
LinkList x = L;
fp = fopen("address.txt", "r"); //以只读方式打开这个文件
if (NULL == fp)
{
perror("fopen");
exit(1);
}
while(!feof(fp))
{
p = (LinkList)malloc(sizeof(Node));
if(NULL == p)
{
printf("malloc failure!\n");
return;
}
if(fread(p, sizeof(Node), 1, fp) != 1)
{
break;
}
else
{
p->next = NULL;
x->next = p;
x = p;
}
}
fclose(fp);
}
主函数:main.c
#include
#include
#include "AddressBook.h"
void show()
{
system("clear");
printf("**************************************\n\n");
printf("**********欢迎来到華仔通讯录**********\n\n");
printf("**************************************\n\n");
sleep(0.5);
// system("clear");
}
void PrintInfo()
{
printf("*-------------------------------------------*\n");
printf("| 1.添加用户信息 2.列出好友信息 |\n");
printf("| 3.查找好友信息 4.删除好友 |\n");
printf("| 5.修改好友信息 6.保存并退出 |\n");
printf("*-------------------------------------------*\n\n");
printf("***********请输入你的选择***********\n");
}
int main()
{
LinkList txl;
int choice;
show();
ListInit(&txl); //初始化,将链表置空
ReadInfo(txl); //每次打开都从.txt文件中读出上次保存后的信息,读到链表中
while(1)
{
PrintInfo();
scanf("%d",&choice);
switch (choice)
{
case 1:
InsertInfo(&txl);
break;
case 2:
ShowInfo(txl);
break;
case 3:
SearchInfo(txl);
break;
case 4:
DeleteInfo(txl);
break;
case 5:
ChangeInfo(&txl);
break;
case 6:
SaveInfo(txl);
exit(1);
default:
printf("Unknown Input!\n");
break;
}
}
return 0;
}