(数据结构)—— 顺序表的应用-通讯录的实现
一.通讯录的功能介绍
1.基于动态顺序表实现通讯录
C语言基础要求:结构体、动态内存管理、顺序表、文件件操作
(1). 功能要求
1)至少能够存储100个人的通讯信息
2)能够保存用户信息:名字、性别、年龄、电话、地址等
3)增加联系人信息
4)删除指定联系人
5)查找制定联系人
6)修改指定联系人
7)显示联系人信息
(2).重要思考
【思考1】用静态顺序表和动态顺序表分别如何实现
【思考2】如何保证程序结束后,历史通讯录信息不会丢失
二. 通讯录的代码实现
1.通讯录的底层结构(顺序表)
(1)思路展示
由于,通讯录是基于动态顺序表实现的,所以掌握基本的顺序表的结构代码,非常重要~!
(2)底层代码实现(顺序表)
1.
SeqList.h
#pragma once
#include"Contact.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
//typedef int SLDataType;
//更改数据类型为通讯录数据类型
//以下的方式任意选择即可
typedef struct ContactInfo SLDataType;
//typedef CInfo SLDataType;
typedef struct SeqList
{
SLDataType* a;
int size;//当前顺序表中的数据有效个数
int capacity;//顺序表的当前空间的大小
}SL;
//typedef struct SeqList SL;
//对顺序表进行初始化
void SLInit(SL* ps);
void SLDestroy(SL* ps);
//头部/尾部/插入/删除
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
//任意位置/插入/删除
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
//打印
void SLPrint(SL* ps);
bool SLIsEmpty(SL* ps);
//查找
bool SLFind(SL* ps, SLDataType x);
2.
SeqList.c
#include"SeqList.h"
//初始化顺序表
void SLInit(SL* ps)
{
ps->a = NULL;
ps->size = ps->capacity = 0;
}
void SLDestroy(SL* ps)
{
if (ps->a)
free(ps->a);
ps->a = NULL;
ps->size = ps->capacity = 0;
}
void SLCheckCapacity(SL* ps)
{
//空间不足以插入一个数据,需要扩容
if (ps->size == ps->capacity)
{
//扩容
int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
SLDataType* tmp = (SLDataType*)realloc(ps->a, newCapacity * sizeof(SLDataType));
if (tmp == NULL)
{
perror("realloc Fail!\n");
return 1;
}
ps->a = tmp;
ps->capacity = newCapacity;
}
}
//尾插
void SLPushBack(SL* ps, SLDataType x)
{
//判断顺序表是否为空
//assert(ps->a = NULL);
//暴力方式
assert(ps);
//柔和的方式
/*if (ps->a == NULL)
return;*/
//1)空间足够,直接插入
//2)空间不够,需要扩容
SLCheckCapacity(ps);
//空间足够,直接插入
ps->a[ps->size++] = x;
}
//头插
void SLPushFront(SL* ps, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
//空间足够,历史数据后移一位;
for (size_t i = ps->size; i > 0; i--)
{
ps->a[i] = ps->a[i - 1]