顺序表项目实战(基于动态顺序表实现通讯录)

简介: 顺序表项目实战(基于动态顺序表实现通讯录)

实现一个基于动态顺序表的通讯录可以是一个很好的顺序表项目实战。动态顺序表是指在顺序表基础上实现了动态扩容和缩容功能,使得其大小可以动态变化,更加灵活和高效。

1.基于动态顺序表实现通讯录

C语言基础要求:结构体、动态内存管理、顺序表、文件操作。

功能要求

  1. 功能要求
  2. 至少能够存储100个人的通讯信息
  3. 能够保存用户信息:名字、性别、年龄、电话、地址等
  4. 增加联系人信息
  5. 删除指定联系人
  6. 查找制定联系人
  7. 修改指定联系人
  8. 显示联系人信息

2.代码实现

main.c

#include"SeqList.h"  
#include"contact.h"  
void menu() {  
    //通讯录初始化  
    contact con;  
    InitContact(&con);  
    int op = -1;  
    do {  
        printf("********************************\n");  
        printf("*****1、添加用户 2、删除用户*****\n");  
        printf("*****3、查找用户 4、修改用户*****\n");  
        printf("*****5、展示用户 0、退出 *****\n");  
        printf("********************************\n");  
        printf("请选择您的操作:\n");  
        scanf("%d", &op);  
        switch (op)  
        {  
            case 1:  
                AddContact(&con);  
            break;  
            case 2:  
                DelContact(&con);  
            break;  
            case 3:  
                FindContact(&con);  
            break;  
            case 4:  
                ModifyContact(&con);  
            break;  
            case 5:  
                ShowContact(&con);  
            break;  
            default:  
                printf("输入有误,请重新输入\n");  
            break;  
        }  
    } while (op!=0);  
    //销毁通讯录  
    DestroyContact(&con);  
}

contact.c

