昨天我们踏入了数据结构的深山,并且和顺序表battle了一番,虽说最后赢了,但同时也留下了一个问题:如何从顺序表的增删查改加强到通讯录的的增删查改,别急,今天就带你一探究竟。
我们昨天实现了顺序表的头删,头插,尾删尾插,选择插入,选择删除,以及初始化和销毁等功能,我们也知道通讯录其实就是之前的顺序表的plus版本,二者有很强的关联性,于是乎我们今天不打算从头开始写代码,而是在昨天的基础上进行修改和完善。
没看过的宝子建议先去了解一下哦
【数据结构之顺序表的增删查改 - CSDN App】http://t.csdnimg.cn/VK5iU
?🌟?🌟?🌟在开始前,先来看看我们都要干什么吧?🌟?🌟?🌟
功能要求1)?少能够存储100个?的通讯信息2)能够保存??信息:名字、性别、年龄、电话、地址等3)增加联系?信息4)删除指定联系?5)查找制定联系?6)修改指定联系?7)显?联系?信息8)程序结束后,历史通讯录信息不会丢失
#pragma once
#include"contact.h"
#include<Windows.h>
#define _CRT_SECURE_NO_WARNINGS 1
typedef struct PersonInfo
{
?? ?char name[NAME_MAX];
?? ?char sex[SEX_MAX];
?? ?int age;
?? ?char tele[TEL_MAX];
?? ?char address[ADDR_MAX];
}SLDataType;
typedef struct SL
{
?? ?SLDataType* a;
?? ?int size;
?? ?int capacity;
}SL;
//typedef ?contact SL;
//初始化
void SLInit(SL* ps);
//销毁
void SLDestroy(SL* ps);
//打印
void SLPrint(SL* ps);
//扩容
void SLCheckCapacity(SL* ps);
//头部插?删除 / 尾部插?删除
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);
//指定位置之前插?/删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLDelete(SL* ps, int pos);
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_MAX 100
#define SEX_MAX 10
#define TEL_MAX 11
#define ADDR_MAX 100
#include<stdio.h>
#include<string.h>
//前置声明
struct SL;
typedef struct SL contact;
//用户数据//初始化通讯录
void InitContact(contact* con);
//删除通讯录数据
void DelContact(contact* con);
//添加通讯录数据
void AddContact(contact* con);
//展示通讯录数据
void ShowContact(contact* con);
//查找通讯录数据
void FindContact(contact* con);
//修改通讯录数据
void ModifyContact(contact* con);
//销毁通讯录数据
void DestroyContact(contact* con);
#pragma once
#include"contact.h"
#include<Windows.h>
#define _CRT_SECURE_NO_WARNINGS 1
typedef struct PersonInfo
{
?? ?char name[NAME_MAX];
?? ?char sex[SEX_MAX];
?? ?int age;
?? ?char tele[TEL_MAX];
?? ?char address[ADDR_MAX];
}SLDataType;
typedef struct SL
{
?? ?SLDataType* a;
?? ?int size;
?? ?int capacity;
}SL;
ok'接下来看contact.h?
#define NAME_MAX 100//
#define SEX_MAX 10//
#define TEL_MAX 11//
#define ADDR_MAX 100//
struct SL;
typedef struct SL contact;
//用户数据
void InitContact(contact* con);
void InitContact(contact* con)
{
?? ?SLInit(con);
}
int checkbyname(contact* con, char* p);
//查找函数
int checkbyname(contact* con, char* p)
{
?? ?for (int i = 0; i < con->size; i++)
?? ?{
?? ??? ?if (strcmp(p, con->a[i].name)==0)
?? ??? ??? ?return i;
?? ?}
?? ?return -1;
}
void DelContact(contact* con);
//删除通讯录数据
void DelContact(contact* con)
{
?? ?if (con->size - 1 < 0)
?? ?{
?? ??? ?printf("通讯录空了\n");
?? ??? ?//perror("SLPopFront Fail");
?? ??? ?return;
?? ?}
?? ?printf("输入你要删除的联系人姓名\n");
?? ?char p[101];
?? ?scanf("%s",p);
?? ?getchar();
?? ?int pos = checkbyname(con, p);
?? ?if (pos == -1)
?? ??? ?printf("此人不存在\n");
?? ?else
?? ?{
?? ??? ?SLDelete(con, pos);
?? ??? ?printf("删除成功\n");
?? ?}
}
void SLDelete(SL* ps, int pos)
{
?? ?for (int i = pos; i < ps->size - 1; i++)
?? ??? ?ps->a[i] = ps->a[i + 1];
?? ?ps->size--;
}
void AddContact(contact* con);
void AddContact(contact* con)
{
?? ?SLDataType a;
?? ?printf("请输入姓名\n");
?? ?scanf("%s", a.name);
?? ?getchar();
?? ?printf("请输入性别\n");
?? ?scanf("%s", a.sex);
?? ?getchar();
?? ?printf("请输入年龄\n");
?? ?scanf("%d", &a.age);
?? ?getchar();
?? ?printf("请输入电话号码\n");
?? ?scanf("%s", a.tele);
?? ?getchar();
?? ?printf("请输入地址\n");
?? ?scanf("%s", a.address);
?? ?getchar();
?? ?SLPushBack(con,a);
}
void SLPushBack(SL* ps, SLDataType x)
{
?? ?if (ps->size + 1 > ps->capacity)
?? ??? ?SLCheckCapacity(ps);
?? ?ps->a[ps->size] = x;
?? ?(ps->size)++;
}
void ShowContact(contact* con);
void ShowContact(contact* con)
{
?? ?printf("姓名\t性别\t年龄\t号码\t地址\n");
?? ?for (int i = 0; i < con->size; i++)
?? ?{
?? ??? ?printf("%s\t%s\t%d\t%s\t%s\n", con->a[i].name, con->a[i].sex, con->a[i].age, con->a[i].tele, con->a[i].address);
?? ?}
}
void FindContact(contact* con);
void FindContact(contact* con)
{
?? ?char name[100] = { 0 };
?? ?printf("输入你要找的名字\n");
?? ?scanf("%s",name);
?? ?getchar();
?? ?int i=checkbyname(con, name);
?? ?if (i == -1)
?? ??? ?printf("没有你要找的人\n");
?? ?else
?? ??? ?printf("%s\t%s\t%d\t%s\t%s\n", con->a[i].name, con->a[i].sex, con->a[i].age, con->a[i].tele, con->a[i].address);
}
void ModifyContact(contact* con);
//修改通讯录数据
void ModifyContact(contact* con)
{
?? ?char name[100] = { 0 };
?? ?printf("输入你要修改的人的名字\n");
?? ?scanf("%s",name);
?? ?getchar();
?? ?int i = checkbyname(con, name);
?? ?if (i == -1)
?? ??? ?printf("没有你要找的人\n");
?? ?else
?? ?{
?? ??? ?SLDataType a;
?? ??? ?printf("请输入姓名\n");
?? ??? ?scanf("%s", a.name);
?? ??? ?getchar();
?? ??? ?printf("请输入性别\n");
?? ??? ?scanf("%s", a.sex);
?? ??? ?getchar();
?? ??? ?printf("请输入年龄\n");
?? ??? ?scanf("%d", &a.age);
?? ??? ?getchar();
?? ??? ?printf("请输入电话号码\n");
?? ??? ?scanf("%s", a.tele);
?? ??? ?getchar();
?? ??? ?printf("请输入地址\n");
?? ??? ?scanf("%s", a.address);
?? ??? ?getchar();
?? ??? ? SLInsert(con, i, a);
?? ?}
}
void DestroyContact(contact* con);
void DestroyContact(contact* con)
{
?? ?SLDestroy(con);
?? ?printf("退出中,请稍等\n");
?? ?Sleep(1000);
}
void SLInit(SL* ps)
{
?? ?FILE* p = fopen("contact.x", "rb");
?? ?if (p != NULL)
?? ?{
?? ??? ?{
?? ??? ??? ?fread(&ps->size, sizeof(int), 1, p);
?? ??? ??? ?fread(&ps->capacity, ?sizeof(int),1, p);
?? ??? ??? ?ps->a = (SLDataType*)malloc(ps->capacity * sizeof(SLDataType));
?? ??? ??? ?for (int i = 0; i < ps->size; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?fread(&ps->a[i], sizeof(SLDataType), 1, p);
?? ??? ??? ?}
?? ??? ?}
?? ??? ?fclose(p);
?? ?}
?? ?else
?? ?{
?? ??? ?ps->a = (SLDataType*)malloc(CAPACITY * sizeof(SLDataType));
?? ??? ?ps->size = 0;
?? ??? ?ps->capacity = 4;
?? ?}
}
void SLDestroy(SL* ps)
{
?? ?FILE* p = fopen("contact.x","wb");
?? ?if (p == NULL)
?? ??? ?printf("保存数据失败\n");
?? ?else?? ?{
?? ??? ?fwrite (&ps->size,sizeof(int),1,p);
?? ??? ?fwrite(&ps->capacity, sizeof(int),1, p);
?? ??? ?for (int i = 0; i < ps->size; i++)
?? ??? ?{
?? ??? ??? ?fwrite(ps->a+i, sizeof(SLDataType),1, p);
?? ??? ?}
?? ??? ?fclose(p);
?? ?}
?? ?
?? ?free(ps->a);
?? ?ps->a = NULL;
?? ?ps->size = 0;
?? ?ps->capacity = 0;
}
#include"contact.h"
#include"SL.h"
void menu()
{
?? ?printf("********* ?通讯录 ?***********\n");
?? ?printf("***1.添加 ?***** ?2.删除*********\n");
?? ?printf("***3.展示 ?***** ?4.查找********\n");
?? ?printf("***5.修改 ?***** ?0.退出并保存*****\n");
}
int main()
{
?? ?int b = -1;
?? ?contact a;
?? ?InitContact(&a);
?? ?do
?? ?{
?? ??? ?menu();
?? ??? ?scanf("%d", &b);
?? ??? ?switch (b)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?AddContact(&a);
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?DelContact(&a);
?? ??? ??? ?break;
?? ??? ?case 3:
?? ??? ??? ?ShowContact(&a);
?? ??? ??? ?break;
?? ??? ?case 4:
?? ??? ??? ?FindContact(&a);
?? ??? ??? ?break;
?? ??? ?case 5:
?? ??? ??? ?ModifyContact(&a);
?? ??? ??? ?break;
?? ??? ?case 0:
?? ??? ??? ?DestroyContact(&a);
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("输入错误,请重新输入\n");
?? ??? ??? ?break;
?? ??? ?}
?? ?} while (b);
}