用c语言写一个顺序表实现一个电话号码本的功能,至少要包括,录入,删除,按使用频率排序,列出(显示全部),根据姓名查找号码,根据号码查找姓名等功能。
时间: 2024-11-30 07:22:08 浏览: 48
在 C 语言中,我们可以使用结构体和指针来实现一个简单的顺序表电话簿。下面是一个简化的示例,展示了如何实现基本功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义电话簿结构体
typedef struct {
char name[50];
char number[20];
int freq; // 使用频率计数
} PhoneBookEntry;
// 初始化顺序表
PhoneBookEntry* createPhoneBook() {
return malloc(sizeof(PhoneBookEntry));
}
// 录入新条目
void addEntry(PhoneBookEntry** phoneBook, char* name, char* number) {
PhoneBookEntry* newEntry = createPhoneBook();
strcpy(newEntry->name, name);
strcpy(newEntry->number, number);
newEntry->freq = 0;
*phoneBook = (PhoneBookEntry*)realloc(*phoneBook, sizeof(PhoneBookEntry) + sizeof(PhoneBookEntry)); // 扩展列表
(*phoneBook)[*(phoneBook)->size++] = *newEntry; // 添加到列表末尾
}
// 删除条目
void deleteEntry(PhoneBookEntry** phoneBook, char* name) {
for (int i = 0; i < (*phoneBook)->size; ++i) {
if (!strcmp((*phoneBook)->entries[i].name, name)) { // 检查名称是否匹配
memmove(&(*phoneBook)->entries[i], &(*phoneBook)->entries[i+1], sizeof(PhoneBookEntry) * ((*phoneBook)->size - i - 1));
free(*phoneBook-1]);
(*phoneBook)->size--;
break;
}
}
}
// 计算频率并更新
void updateFreq(PhoneBookEntry** phoneBook, char* name) {
for (int i = 0; i < (*phoneBook)->size; ++i) {
if (!strcmp((*phoneBook)->entries[i].name, name)) {
(*phoneBook)->entries[i].freq++;
break;
}
}
}
// 按使用频率排序
void sortByFrequency(PhoneBookEntry** phoneBook) {
qsort(phoneBook->entries, (*phoneBook)->size, sizeof(PhoneBookEntry), compareByFrequency); // 自定义比较函数
}
// 显示所有条目
void displayEntries(const PhoneBookEntry* entries, int size) {
for (int i = 0; i < size; ++i) {
printf("Name: %s, Number: %s, Frequency: %d\n", entries[i].name, entries[i].number, entries[i].freq);
}
}
// 根据姓名查找号码
char* findNumberByName(const PhoneBookEntry* entries, int size, char* name) {
for (int i = 0; i < size; ++i) {
if (!strcmp(entries[i].name, name)) {
return entries[i].number;
}
}
return NULL;
}
// 根据号码查找姓名
char* findNameByNumber(const PhoneBookEntry* entries, int size, char* number) {
for (int i = 0; i < size; ++i) {
if (!strcmp(entries[i].number, number)) {
return entries[i].name;
}
}
return NULL;
}
// 辅助比较函数,用于排序
int compareByFrequency(const void* a, const void* b) {
return ((const PhoneBookEntry*)b)->freq - ((const PhoneBookEntry*)a)->freq;
}
// 清理内存
void destroyPhoneBook(PhoneBookEntry** phoneBook) {
for (int i = 0; i < (*phoneBook)->size; ++i) {
free((*phoneBook)->entries[i]);
}
free(*phoneBook);
*phoneBook = NULL;
}
int main() {
// 初始化一个空的电话簿
PhoneBookEntry* phoneBook = createPhoneBook();
// ... 使用上述函数添加、删除和操作电话簿
destroyPhoneBook(&phoneBook);
return 0;
}
```
注意这只是一个简化版的例子,实际应用中可能需要更完善的错误处理和数据结构优化。以下是几个相关的
阅读全文