头文件:
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
typedef int DATA;
typedef enum{TRUE,FALSE,ERROR}BOOL;
enum{QUIT,INSERT,DISPLAY,SEARCH,DELETE};
typedef struct addlist
{
long pertel;
long comtel;
int id;
char address[20];
char name[20];
}Txl;
typedef struct _node
{
Txl te;
struct _node *next;
}Node;
typedef struct _list
{
Node *head;
}List;
//创建一个空链表
List *CreateList();
//删除链表
void Destory(List *pList);
//增加联系人
BOOL Insert_Frined(List *pList);
//显示联系人
void Display(List *pList);
//删除联系人
BOOL Delete_Friend(List *pList);
//查找联系人
BOOL Find_Friend(List *pList);
BOOL Sava_Friends(List *pList);
BOOL Load_Friends(List *pList);
BOOL Insert_Last(List *pList,Txl* data);
int myrand(int Rand_Max);
#endif //_LINKLIST_H_
功能函数
#include "LinkList.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#define SIZE 30
DATA randcount = 0;
int count_friend = 0;
List *CreateList()
{
List *p = (List*)malloc(sizeof(List)/sizeof(char));
if(NULL == p)
{
return NULL;
}
p->head = (Node*)malloc(sizeof(Node)/sizeof(char));
p->head->next = NULL;
if(NULL == p->head)
{
free(p);
return NULL;
}
return p;
}
int myrand(int Rand_Max)//产生随机数
{
int i=0;
srand(time(NULL));
int rnum=rand()%Rand_Max;
return rnum;
}
BOOL Insert_Friend(List *pList)
{
if(NULL == pList)
{
return ERROR;
printf("添加失败\n");
}
/* Node *p = (Node*)malloc(sizeof(Node)/sizeof(char));
if(NULL == p)
{
return ERROR;
printf("添加失败\n");
}
p->next = NULL; */
Txl data;
printf("请输入姓名:\n");
scanf("%s",data.name);
int ran = ++randcount;
data.id = ran;//给每个联系人分配一个ID
printf("生成随机ID:%d\n",ran);
printf("请输入个人手机号码:\n");
scanf("%ld",&data.pertel);
printf("请输入公司手机号码:\n");
scanf("%ld",&data.comtel);
printf("请输入家庭住址:\n");
scanf("%s",data.address);
printf("添加成功!\n");
Insert_Last(pList,&data);
/* Node *tmp = pList->head;
while(tmp->next)
{
tmp = tmp->next;
}
tmp->next = p; */
count_friend++;
return TRUE;
}
BOOL Sava_Friends(List *pList)
{
if(pList == NULL)
{
return;
}
FILE *fp1 = fopen("txl","wb+");
if(NULL == fp1)
{
perror("fail open fp1");
return FALSE;
}
FILE *fp2 = fopen("count","ab+");
if(NULL == fp2)
{
perror("fail open fp2");
return FALSE;
}
Node *tmp = pList->head->next;
int save_count = count_friend;
fwrite(&save_count,sizeof(int),1,fp2);
int i;
while(tmp!=NULL)
{
fwrite(&tmp->te,sizeof(Txl),1,fp1);
printf("save success\n");
tmp = tmp->next;
}
fclose(fp1);
fclose(fp2);
return TRUE;
}
BOOL Load_Friends(List *pList)
{
FILE* fp3 = fopen("txl","rb+");
if(NULL == fp3)
{
perror("fail open fp3");
return -1;
}
FILE* fp4 = fopen("count","rb+");
if(NULL == fp4)
{
perror("fail open fp4");
return -1;
}
int i;
int load_count=0;
while(1)
{
size_t ret = fread(&load_count,sizeof(int),1,fp4);
if (0 == ret) // 可能是文件结尾, 也可能是发生错误
{
if (feof(fp4) == 0) // 错误
{
printf ("文件发生错误\n");
return -1;
}
break;
}
}
count_friend = load_count;
printf("load_count = %d\n",load_count);
printf("cofriend %d\n",count_friend);
Txl history[load_count];
for(i=0;i<load_count;i++)
{
fread(&history[i],sizeof(Txl),1,fp3);
Insert_Last(pList,&history[i]);
printf("load success\n");
}
}
BOOL Insert_Last(List *pList,Txl* data)
{
if(NULL == pList)
{
return ERROR;
}
Node *p = (Node*)malloc(sizeof(Node)/sizeof(char));
if(NULL == p)
{
return ERROR;
}
p->te.pertel = data->pertel;
p->te.comtel = data->comtel;
p->te.id = data->id;
strcpy(p->te.address,data->address);
strcpy(p->te.name,data->name);
p->next = NULL;
Node *tmp = pList->head;
while(tmp->next)
{
tmp = tmp->next;
}
tmp->next = p;
return TRUE;
}
BOOL Delete_Friend(List *pList)//删除联系人
{
if(NULL == pList)
{
return ERROR;
}
char deletename[20];//记录输入的字符串
printf("请输入要删除联系人的姓名:\n");
scanf("%s",deletename);
Node *tmp =pList->head;
DATA count = 0;//记录是否有同名的联系人
while(tmp->next)//第一次遍历看联系人姓名是否唯一
{
if(!(strcmp(tmp->next->te.name,deletename)))
{
count++;
}
tmp = tmp->next;
}
Node *lp = pList->head->next;
Node *tp = pList->head;
Node *mp = pList->head;
if(count >1)//如果不唯一
{
printf("有重名,请输入ID确认删除\n");
int deleteid = 0;//记录ID,通过ID删除
while(lp)
{
if(!(strcmp(lp->te.name,deletename)))//打印出相同姓名的联系人
{
printf("ID : %d\n",lp->te.id);
printf("姓名 : %s\n",lp->te.name);
printf("个人电话: %ld\n",lp->te.pertel);
printf("公司电话: %ld\n",lp->te.comtel);
printf("家庭住址: %s\n",lp->te.address);
}
lp = lp->next;
}
scanf("%d",&deleteid);//输入ID进行删除
while(mp->next)//通过ID删除
{
if(mp->next->te.id == deleteid)
{
Node *p = mp->next;
mp->next = p->next;
free(p);
printf("删除成功\n");
count_friend--;
return TRUE;
}
mp = mp->next;
}
}
else//联系人姓名唯一,直接进行删除
{
while(tp->next)
{
if(!(strcmp(tp->next->te.name,deletename)))
{
Node *p = tp->next;
tp->next = p->next;
free(p);
printf("删除成功\n");
count_friend--;
return TRUE;
}
tp = tp->next;
}
}
printf("未找到,删除失败\n");
return FALSE;
}
BOOL Find_Friend(List *pList)//查找联系人
{
if(NULL == pList)
{
return ERROR;
}
Node *tmp =pList->head->next;
char searchname[20];
printf("请输入要查找好友姓名:\n");
scanf("%s",searchname);
while(tmp!=NULL)
{
if(!(strcmp(tmp->te.name,searchname)))
{
printf("ID : %d\n",tmp->te.id);
printf("姓名: %s\n",tmp->te.name);
printf("个人电话: %ld\n",tmp->te.pertel);
printf("公司电话: %ld\n",tmp->te.comtel);
printf("家庭住址: %s\n",tmp->te.address);
return TRUE;
}
tmp = tmp->next;
}
printf("未找到\n");
return FALSE;
}
void Destory(List *pList)//释放空间
{
if(NULL==pList)
{
return ;
}
Node *tmp = pList->head;
while(tmp->next)
{
Node *p = tmp->next;
tmp->next = p->next;
free(p);
}
free(pList->head);
free(pList);
}
void Display(List *pList)//显示联系人
{
if(NULL==pList)
{
return ;
}
Node *tmp = pList->head->next;
while(tmp)
{
printf("ID : %d\n",tmp->te.id);
printf("姓名: %s\n",tmp->te.name);
printf("个人电话: %ld\n",tmp->te.pertel);
printf("公司电话: %ld\n",tmp->te.comtel);
printf("家庭住址: %s\n",tmp->te.address);
tmp = tmp->next;
}
printf("\n");
}
主函数:
#include <stdio.h>
#include "LinkList.h"
#include <string.h>
int main()
{
int com = 0;
List *l = CreateList();
Load_Friends(l);
while(1)
{
printf("\t**************\n");
printf("\t*1.添加好友信息*\n");
printf("\t*2.列表好友信息*\n");
printf("\t*3.搜索好友信息*\n");
printf("\t*4.删除好友信息*\n");
printf("\t*0. 退出通讯录 *\n");
printf("\t**************\n");
scanf("%d",&com);
switch(com)
{
case INSERT:
system("clear");
Insert_Friend(l);
break;
case DISPLAY:
system("clear");
Display(l);
break;
case SEARCH:
system("clear");
Find_Friend(l);
break;
case DELETE:
system("clear");
Delete_Friend(l);
break;
case QUIT:
Sava_Friends(l);
printf("谢谢使用!\n");
return ;
default:
printf("请输入正确的选项\n");
break;
}
}
return 0;
}