利用线性表实现一个通讯录管理,通信录的数据格式如下: struct DataType { int ID; //编号 char name[10]; //姓名 char ch; //性别 char phone[13]; //电话 char addr[31]; //地址 }; 要求: 实现通讯录的建立、增加、删除、修改、查询等功能 能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作。 能够保存每次更新的数据 能够进行通讯录分类,比如班级类、好友类、黑名单等等(选作) 编写测试 main()函数测试线性表的正确性。C+佳
时间: 2023-05-11 22:04:03 浏览: 111
好的,以下是我对于利用线性表实现通讯录管理的建议:
首先,我们可以使用链表来实现通讯录的管理。每个节点可以存储一个 DataType 类型的数据,包括编号、姓名、性别、电话和地址。链表的头节点可以作为通讯录的入口,我们可以在头节点后面插入新的节点来添加新的联系人,也可以通过遍历链表来查找、修改或删除联系人。
为了实现简单的菜单交互,我们可以使用 switch 语句来处理用户输入的命令。比如,用户输入 1 可以添加新的联系人,输入 2 可以查找联系人,输入 3 可以修改联系人信息,输入 4 可以删除联系人,输入 5 可以退出程序等等。每个命令对应一个函数,我们可以在 switch 语句中调用相应的函数来完成对应的操作。
为了保存每次更新的数据,我们可以将链表中的数据保存到文件中。每次程序启动时,我们可以读取文件中的数据来恢复通讯录。每次更新通讯录时,我们可以将链表中的数据写入文件中,以便下次启动程序时能够恢复最新的数据。
如果需要进行通讯录分类,我们可以在链表节点中添加一个分类字段,比如 class,用来表示联系人所属的分类。我们可以在菜单中添加一个选项,让用户选择不同的分类,然后在遍历链表时只显示对应分类的联系人。
最后,我们可以编写一个测试 main() 函数来测试线性表的正确性。我们可以在 main() 函数中添加一些测试用例,比如添加、查找、修改和删除联系人等等,以确保程序的正确性。
希望这些建议能够对你有所帮助!
相关问题
应用实验 利用线性表实现一个通讯录管理,通讯录的数据格式如下: struct DataType int ID; //编号 char name[10]; //姓名 char ch; //性别 char phone[13]; //电话 char addr[31]; //地址 要求: ·实现通讯录的建立、增加、删除、修改、查询等功能; ·能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作; ·能够保存每次更新的数据(选做); ·能够进行通讯录分类,比如班级类、好友类、黑名单等(选做); ·编写main()函数测试线性表的正确性。
以下是一个简单的通讯录管理程序的实现,使用线性表来存储通讯录数据:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 10
#define MAX_PHONE_LEN 13
#define MAX_ADDR_LEN 31
typedef struct {
int ID;
char name[MAX_NAME_LEN];
char ch;
char phone[MAX_PHONE_LEN];
char addr[MAX_ADDR_LEN];
} DataType;
typedef struct {
DataType *data;
int length;
int capacity;
} List;
void initList(List *list, int capacity) {
list->data = (DataType *)malloc(sizeof(DataType) * capacity);
list->length = 0;
list->capacity = capacity;
}
void destroyList(List *list) {
free(list->data);
list->data = NULL;
list->length = 0;
list->capacity = 0;
}
int insertList(List *list, int pos, DataType data) {
if (pos < 0 || pos > list->length) {
return 0;
}
if (list->length >= list->capacity) {
return 0;
}
for (int i = list->length - 1; i >= pos; i--) {
list->data[i + 1] = list->data[i];
}
list->data[pos] = data;
list->length++;
return 1;
}
int deleteList(List *list, int pos) {
if (pos < 0 || pos >= list->length) {
return 0;
}
for (int i = pos; i < list->length - 1; i++) {
list->data[i] = list->data[i + 1];
}
list->length--;
return 1;
}
int updateList(List *list, int pos, DataType data) {
if (pos < 0 || pos >= list->length) {
return 0;
}
list->data[pos] = data;
return 1;
}
int searchList(List *list, char *name) {
for (int i = 0; i < list->length; i++) {
if (strcmp(list->data[i].name, name) == 0) {
return i;
}
}
return -1;
}
void printList(List *list) {
printf("ID\tName\tSex\tPhone\t\tAddress\n");
for (int i = 0; i < list->length; i++) {
printf("%d\t%s\t%c\t%s\t%s\n", list->data[i].ID, list->data[i].name, list->data[i].ch, list->data[i].phone, list->data[i].addr);
}
}
void menu() {
printf("1. Add a contact\n");
printf("2. Delete a contact\n");
printf("3. Update a contact\n");
printf("4. Search a contact\n");
printf("5. Print all contacts\n");
printf("0. Exit\n");
}
int main() {
List list;
initList(&list, 100);
int choice = -1;
while (choice != 0) {
menu();
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1: {
DataType data;
printf("Enter ID: ");
scanf("%d", &data.ID);
printf("Enter name: ");
scanf("%s", data.name);
printf("Enter sex: ");
scanf(" %c", &data.ch);
printf("Enter phone: ");
scanf("%s", data.phone);
printf("Enter address: ");
scanf("%s", data.addr);
if (insertList(&list, list.length, data)) {
printf("Contact added successfully.\n");
} else {
printf("Failed to add contact.\n");
}
break;
}
case 2: {
char name[MAX_NAME_LEN];
printf("Enter name: ");
scanf("%s", name);
int pos = searchList(&list, name);
if (pos == -1) {
printf("Contact not found.\n");
} else {
if (deleteList(&list, pos)) {
printf("Contact deleted successfully.\n");
} else {
printf("Failed to delete contact.\n");
}
}
break;
}
case 3: {
char name[MAX_NAME_LEN];
printf("Enter name: ");
scanf("%s", name);
int pos = searchList(&list, name);
if (pos == -1) {
printf("Contact not found.\n");
} else {
DataType data;
printf("Enter ID: ");
scanf("%d", &data.ID);
printf("Enter name: ");
scanf("%s", data.name);
printf("Enter sex: ");
scanf(" %c", &data.ch);
printf("Enter phone: ");
scanf("%s", data.phone);
printf("Enter address: ");
scanf("%s", data.addr);
if (updateList(&list, pos, data)) {
printf("Contact updated successfully.\n");
} else {
printf("Failed to update contact.\n");
}
}
break;
}
case 4: {
char name[MAX_NAME_LEN];
printf("Enter name: ");
scanf("%s", name);
int pos = searchList(&list, name);
if (pos == -1) {
printf("Contact not found.\n");
} else {
printf("ID\tName\tSex\tPhone\t\tAddress\n");
printf("%d\t%s\t%c\t%s\t%s\n", list.data[pos].ID, list.data[pos].name, list.data[pos].ch, list.data[pos].phone, list.data[pos].addr);
}
break;
}
case 5: {
printList(&list);
break;
}
case 0: {
break;
}
default: {
printf("Invalid choice.\n");
break;
}
}
}
destroyList(&list);
return 0;
}
用C++语言利用线性表实现一个通讯录管理,通讯录的数据格式如下: struct DataType int ID; //编号 char name[10]; //姓名 char ch; //性别 char phone[13]; //电话 char addr[31]; //地址 要求: ·实现通讯录的建立、增加、删除、修改、查询等功能; ·能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作; ·能够保存每次更新的数据(选做); ·能够进行通讯录分类,比如班级类、好友类、黑名单等(选做); ·编写main()函数测试线性表的正确性。
以下是用C语言利用线性表实现通讯录管理的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct DataType {
int ID;
char name[10];
char ch;
char phone[13];
char addr[31];
} DataType;
typedef struct Node {
DataType data;
struct Node *next;
} Node, *LinkList;
LinkList InitList() {
LinkList L = (LinkList)malloc(sizeof(Node));
L->next = NULL;
return L;
}
int ListLength(LinkList L) {
int len = 0;
Node *p = L->next;
while (p) {
len++;
p = p->next;
}
return len;
}
void ListInsert(LinkList L, int i, DataType e) {
if (i < 1 || i > ListLength(L) + 1) {
printf("插入位置不合法!\n");
return;
}
Node *p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;
j++;
}
Node *s = (Node *)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
}
void ListDelete(LinkList L, int i) {
if (i < 1 || i > ListLength(L)) {
printf("删除位置不合法!\n");
return;
}
Node *p = L;
int j = 0;
while (p->next && j < i - 1) {
p = p->next;
j++;
}
Node *q = p->next;
p->next = q->next;
free(q);
}
void ListModify(LinkList L, int i, DataType e) {
if (i < 1 || i > ListLength(L)) {
printf("修改位置不合法!\n");
return;
}
Node *p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
p->data = e;
}
void ListSearch(LinkList L, char *name) {
Node *p = L->next;
while (p) {
if (strcmp(p->data.name, name) == 0) {
printf("编号:%d\n姓名:%s\n性别:%c\n电话:%s\n地址:%s\n", p->data.ID, p->data.name, p->data.ch, p->data.phone, p->data.addr);
return;
}
p = p->next;
}
printf("未找到该联系人!\n");
}
void ListPrint(LinkList L) {
Node *p = L->next;
while (p) {
printf("编号:%d\n姓名:%s\n性别:%c\n电话:%s\n地址:%s\n", p->data.ID, p->data.name, p->data.ch, p->data.phone, p->data.addr);
p = p->next;
}
}
void Menu() {
printf("**********通讯录管理系统**********\n");
printf("1. 建立通讯录\n");
printf("2. 增加联系人\n");
printf("3. 删除联系人\n");
printf("4. 修改联系人\n");
printf("5. 查询联系人\n");
printf("6. 显示所有联系人\n");
printf("0. 退出系统\n");
printf("************************************\n");
}
void SaveData(LinkList L) {
FILE *fp = fopen("data.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
Node *p = L->next;
while (p) {
fprintf(fp, "%d %s %c %s %s\n", p->data.ID, p->data.name, p->data.ch, p->data.phone, p->data.addr);
p = p->next;
}
fclose(fp);
}
void LoadData(LinkList L) {
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
DataType e;
while (fscanf(fp, "%d %s %c %s %s\n", &e.ID, e.name, &e.ch, e.phone, e.addr) != EOF) {
ListInsert(L, ListLength(L) + 1, e);
}
fclose(fp);
}
int main() {
LinkList L = InitList();
LoadData(L);
int choice;
do {
Menu();
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 1: {
DataType e;
printf("请输入联系人编号:");
scanf("%d", &e.ID);
printf("请输入联系人姓名:");
scanf("%s", e.name);
printf("请输入联系人性别:");
scanf(" %c", &e.ch);
printf("请输入联系人电话:");
scanf("%s", e.phone);
printf("请输入联系人地址:");
scanf("%s", e.addr);
ListInsert(L, ListLength(L) + 1, e);
printf("联系人添加成功!\n");
break;
}
case 2: {
DataType e;
printf("请输入联系人编号:");
scanf("%d", &e.ID);
printf("请输入联系人姓名:");
scanf("%s", e.name);
printf("请输入联系人性别:");
scanf(" %c", &e.ch);
printf("请输入联系人电话:");
scanf("%s", e.phone);
printf("请输入联系人地址:");
scanf("%s", e.addr);
ListInsert(L, ListLength(L) + 1, e);
printf("联系人添加成功!\n");
break;
}
case 3: {
int i;
printf("请输入要删除的联系人编号:");
scanf("%d", &i);
ListDelete(L, i);
printf("联系人删除成功!\n");
break;
}
case 4: {
int i;
DataType e;
printf("请输入要修改的联系人编号:");
scanf("%d", &i);
printf("请输入联系人姓名:");
scanf("%s", e.name);
printf("请输入联系人性别:");
scanf(" %c", &e.ch);
printf("请输入联系人电话:");
scanf("%s", e.phone);
printf("请输入联系人地址:");
scanf("%s", e.addr);
ListModify(L, i, e);
printf("联系人修改成功!\n");
break;
}
case 5: {
char name[10];
printf("请输入要查询的联系人姓名:");
scanf("%s", name);
ListSearch(L, name);
break;
}
case 6: {
ListPrint(L);
break;
}
case 0: {
SaveData(L);
printf("谢谢使用!\n");
break;
}
default: {
printf("输入有误,请重新输入!\n");
break;
}
}
} while (choice != 0);
return 0;
}
阅读全文