📄 7-4.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct address /* 通讯录信息结构 */
{
char name[24];
char tele[24];
struct address *next;
} ADDR;
void displayMenu();
int choiceItem();
void freeRecord(ADDR *head);
ADDR *addRecord(ADDR *head);
ADDR *createRecord(ADDR *head);
ADDR *deleteRecord(ADDR *head);
void searchRecord(ADDR *head);
void saveFile(ADDR *head);
ADDR *readFile( );
void display(ADDR *head);
main( )
{
ADDR *head = NULL; /* 表头指针 */
int choice;
clrscr( );
do {
choice = choiceItem( ); /* 菜单选择 */
switch (choice) {
case 1: head = createRecord(head ); /* 创建通讯录 */
break;
case 2: head = addRecord(head); /* 添加记录 */
break;
case 3: head = deleteRecord(head); /* 删除记录 */
break;
case 4: searchRecord(head); /* 查找记录 */
break;
case 5: display(head); /* 显示通讯录 */
break;
case 6: saveFile(head); /* 保存到文件 */
break;
case 7: head = readFile( ); /* 从文件读通讯录数据 */
break;
}
} while(choice!=0);
printf( "\n\nBye!");
freeRecord(head);
}
void displayMenu(void) /* 显示菜单 */
{
printf("\n============= MENU =============\n");
printf("\n 1 .........Create New Record\n ");
printf("\n 2 .........Add Record \n");
printf("\n 3..........Delete Record \n");
printf("\n 4..........Search Record \n");
printf("\n 5..........Display Record \n");
printf("\n 6..........Save to File \n");
printf("\n 7..........Read from File \n");
printf("\n 0..........Exit System \n ");
printf("\nChoice:");
}
int choiceItem(void) /* 菜单选择 */
{
int choice;
char line[80];
do{
displayMenu( );
gets(line);
choice = atoi(line);;
} while(choice<0 || choice>7);
return choice;
}
void freeRecord(ADDR *p) /* 释放链表结点 */
{
ADDR *q;
while (p!=NULL) {
q = p;
p = p->next;
free(q); /* 依次释放各结点 */
}
}
ADDR *addRecord(ADDR *p) /* 输入一组记录,添加到链表中 */
{
ADDR head, *q;
head.next = p;
p = &head;
while (p->next!=NULL) /* 将当前指针移动到链表尾端 */
p = p->next;
while(1) {
char text[80];
q = (ADDR *)malloc(sizeof(ADDR));
if (q==NULL)
return head.next;
q->next = NULL;
printf("\n\nPlease enter the name and telephone number: ");
gets(text); /* 读取一行文本 */
if (text[0]=='\0') break; /* 空行为结束标志 */
sscanf(text, "%s%s", q->name, q->tele); /* 分解名称和电话号码 */
p->next = q; /* 在链表尾端添加结点 */
p = q; /* 更新当前指针 */
}
return head.next;
}
ADDR *createRecord(ADDR *p) /* 创建新通讯录 */
{
freeRecord(p); /* 释放原链表所占空间 */
return addRecord(NULL); /* 输入一组记录,创建链表 */
}
ADDR *deleteRecord(ADDR *p) /* 根据输入的姓名删除记录 */
{
char name[32];
ADDR *q, head; /* 前驱结点 */
printf("\nPlease input the Name for deletion: ");
gets(name); /* 输入姓名 */
for (head.next=p, q=&head; p!=NULL; p=p->next) {
if (strcmp(p->name, name)!=0) /* 不等于当前结点中的姓名 */
q = p; /* 以当前结点作为前驱结点 */
else {
q->next = p->next; /* 从链表中移出当前结点 */
free(p); /* 释放当前结点 */
printf("\nThe %s has been deleted.\n", name);
return head.next;
}
}
printf("\nNo record of %s\n", name);
return head.next;
}
void searchRecord(ADDR *p) /* 通过输入的姓名查询记录 */
{
char name[32];
printf("\nPlease input the name for Search: ");
gets(name); /* 输入姓名 */
for (; p!=NULL; p=p->next) {
if (strcmp(p->name, name)==0) { /* 找到指定的记录 */
printf("\nName\tTelephone\n%s\t%s\n", p->name, p->tele);
return;
}
}
printf("\nNo record of %s\n", name);
}
void saveFile(ADDR *p) /* 将记录信息写入文件 */
{
FILE *fp;
char fname[32];
printf("\nPlease input the FileName: ");
gets(fname); /* 输入文件名 */
if ((fp = fopen(fname, "wb"))==NULL) { /* 打开文件 */
printf("Cannot open this file!\n");
return;
}
printf("\nSave File...");
for (; p!=NULL; p=p->next) /* 遍历链表 */
fwrite(p, sizeof(ADDR), 1, fp); /* 写一个记录到文件 */
fclose(fp);
printf("OK\n");
}
ADDR *readFile(void) /* 从文件中读取记录信息 */
{
ADDR *p, *q, head = { "","", NULL };
FILE *fp;
char fname[32];
printf("\nPlease input the FileName: ");
gets(fname); /* 输入文件名*/
if ((fp=fopen(fname, "rb")) == NULL) { /* 打开文件 */
printf("Cannot open this file!\n");
return NULL;
}
printf("\nRead File...");
q = &head; /* 尾端结点指针 */
while(!feof(fp)) { /* 读结束? */
p = (ADDR *)malloc(sizeof(ADDR));
if (p==NULL)
break;
p->next = NULL;
if (1!=fread(p, sizeof(ADDR), 1, fp))
break; /* 读失败时 */
q->next = p; /* 在链表尾端添加 */
q = p; /* 更新尾端指针 */
}
fclose(fp); /* 关闭文件 */
printf("OK\n");
return head.next;
}
void display(ADDR *p) /* 显示所有记录信息 */
{
printf("\nName\tTelephone\n");
for (; p!=NULL; p=p->next)
printf("%s\t%s\n", p->name, p->tele);
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -