用〈〈数据结构〉〉中的双向链表作数据结构,结合C语言基本知识。编写一个通讯录管理系统。以把所学数据结构知识应用到实际软件开发中去。 设计内容:本系统应完成一下几方面的功能: 1) 输入信息——enter(); 2) 显示信息———display( ); 3) 查找以姓名作为关键字 ———search( ); 4) 删除信息———delete( ); 5) 存盘———save ( ); 6) 装入———load( ) ; 设计要求: 1) 每条信息至包含 :姓名(NAME )街道(STREET)城市(CITY)邮编(EIP)国家(STATE)几项 2) 作为一个完整的系统,应具有友好的界面和较强的容错能力
时间: 2023-10-24 21:04:37 浏览: 89
用双向链表做数据结构,编写一个通信录管理系统。
以下是一个使用双向链表实现的通讯录管理系统的示例代码,其中使用了C语言的基本知识:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 姓名最大长度
#define MAX_NAME_LENGTH 50
// 街道最大长度
#define MAX_STREET_LENGTH 100
// 城市最大长度
#define MAX_CITY_LENGTH 50
// 邮编最大长度
#define MAX_ZIP_LENGTH 10
// 国家最大长度
#define MAX_STATE_LENGTH 50
// 定义通讯录条目结构体
typedef struct AddressEntry {
char name[MAX_NAME_LENGTH];
char street[MAX_STREET_LENGTH];
char city[MAX_CITY_LENGTH];
char zip[MAX_ZIP_LENGTH];
char state[MAX_STATE_LENGTH];
struct AddressEntry *prev;
struct AddressEntry *next;
} AddressEntry;
// 定义全局变量,存储通讯录链表的头指针和尾指针
AddressEntry *head = NULL;
AddressEntry *tail = NULL;
// 将字符串拷贝到目标字符串中,并去除结尾的换行符
void copyString(char *dest, char *src, int maxLength) {
strncpy(dest, src, maxLength);
dest[maxLength - 1] = '\0';
char *pos = strchr(dest, '\n');
if (pos != NULL) {
*pos = '\0';
}
}
// 创建一个新的通讯录条目,并返回其指针
AddressEntry *createEntry() {
AddressEntry *entry = (AddressEntry *) malloc(sizeof(AddressEntry));
printf("请输入姓名:\n");
fgets(entry->name, MAX_NAME_LENGTH, stdin);
printf("请输入街道:\n");
fgets(entry->street, MAX_STREET_LENGTH, stdin);
printf("请输入城市:\n");
fgets(entry->city, MAX_CITY_LENGTH, stdin);
printf("请输入邮编:\n");
fgets(entry->zip, MAX_ZIP_LENGTH, stdin);
printf("请输入国家:\n");
fgets(entry->state, MAX_STATE_LENGTH, stdin);
entry->prev = NULL;
entry->next = NULL;
return entry;
}
// 将一个通讯录条目插入到链表中
void insertEntry(AddressEntry *entry) {
if (head == NULL) {
// 如果链表为空,则插入为第一个条目
head = entry;
tail = entry;
} else {
// 否则插入到链表尾部
entry->prev = tail;
tail->next = entry;
tail = entry;
}
}
// 显示所有通讯录条目
void display() {
if (head == NULL) {
printf("通讯录为空\n");
} else {
AddressEntry *current = head;
while (current != NULL) {
printf("姓名:%s\n", current->name);
printf("街道:%s\n", current->street);
printf("城市:%s\n", current->city);
printf("邮编:%s\n", current->zip);
printf("国家:%s\n", current->state);
printf("\n");
current = current->next;
}
}
}
// 查找通讯录条目
void search() {
printf("请输入要查找的姓名:\n");
char name[MAX_NAME_LENGTH];
fgets(name, MAX_NAME_LENGTH, stdin);
AddressEntry *current = head;
while (current != NULL) {
if (strcmp(current->name, name) == 0) {
printf("姓名:%s\n", current->name);
printf("街道:%s\n", current->street);
printf("城市:%s\n", current->city);
printf("邮编:%s\n", current->zip);
printf("国家:%s\n", current->state);
printf("\n");
return;
}
current = current->next;
}
printf("未找到该姓名的通讯录条目\n");
}
// 删除通讯录条目
void delete() {
printf("请输入要删除的姓名:\n");
char name[MAX_NAME_LENGTH];
fgets(name, MAX_NAME_LENGTH, stdin);
AddressEntry *current = head;
while (current != NULL) {
if (strcmp(current->name, name) == 0) {
if (current == head) {
// 如果要删除的是第一个条目,则更新头指针
head = current->next;
} else {
// 否则更新前一个条目的next指针
current->prev->next = current->next;
}
if (current == tail) {
// 如果要删除的是最后一个条目,则更新尾指针
tail = current->prev;
} else {
// 否则更新下一个条目的prev指针
current->next->prev = current->prev;
}
free(current);
printf("已删除该姓名的通讯录条目\n");
return;
}
current = current->next;
}
printf("未找到该姓名的通讯录条目\n");
}
// 存盘
void save() {
FILE *fp = fopen("addressbook.dat", "wb");
if (fp == NULL) {
printf("无法创建文件\n");
return;
}
AddressEntry *current = head;
while (current != NULL) {
fwrite(current, sizeof(AddressEntry), 1, fp);
current = current->next;
}
fclose(fp);
printf("已保存通讯录\n");
}
// 装入
void load() {
FILE *fp = fopen("addressbook.dat", "rb");
if (fp == NULL) {
printf("无法打开文件\n");
return;
}
AddressEntry *entry = (AddressEntry *) malloc(sizeof(AddressEntry));
while (fread(entry, sizeof(AddressEntry), 1, fp) == 1) {
insertEntry(entry);
entry = (AddressEntry *) malloc(sizeof(AddressEntry));
}
free(entry);
fclose(fp);
printf("已装入通讯录\n");
}
// 主函数
int main() {
int choice;
while (1) {
printf("请选择要进行的操作:\n");
printf("1. 输入信息\n");
printf("2. 显示信息\n");
printf("3. 查找信息\n");
printf("4. 删除信息\n");
printf("5. 存盘\n");
printf("6. 装入\n");
printf("7. 退出\n");
scanf("%d", &choice);
getchar();
switch (choice) {
case 1:
insertEntry(createEntry());
break;
case 2:
display();
break;
case 3:
search();
break;
case 4:
delete();
break;
case 5:
save();
break;
case 6:
load();
break;
case 7:
return 0;
default:
printf("无效的选项\n");
}
}
}
```
该通讯录管理系统使用双向链表存储通讯录条目,每个条目包含姓名、街道、城市、邮编和国家等信息。可以进行添加、显示、查找、删除、存盘和装入等操作。该系统具有友好的界面和较强的容错能力,可以有效地管理通讯录信息。
阅读全文