动态顺序表
SeqLest.c
cpp
#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
// #2.1.顺序表初始化
void SLInit(SL* ps)
{
// ·1.判断传址不为空
assert(ps); // 调用assert.h
// ·2.将数组指针初始化
ps->arr = NULL; // 调用stdio.h
// ·3.将整形初始化
ps->size = 0;
ps->capacity = 0;
}
// #2.2.顺序表的销毁
void SLDestroy(SL* ps)
{
assert(ps);
// ·1.确认数组指针指向不为空,后释放开辟的动态内存
if (ps->arr)
{
free(ps->arr);
}
// ·2.释放空间后全部清零
ps->arr = NULL;
ps->size = 0;
ps->capacity = 0;
}
static void SLCheckCapacity(SL* ps);
// #2.3.尾部插入
void SLPushBack(SL* ps, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);// 检查函数
//·2.尾插
ps->arr[ps->size++] = x;
}
// #2.3.分装出来的内存检查函数
static void SLCheckCapacity(SL* ps)
{
// ·1.判断空间是否足够
if (ps->size == ps->capacity)// 空间不足时,拓宽空间
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType)); // 调用stdlib.h
if (tmp == NULL)// 开辟失败报错
{
perror("realloc fail");
exit(1);
}
ps->arr = tmp;
ps->capacity = newcapacity;
}
}
// #2.4.头部插入
void SLPushFront(SL* ps, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
// ·1.数据从头开始后移一位
// 由后向前
for (int i = ps->size; i > 0; i--)
{
ps->arr[i] = ps->arr[i - 1];// arr[size] = arr[size - 1]
// arr[1] = arr[0];
}
ps->arr[0] = x;
ps->size++;
}
// #2.5.打印整个数组
void SLPrint(SL s)
{
for (int i = 0; i < s.size; i++)
{
printf("%d ", s.arr[i]);
}
printf("\n");
}
// #2.7.尾部删除
void SLPopBack(SL* ps)
{
assert(ps);
//·1.判断顺序表不能为空,实际存在元素不能为0
assert(ps->size);
ps->size--;
}
// #2.8.头部删除
void SLPopFront(SL* ps)
{
assert(ps);
assert(ps->size);
// ·1.整体前移一位
// 由前向后
for (int i = 0; i < ps->size-1; i++)
{
ps->arr[i] = ps->arr[i + 1]; // arr[0] = arr[1]
// arr[size-2] = arr[size-1]
}
ps->size--;
}
// #2.9.指定位置之前插入
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos >= 0 && pos <= ps->size);
SLCheckCapacity(ps);
// ·1.指定位置数据加后方数据整体后移一位
// 由后向前
for (int i = ps->size; i > pos ; i--)
{
ps->arr[i] = ps->arr[i - 1]; // arr[size] = arr[size - 1]
// arr[pos + 1] = arr[pos]
}
ps->arr[pos] = x;
ps->size++;
}
// #2.10.指定位置删除
void SLErase(SL* ps, int pos)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
// ·1.指定位置数据加后方数据整体前移一位
// 由前向后
for (int i = pos ; i < ps->size-1; i++)
{
ps->arr[i] = ps->arr[i + 1]; // arr[pos] = arr[pos+1]
// arr[size-2] = arr[size-1]
}
ps->size--;
}
// #2.12.查找
int SLFind(SL* ps, SLDataType x)
{
assert(ps);
int i = 0;
for (i = 0; i < ps->size; i++)
{
// 成功找到返回下标
if (ps->arr[i] == x)
{
return i;
}
}
// 没有找到返回-1
return -1;
}
SeqLest.h
cpp
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
// #1. 创建动态顺序表结构体
// 数据结构中,开辟元素类型可以任意。将类型重命名有利于后期修改
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* arr;
int size; // 现有元素个数
int capacity; // 开辟空间大小所能存下的元素个数
}SL;
// #2.实现串口函数功能
// #2.1.顺序表初始化
void SLInit(SL* ps);
// #2.2.顺序表的销毁
void SLDestroy(SL* ps);
// #2.3.尾部插入
void SLPushBack(SL* ps, SLDataType x);
// #2.4.头部插入
void SLPushFront(SL* ps, SLDataType x);
// #2.5.打印整个数组
void SLPrint(SL s);
// #2.6.测试以上串口函数
// #2.7.尾部删除
void SLPopBack(SL* ps);
// #2.8.头部删除
void SLPopFront(SL* ps);
// #2.8.测试删除串口函数
// #2.9.指定位置之前插入
void SLInsert(SL* ps, int pos, SLDataType x);
// #2.10.指定位置删除
void SLErase(SL* ps, int pos);
// #2.11.测试指定函数
// #2.12.查找
int SLFind(SL* ps, SLDataType x);
// #2.13.测试查找
动态顺序表测试 Test.c
cpp
#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
// #2.6.测试
void Test01(void)
{
SL s1;
SLInit(&s1);
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPrint(s1);
SLPushFront(&s1, 5);
SLPushFront(&s1, 6);
SLPrint(s1);
SLDestroy(&s1);
}
// #2.8.测试
void Test02(void)
{
SL s1;
SLInit(&s1);
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPushFront(&s1, 5);
SLPushFront(&s1, 6);
SLPopBack(&s1);
SLPopFront(&s1);
SLPrint(s1);
SLDestroy(&s1);
}
// #2.11.测试
void Test03(void)
{
SL s1;
SLInit(&s1);
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPushBack(&s1, 4);
SLPushBack(&s1, 5);
SLInsert(&s1, 3, 88);
SLPrint(s1);
SLErase(&s1, 2);
SLPrint(s1);
SLDestroy(&s1);
}
// #2.13.测试
void Test04(void)
{
SL s1;
SLInit(&s1);
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPushBack(&s1, 4);
SLPushBack(&s1, 5);
int ret1 = SLFind(&s1, 3);
if (ret1 == -1)
{
printf("没有找到\n");
}
else
{
printf("找到了下标是%d\n", ret1);
}
int ret2 = SLFind(&s1, 10);
if (ret2 == -1)
{
printf("没有找到\n");
}
else
{
printf("找到了下标是%d\n", ret2);
}
SLDestroy(&s1);
}
int main()
{
// Test01();
// Test02();
// Test03();
Test04();
return 0;
}
通讯录项目
通讯录本质就是顺序表,于上方顺序表不同点在于,一个是int 一个是struct
Seqlest.c
cpp
#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
// #2.1.顺序表初始化
void SLInit(SL* ps)
{
// ·1.判断传址不为空
assert(ps); // 调用assert.h
// ·2.将数组指针初始化
ps->arr = NULL; // 调用stdio.h
// ·3.将整形初始化
ps->size = 0;
ps->capacity = 0;
}
// #2.2.顺序表的销毁
void SLDestroy(SL* ps)
{
assert(ps);
// ·1.确认数组指针指向不为空,后释放开辟的动态内存
if (ps->arr)
{
free(ps->arr);
}
// ·2.释放空间后全部清零
ps->arr = NULL;
ps->size = 0;
ps->capacity = 0;
}
static void SLCheckCapacity(SL* ps);
// #2.3.尾部插入
void SLPushBack(SL* ps, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);// 检查函数
//·2.尾插
ps->arr[ps->size++] = x;
}
// #2.3.分装出来的内存检查函数
static void SLCheckCapacity(SL* ps)
{
// ·1.判断空间是否足够
if (ps->size == ps->capacity)// 空间不足时,拓宽空间
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType)); // 调用stdlib.h
if (tmp == NULL)// 开辟失败报错
{
perror("realloc fail");
exit(1);
}
ps->arr = tmp;
ps->capacity = newcapacity;
}
}
// #2.4.头部插入
void SLPushFront(SL* ps, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
// ·1.数据从头开始后移一位
// 由后向前
for (int i = ps->size; i > 0; i--)
{
ps->arr[i] = ps->arr[i - 1];// arr[size] = arr[size - 1]
// arr[1] = arr[0];
}
ps->arr[0] = x;
ps->size++;
}
// #2.5.打印整个数组
//void SLPrint(SL s)
//{
// for (int i = 0; i < s.size; i++)
// {
// printf("%d ", s.arr[i]);
// }
// printf("\n");
//}
// #2.7.尾部删除
void SLPopBack(SL* ps)
{
assert(ps);
//·1.判断顺序表不能为空,实际存在元素不能为0
assert(ps->size);
ps->size--;
}
// #2.8.头部删除
void SLPopFront(SL* ps)
{
assert(ps);
assert(ps->size);
// ·1.整体前移一位
// 由前向后
for (int i = 0; i < ps->size-1; i++)
{
ps->arr[i] = ps->arr[i + 1]; // arr[0] = arr[1]
// arr[size-2] = arr[size-1]
}
ps->size--;
}
// #2.9.指定位置之前插入
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos >= 0 && pos <= ps->size);
SLCheckCapacity(ps);
// ·1.指定位置数据加后方数据整体后移一位
// 由后向前
for (int i = ps->size; i > pos ; i--)
{
ps->arr[i] = ps->arr[i - 1]; // arr[size] = arr[size - 1]
// arr[pos + 1] = arr[pos]
}
ps->arr[pos] = x;
ps->size++;
}
// #2.10.指定位置删除
void SLErase(SL* ps, int pos)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
// ·1.指定位置数据加后方数据整体前移一位
// 由前向后
for (int i = pos ; i < ps->size-1; i++)
{
ps->arr[i] = ps->arr[i + 1]; // arr[pos] = arr[pos+1]
// arr[size-2] = arr[size-1]
}
ps->size--;
}
// #2.12.查找
//int SLFind(SL* ps, SLDataType x)
//{
// assert(ps);
// int i = 0;
// for (i = 0; i < ps->size; i++)
// {
// // 成功找到返回下标
// if (ps->arr[i] == x)
// {
// return i;
// }
// }
// // 没有找到返回-1
// return -1;
//}
Seqlest.h
cpp
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include "Contact.h"
// #1. 创建动态顺序表结构体
// 数据结构中,开辟元素类型可以任意。将类型重命名有利于后期修改
typedef PeoInfo SLDataType;
typedef struct SeqList
{
SLDataType* arr;
int size; // 现有元素个数
int capacity; // 开辟空间大小所能存下的元素个数
}SL;
// #2.实现串口函数功能
// #2.1.顺序表初始化
void SLInit(SL* ps);
// #2.2.顺序表的销毁
void SLDestroy(SL* ps);
// #2.3.尾部插入
void SLPushBack(SL* ps, SLDataType x);
// #2.4.头部插入
void SLPushFront(SL* ps, SLDataType x);
// #2.5.打印整个数组
void SLPrint(SL s);
// #2.6.测试以上串口函数
// #2.7.尾部删除
void SLPopBack(SL* ps);
// #2.8.头部删除
void SLPopFront(SL* ps);
// #2.8.测试删除串口函数
// #2.9.指定位置之前插入
void SLInsert(SL* ps, int pos, SLDataType x);
// #2.10.指定位置删除
void SLErase(SL* ps, int pos);
// #2.11.测试指定函数
// #2.12.查找
int SLFind(SL* ps, SLDataType x);
// #2.13.测试查找
Contact.h
cpp
#pragma once
#include <string.h>
// #3.1.创建通讯录结构体类型,将顺序表中类型更改
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
typedef struct PersonInfo
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char addr[ADDR_MAX];
}PeoInfo;
// #3.2.声明属性表结构体更名
typedef struct SeqList Contact;
// #4.实现通讯录功能的串口函数
// #4.1.通讯录的初始化
void ContactInit(Contact* con);
// #4.2.通讯录的销毁
void ContactDesTroy(Contact* con);
// #4.3.通讯录添加数据
void ContactAdd(Contact* con);
// #4.4.展示通讯录数据
void ContactShow(Contact* con);
// #4.5.测试
// #4.6.通讯录删除数据
void ContactDel(Contact* con);
// #4.7.测试
// #4.8.通讯录的修改
void ContactModify(Contact* con);
// #4.9.测试
// #4.10.通讯录查找
void A_ContactFind(Contact* con);
// #4.10.测试
Contact.c
cpp
#define _CRT_SECURE_NO_WARNINGS
#include "Contact.h"
#include "SeqList.h"
// #4.1.通讯录的初始化
void ContactInit(Contact* con)
{
SLInit(con);
}
// #4.2.通讯录的销毁
void ContactDesTroy(Contact* con)
{
SLDestroy(con);
}
// #4.3.通讯录添加数据
void ContactAdd(Contact* con)
{
assert(con);
// ·1.创建一个暂存数据点
PeoInfo tmp;
printf("请输入联系人的姓名\n");
scanf("%s", tmp.name);
printf("请输入联系人的性别\n");
scanf("%s", tmp.gender);
printf("请输入联系人的年龄\n");
scanf("%d", &tmp.age);
printf("请输入联系人的电话\n");
scanf("%s", tmp.tel);
printf("请输入联系人的地址\n");
scanf("%s", tmp.addr);
// ·2.头插尾插任选一种
SLPushBack(con,tmp);
}
// #4.4.展示通讯录数据
void ContactShow(Contact* con)
{
assert(con);
//表头:姓名 性别 年龄 电话 地址
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
for (int i = 0; i < con->size; i++)
{
printf("%s %s %d %s %s\n", con->arr[i].name,
con->arr[i].gender,
con->arr[i].age,
con->arr[i].tel,
con->arr[i].addr);
}
}
int ContactFind(Contact* con, char name[NAME_MAX]);
// #4.6.通讯录删除数据
void ContactDel(Contact* con)
{
assert(con);
// ·1.查询
char name[NAME_MAX];
printf("请输入要删除联系人的姓名\n");
scanf("%s", name);
int find = ContactFind(con, name);
if (find < 0)
{
printf("删除的联系人不存在\n");
exit(1);
}
SLErase(con, find);
printf("删除成功\n");
}
// #4.6.分装出来的查找函数
int ContactFind(Contact* con, char name[NAME_MAX])
{
for (int i = 0; i < con->size; i++)
{
if (strcmp(con->arr[i].name, name) == 0)
{
return i;
}
}
return -1;
}
// #4.8.通讯录的修改
void ContactModify(Contact* con)
{
assert(con);
char name[NAME_MAX];
printf("请输入你要修改的联系人姓名\n");
scanf("%s", name);
int find = ContactFind(con, name);
if (find < 0)
{
printf("你要修改的联系人不存在\n");
exit(1);
}
printf("请输入你要修改的姓名\n");
scanf("%s", con->arr[find].name);
printf("请输入你要修改的性别\n");
scanf("%s", con->arr[find].gender);
printf("请输入你要修改的年龄\n");
scanf("%d", &con->arr[find].age);
printf("请输入你要修改的电话\n");
scanf("%s", con->arr[find].tel);
printf("请输入你要修改的地址\n");
scanf("%s", con->arr[find].addr);
printf("修改成功\n");
}
// #4.10.通讯录查找
void A_ContactFind(Contact* con)
{
assert(con);
char name[NAME_MAX];
printf("请输入要查找的联系人姓名\n");
scanf("%s", name);
int find = ContactFind(con, name);
if (find < 0)
{
printf("你要查找的联系人不存在\n");
exit(1);
}
printf("%s %s %s %s %s \n", "姓名", "性别", "年龄", "电话", "地址");
printf("%s %s %d %s %s \n", con->arr[find].name, con->arr[find].gender, con->arr[find].age, con->arr[find].tel, con->arr[find].addr);
}
通讯录测试文件 Test.c
cpp
#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
// #2.6.测试
//void Test01(void)
//{
// SL s1;
// SLInit(&s1);
//
// SLPushBack(&s1, 1);
// SLPushBack(&s1, 2);
// SLPushBack(&s1, 3);
// SLPrint(s1);
//
// SLPushFront(&s1, 5);
// SLPushFront(&s1, 6);
// SLPrint(s1);
//
// SLDestroy(&s1);
//
//}
// #2.8.测试
//void Test02(void)
//{
// SL s1;
// SLInit(&s1);
//
// SLPushBack(&s1, 1);
// SLPushBack(&s1, 2);
// SLPushBack(&s1, 3);
// SLPushFront(&s1, 5);
// SLPushFront(&s1, 6);
// SLPopBack(&s1);
// SLPopFront(&s1);
// SLPrint(s1);
//
// SLDestroy(&s1);
//}
// #2.11.测试
//void Test03(void)
//{
// SL s1;
// SLInit(&s1);
//
// SLPushBack(&s1, 1);
// SLPushBack(&s1, 2);
// SLPushBack(&s1, 3);
// SLPushBack(&s1, 4);
// SLPushBack(&s1, 5);
// SLInsert(&s1, 3, 88);
// SLPrint(s1);
//
// SLErase(&s1, 2);
// SLPrint(s1);
//
// SLDestroy(&s1);
//}
// #2.13.测试
//void Test04(void)
//{
// SL s1;
// SLInit(&s1);
//
// SLPushBack(&s1, 1);
// SLPushBack(&s1, 2);
// SLPushBack(&s1, 3);
// SLPushBack(&s1, 4);
// SLPushBack(&s1, 5);
// int ret1 = SLFind(&s1, 3);
// if (ret1 == -1)
// {
// printf("没有找到\n");
// }
// else
// {
// printf("找到了下标是%d\n", ret1);
// }
//
// int ret2 = SLFind(&s1, 10);
// if (ret2 == -1)
// {
// printf("没有找到\n");
// }
// else
// {
// printf("找到了下标是%d\n", ret2);
// }
//
// SLDestroy(&s1);
//}
// #4.5.测试
void Test05()
{
Contact con;
ContactInit(&con);
ContactAdd(&con);
ContactShow(&con);
ContactDesTroy(&con);
}
// #4.7.测试
void Test06()
{
Contact con;
ContactInit(&con);
ContactAdd(&con);
ContactAdd(&con);
ContactAdd(&con);
ContactShow(&con);
ContactDel(&con);
ContactShow(&con);
ContactDesTroy(&con);
}
// #4.9.测试
void Test07()
{
Contact con;
ContactInit(&con);
ContactAdd(&con);
ContactAdd(&con);
ContactAdd(&con);
ContactShow(&con);
ContactModify(&con);
ContactShow(&con);
ContactDesTroy(&con);
}
// #4.10.测试
void Test08()
{
Contact con;
ContactInit(&con);
ContactAdd(&con);
ContactAdd(&con);
ContactAdd(&con);
A_ContactFind(&con);
ContactDesTroy(&con);
}
int main()
{
// Test01();
// Test02();
// Test03();
// Test04();
// Test05();
// Test06();
// Test07();
Test08();
return 0;
}