#include "contact.h"  
#define _CRT_SECURE_NO_WARNINGS  
#include"contact.h"  
#include"SeqList.h"  
void LoadContact(contact* con) {  
    FILE* pf = fopen("contact.txt", "rb");  
    if (pf == NULL) {  
        perror("fopen error!\n");  
        return;  
    }  
    //循环读取文件数据  
    PeoInfo info;  
    while (fread(&info,sizeof(PeoInfo),1,pf))  
    {  
        SeqListPushBack(con, info);  
    }printf("历史数据导入通讯录成功!\n");  
}  
void InitContact(contact* con) {  
    SeqListInit(con);  
    LoadContact(con);  
}  
void AddContact(contact* con) {  
    PeoInfo info;  
    printf("请输入姓名:\n");  
    scanf("%s", &info.name);  
    printf("请输入性别:\n");  
    scanf("%s", &info.sex);  
    printf("请输入年龄:\n");  
    scanf("%d", &info.age);  
    printf("请输入联系电话:\n");  
    scanf("%s", &info.tel);  
    printf("请输入地址:\n");  
    scanf("%s", &info.addr);  
    SeqListPushBack(con, info);  
    printf("插入成功!\n");  
}  
int FindByName(contact* con, char name[]) {  
    for (int i = 0; i < con->size; i++)  
    {  
        if (0 == strcmp(con->a[i].name, name)) {  
            return i;  
        }  
    }  
    return -1;  
}  
void DelContact(contact* con){  
    char name[NAME_MAX];  
    printf("请输入要删除的用户姓名:\n");  
    scanf("%s", name);  
    int pos = FindByName(con, name);  
    if (pos < 0) {  
        printf("要删除的用户不存在,删除失败!\n");  
        return;  
    }  
    SeqListErase(con, pos);  
    printf("删除成功!\n");  
}  
void ShowContact(contact* con){  
    printf("%-10s %-4s %-4s %15s %-20s\n", "姓名", "性别", "年龄", "联系电  
    话", "地址");  
    for (int i = 0; i < con->size; i++)  
    {  
    printf("%-10s %-4s %-4d %15s %-20s\n",  
    con->a[i].name,  
    con->a[i].sex,  
    con->a[i].age,  
    con->a[i].tel,  
    con->a[i].addr);  
    }  
    }  
void FindContact(contact* con){  
    char name[NAME_MAX];  
    printf("请输入要查找的用户姓名:\n");  
    scanf("%s", name);  
    int pos = FindByName(con, name);  
    if (pos < 0) {  
        printf("要查找的用户不存在,查找失败!\n");  
        return;  
    }  
    printf("查找成功!\n");  
    printf("%-10s %-4s %-4d %15s %-20s\n",  
    con->a[pos].name,  
    con->a[pos].sex,  
    con->a[pos].age,  
    con->a[pos].tel,  
    con->a[pos].addr);  
}  
void ModifyContact(contact* con) {  
    char name[NAME_MAX];  
    printf("请输入要修改的用户名称:\n");  
    scanf("%s", name);  
    int pos = FindByName(con, name);  
    if (pos < 0) {  
        printf("要查找的用户不存在,修改失败!\n");  
        return;  
    }  
    PeoInfo info;  
    printf("请输入要修改的姓名:\n");  
    scanf("%s", &con->a[pos].name);  
    printf("请输入要修改的性别:\n");  
    scanf("%s", &con->a[pos].sex);  
    printf("请输入要修改的年龄:\n");  
    scanf("%d", &con->a[pos].age);  
    printf("请输入要修改的联系电话:\n");  
    scanf("%s", &con->a[pos].tel);  
    printf("请输入要修改的地址:\n");  
    scanf("%s", &con->a[pos].addr);  
    printf("修改成功!\n");  
}  
void SaveContact(contact* con) {  
    FILE* pf = fopen("contact.txt", "wb");  
    if (pf == NULL) {  
        perror("fopen error!\n");  
        return;  
    }  
    //将通讯录数据写入文件  
    for (int i = 0; i < con->size; i++)  
    {  
        fwrite(con->a + i, sizeof(PeoInfo), 1, pf);  
    }  
    printf("通讯录数据保存成功!\n");  
}  
void DestroyContact(contact* con) {  
    SaveContact(con);  
    SeqListDesTroy(con);  
}

contact.h

#ifndef CONTACT_H  
#define CONTACT_H  
#endif //CONTACT_H  
#pragma once  
#define NAME_MAX 100  
#define SEX_MAX 4  
#define TEL_MAX 11  
#define ADDR_MAX 100  
typedef struct SeqList contact;  
//用户数据  
typedef struct PersonInfo  
{  
    char name[NAME_MAX];  
    char sex[SEX_MAX];  
    int age;  
    char tel[TEL_MAX];  
    char addr[ADDR_MAX];  
}PeoInfo;  
//初始化通讯录  
void InitContact(contact* con);  
//添加通讯录数据  
void AddContact(contact* con);  
//删除通讯录数据  
void DelContact(contact* con);  
//展示通讯录数据  
void ShowContact(contact* con);  
//查找通讯录数据  
void FindContact(contact* con);  
//修改通讯录数据  
void ModifyContact(contact* con);  
//销毁通讯录数据  
void DestroyContact(contact* con);

Seqlist.h

#ifndef SEQLIST_H  
#define SEQLIST_H  
  
#endif //SEQLIST_H  
  
#pragma once  
#define _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>  
#include<assert.h>  
#include<stdlib.h>  
#include"contact.h"  
//数据类型为PersonInfo  
typedef struct PersonInfo SQDataType;  
//typedef int SQDataType;  
//动态顺序表  
typedef struct SeqList {  
    SQDataType* a;  
    int size;//保存有效数据个数  
    int capacity;//空间的大小  
}SLT;  
//初始化与销毁  
void SeqListInit(SLT* psl);  
void SeqListDesTroy(SLT* psl);  
void SeqListPrint(SLT sl);  
void CheckCapacity(SLT* psl);  
// 头部插入删除 / 尾部插入删除  
void SeqListPushBack(SLT* psl, SQDataType x);  
void SeqListPushFront(SLT* psl, SQDataType x);  
void SeqListPopBack(SLT* psl);  
void SeqListPopFront(SLT* psl);  
//查找  
int SeqListFind(SLT* psl, SQDataType x);  
// 在指定位置之前插入/删除  
//void SeqListInsert(SLT* psl, int pos, SQDataType x);  
void SeqListInsert(SLT* psl, size_t pos, SQDataType x);  
void SeqListErase(SLT* psl, size_t pos);  
size_t SeqListSize(SLT* psl);  
//修改指定位置的值  
void SeqListAt(SLT* psl, size_t pos, SQDataType x);
相关文章
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
1044 9
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
3491 6
|
监控 数据挖掘 关系型数据库
结构化思维的理解与思考
结构化思维是一种将信息要素从无效转化为有序,提炼核心要点,将信息转化为有结构的知识,更好的帮助大脑理解和记忆,并支持我们清晰表达的通用能力。
1621 2
结构化思维的理解与思考
|
机器学习/深度学习 人工智能 数据挖掘
机器学习基础:使用Python和Scikit-learn入门
【10月更文挑战第6天】在人工智能领域,机器学习已成为核心技术。本文指导初学者使用Python与Scikit-learn入门机器学习,涵盖基本概念、环境搭建、数据处理、模型训练及评估等环节。Python因简洁性及其生态系统成为首选语言,而Scikit-learn则提供了丰富工具,简化数据挖掘与分析流程。通过实践示例,帮助读者快速掌握基础知识,为进一步深入研究奠定坚实基础。
165 4
|
存储 Go
带你入门 Go 语言中的泛型编程
带你入门 Go 语言中的泛型编程
188 0
|
机器学习/深度学习 人工智能 物联网
未来操作系统的发展趋势与挑战
随着科技的不断进步,操作系统作为计算机系统的核心,也在不断演化和发展。本文从人工智能、物联网、云计算等方面探讨了未来操作系统的发展趋势和面临的挑战,展望了操作系统在技术革新中的重要地位。
|
SQL 存储 关系型数据库
mysql 利用 performance_schema 排查 qps 过高过程记录
mysql 利用 performance_schema 排查 qps 过高过程记录
636 0
|
存储 Web App开发 数据可视化
在线协作文档综合评测 :Notion、FlowUs、Wolai、飞书、语雀、微软 Office、谷歌文档、金山文档、腾讯文档、石墨文档、Dropbox Paper、坚果云文档、百度网盘在线文档
在线协作文档综合评测 :Notion、FlowUs、Wolai、飞书、语雀、微软 Office、谷歌文档、金山文档、腾讯文档、石墨文档、Dropbox Paper、坚果云文档、百度网盘在线文档 如今,在线协作文档已经成为效率办公的必备产品。然而,面临各种各样的在线文档产品,应该如何选择呢?
4138 0
在线协作文档综合评测 :Notion、FlowUs、Wolai、飞书、语雀、微软 Office、谷歌文档、金山文档、腾讯文档、石墨文档、Dropbox Paper、坚果云文档、百度网盘在线文档
|
存储 编译器 C++
new后可以用free吗
new后可以用free吗
217 0
|
存储 测试技术 C语言
【数据结构】顺序表详解 | 从零开始步步解读 | 画图理解并调试分析
本章节将对顺序表的概念进行介绍,着重讲解动态顺序表。对常用的接口函数进行一个个讲解,并进行解析。顺序表讲解部分将从零实现顺序表接口函数,遇到问题我会进行一步步地调试说明,通过对本章的学习不仅能学会顺序表,还能实战练习下调试的技能。调试不仅仅是帮助我们分析程序找到错误的,也可以让我们去观察和理解程序。调试才是硬技能!写一点点测一点点,不要写完了再来测,这样我们就可以很轻松的找出问题。
413 0
【数据结构】顺序表详解 | 从零开始步步解读 | 画图理解并调试分析

热门文章

最新文章