#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef int ElemType;
typedef struct {
char name[10]; //姓名
char road[10]; //街道
char city[10]; //城市
char code[10]; //邮编
char country[10]; //国家
}person;
typedef struct node {
person data; //数据域
struct node* prior; //前驱
struct node* next; //后继
}ListNode, * LinkList;
LinkList InitList(); //构造一个空的线性表
LinkList Create(LinkList head); //创建线性表
void Enter(LinkList head); //输入。。。
void Display(LinkList head); //显示。。。
void Search(LinkList head); //查找。。。
void Delete(LinkList head); //删除...
void Save(LinkList head); //存盘。。。
void Load(LinkList head); //装入
void Menu(LinkList head); //显示主菜单页面
LinkList InitList()
{
LinkList head = (LinkList)malloc(sizeof(ListNode)); //创建头节点
if (head == NULL)
{
printf("\n建立链表失败!\n");
exit(-1); //退出程序
}
head->next = NULL;
head->prior = NULL;
return head;
}
LinkList Create(LinkList head)
{
person LM; //定义一个person类型的数据LM /////////
LinkList rear; /////////
rear = head; /////////
FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\学生信息.txt", "r"); //以文本只读打开文件
if (fp == NULL)
{
printf("\n文件打开失败!\n");
return NULL;
}
while (fscanf(fp, "%s%s%s%s%s", LM.name, LM.road, LM.city, LM.code, LM.country) != EOF) //从文件读入,处理到文件尾
{
LinkList s = (LinkList)malloc(sizeof(ListNode));
s->data = LM;
s->prior = NULL;
s->next = NULL;
rear->next = s;
s->prior = rear;
rear = rear->next;
}
fclose(fp);
return head;
}
void Save(LinkList head)
{
LinkList rear;
person LM;
rear = head->next;//跳过头节点
FILE* fp;
int i;
if ((fp = fopen("C:\\Users\\Lenovo\\Desktop\\学生信息.txt", "wb")) == NULL)/*只打开或建立一个二进制文件,只允许写数据*/
{
printf("\n文件不存在!\n");
}
while (rear)//处理到文件尾
{
LM = rear->data;
fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", LM.name, LM.road, LM.city, LM.code, LM.country);
rear = rear->next;
}
fclose(fp);
}
void Enter(LinkList head) //输入
{
person LM;
char c;
LinkList p = head;
printf("姓名 街道 城市 邮编 国家\n");
scanf_s("%s", LM.name);
scanf_s("%s", LM.road);
scanf_s("%s", LM.city);
scanf_s("%s", LM.code);
scanf_s("%s", LM.country);
LinkList s = (LinkList)malloc(sizeof(ListNode));
s->data = LM;
s->next = p->next;
s->next->prior = s;
s->prior = p;
while (p->next)
{
p = p->next;
}
p->next = s;
Save(head); //调用存盘函数
printf("\n返回主菜单!\n");
system("pause");
Menu(head);
}
void Display(LinkList head) //显示所有的信息
{
LinkList p;
p = head->next;
if (!p) //如果p为空,说明head指针为空,即链表为空
{
printf("\n线性表为空!\n");
printf("请先输入人员信息!\n");
}
else
{
printf("通讯录:\n");
printf("姓名 街道 城市 邮编 国家 \n");
while (p)
{
printf("%s\t%s\t%s\t%s\t%s\n", p->data.name, p->data.road, p->data.city, p->data.code, p->data.country);
p = p->next;
}
printf("\n返回主菜单!\n");
system("pause"); //页面暂时停留
Menu(head);
}
}
void Search(LinkList head) //查找
{
int flag = 0;
char name[10];
printf("\n请输入要查询的联系人的姓名:");
scanf_s("%s", name);
LinkList rear = head->next;
while (rear)
{
if (strcmp(name, rear->data.name) == 0)
{
printf("姓名 街道 城市 邮编 国家 \n");
printf("%s\t%s\t%s\t%s\t%s\n", rear->data.name, rear->data.road, rear->data.city, rear->data.code, rear->data.country);
flag = 1;
}
rear = rear->next;
}
if (flag == 1)
{
printf("\n成功找到该联系人!接下来将返回菜单:\n");
system("pause");
Menu(head);
}
else
{
printf("\n没有这位联系人!\n");
system("pause");
Menu(head);
}
}
void Delete(LinkList head)
{
LinkList rear = head; //找到需要删除节点的前一个节点
LinkList p = rear->next; //找到需要删除的节点
char name[10];
int flag = 0;
int n;
printf("请输入要删除的联系人的姓名:\n");
scanf_s("%s", name);
printf("\n");
while (p)
{
if (strcmp(p->data.name, name) == 0)
{
rear->next = p->next; //删除P节点
free(p);
Save(head);
flag = 1;
}
rear = p;
p = p->next;
}
if (flag == 1)
{
printf("\n已成功删除该联系人!\n");
printf("接下来将返回菜单\n");
system("pause");
Menu(head);
}
else
{
printf("\n没有这个联系人!\n");
printf("接下来将返回菜单\n");
system("pause");
Menu(head);
}
}
void Load(LinkList head) //装入,读文件
{
FILE* fp = fopen("D:\\王晴\\学习\\大二\\数据结构\\数据结构课程设计\\通讯录.txt", "r");
if (fp == NULL); //打开一个只允许写的二进制文件
{
printf("\n文件不存在!\n");
exit(0);
}
char ch;
while ((ch = fgetc(fp)) != EOF)
{
printf("%c", ch);
}
fclose(fp);
printf("\n已成功打开文件所有信息!\n");
printf("接下来将返回菜单\n");
system("pause");
Menu(head);
}
void Quit(LinkList head)
{
printf("\n欢迎下次再来!\n");
}
void Menu(LinkList head) //输出菜单
{
int n;
int flag = 0;
do {
printf("-----------------------------------------------------\n");
printf("---------------->>通讯管理系统<<---------------------\n");
printf("--------------------->>主菜单<<----------------------\n");
printf("-----------------------------------------------------\n");
printf("* 1、输入联系人信息 * 2、显示联系人信息 *\n");
printf("-----------------------------------------------------\n");
printf("* 3、查找联系人信息 * 4、删除联系人信息 *\n");
printf("-----------------------------------------------------\n");
printf("* 5、存盘 * 6、装入 *\n");
printf("-----------------------------------------------------\n");
printf("* 7、退出系统 * *\n");
printf("-----------------------------------------------------\n");
printf("\n请输入菜单编号:\n");
scanf_s("%d", &n);
if (n < 1 || n>7)
{
system("cls");
printf("选择错误! 请重新选择!\n");
system("pause");
flag = 1;
}
else
{
break;
}
} while (flag == 1);
switch (n)
{
case 1:Enter(head); break;
case 2:Display(head); break;
case 3:Search(head); break;
case 4:Delete(head); break;
case 5:Save(head); break;
case 6:Load(head); break;
case 7:Quit(head); break;
default:printf("输入有误!");
}
}
int main()
{
LinkList head = InitList();
head = Create(head);
Menu(head);
return 0;
}