本系统实现在控制台对通讯录信息进行管理
具体代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义结构体
typedef struct Info{
char name[20];//姓名
char telphone[20];//电话
char city[20];//城市
char province[20];//省份
char country[20];//国家
};
//结点
typedef struct Node{
struct Info data;
struct Node *next;
}Node,*LinkNode;
/*
判断数组是否越界
*/
void stringInput(char *c,int n,char *input){
char s[50];
do{
printf(input);
scanf("%s",s);
if (strlen(s) > n)
printf("输入的字符超过指定的长度,请重新输入\n");
} while (strlen(s) > n);
strcpy(c,s);
}
/*
插入记录
*/
void enter(LinkNode l)
{
Node *p, *q;//q代表头结点,p带表要插入的结点
q = l ;
while (1)
{
p = (LinkNode)malloc(sizeof(Node));
if (!p)
{
printf("系统分配内存空间失败\n");
return;
}
stringInput(p->data.name,20,"请输入姓名:\n");
if (strcmp(p->data.name, "0")==0)
break;
stringInput(p->data.telphone, 20, "请输入电话:\n");
stringInput(p->data.city, 20, "请输入城市:\n");
stringInput(p->data.province, 20, "请输入省份:\n");
stringInput(p->data.country, 20, "请输入国家:\n");
p->next = NULL;
q->next = p;
q = p ;
}
}
/*
显示全部通讯录记录
*/
void show(LinkNode l){
Node *p;
p = l->next;//链表的第二条结点才有数据
if (p == NULL)
{
printf("通讯录没有记录啦\n");
getchar();
system("pause");
return;
}
while (p != NULL)
{
printf("姓名:%s", p->data.name);
printf("电话:%s", p->data.telphone);
printf("城市:%s", p->data.city);
printf("省份:%s", p->data.province);
printf("国家:%s\n", p->data.country);
p = p->next;
}
getchar();
system("pause");
}
/*
删除通讯录里面的记录
*/
void deleteRow(LinkNode l)
{
Node *p, *q;
q = l;
p = q->next;//第二条记录才有数据
if (p == NULL)
{
printf("通讯录没有记录啦\n");
getchar();
system("pause");
return;
}
while(p != NULL)
{
char s[20];
printf("请输入要删除的记录的姓名\n");
scanf("%s",s);
if (strcmp(p->data.name, s) == 0)
{
q->next = p->next;
free(p);
printf("删除成功!");
return;
}
else
{
q = p;
p = q->next;
}
}
getchar();
system("pause");
}
/*
查找记录
*/
void find(LinkNode l)
{
char s[50];
printf("请输入你要查找的姓名或者电话号码\n");
scanf("%s",s);
Node *p;
p = l->next;//链表的第二条结点才有数据
if (p == NULL)
{
printf("通讯录没有记录啦\n");
getchar();
system("pause");
return;
}
while (p != NULL)
{
if (strcmp(p->data.name, s) == 0 || strcmp(p->data.telphone, s) == 0)
{
printf("找到啦,详细信息如下:\n");
printf("姓名:%s", p->data.name);
printf("电话:%s", p->data.telphone);
printf("城市:%s", p->data.city);
printf("省份:%s", p->data.province);
printf("国家:%s\n", p->data.country);
}
p = p->next;
}
getchar();
system("pause");
}
/*
将通讯录保存到文件中去
*/
void saveFile(LinkNode l)
{
FILE *fp;
fp = fopen("1.txt", "a+");
if (fp == NULL)
{
printf("文件无法打开\n");
return;
}
Node *p;
p = l->next;
while (p != NULL)
{
fwrite(p, sizeof(Node), 1, fp);
//fprintf(fp, "姓名:%s电话号码:%s城市:%s省份:%s国家:%s", p->data.name, p->data.telphone, p->data.city, p->data.province, p->data.country);
p = p->next;
}
fclose(fp);
printf("保存记录成功");
getchar();
system("pause");
}
/*
充文件中读取记录
*/
void readFile(LinkNode l)
{
Node *p, *q;
FILE *fp;
fp = fopen("1.txt","r");
if (fp == NULL)
{
printf("文件无法打开\n");
return;
}
q = l;
while (!feof(fp))
{
p = (LinkNode)malloc(sizeof(Node));
if (!p)
{
printf("系统分配内存空间失败\n");
return;
}
if (fread(p, sizeof(Node), 1, fp) != 1)
break;
//fscanf(fp, "%s%s%s%s%s", p->data.name, p->data.telphone, p->data.city, p->data.province, p->data.country);
p->next = NULL;
q->next = p;
q = p;
}
fclose(fp);
printf("读取记录成功");
getchar();
system("pause");
}
/*
系统目录
*/
int menu_select(){
int i;
printf("\n\n\t**********************通讯录***************************\n");
printf("\t|* 1 输入记录 *|\n");
printf("\t|* 2 删除记录 *|\n");
printf("\t|* 3 表记录 *|\n");
printf("\t|* 4 查找记录 *|\n");
printf("\t|* 5 保存记录 *|\n");
printf("\t|* 6 读取记录 *|\n");
printf("\t|* 7 退出 *|\n");
printf("\t*******************************************************\n");
do{
printf("\n\t请输入你的选择:");
scanf("%d",&i);
} while (i<0 || i>7);
return i;
}
int main()
{
LinkNode l;
l = (LinkNode)malloc(sizeof(Node));
if (!l)
{
printf("系统分配内存空间失败\n");
return -1;
}
l->next = NULL;
system("cls");
while (1){
system("cls");
switch (menu_select()){
case 1:
enter(l);
break;
case 2:
deleteRow(l);
break;
case 3:
show(l);
break;
case 4:
find(l);
break;
case 5:
saveFile(l);
break;
case 6:
readFile(l);
break;
case 7:
exit(0);
break;
}
}
system("pause");
return 0;
}