实现底层代码顺序表
(这个在我之前的文章里有写)这里就直接使用了
seqlist.h
#pragma once
#include <stdio.h>
#include "contact.h"
typedef struct contactinfo datatype;//更改数据类型为通讯录类型
//创造一个顺序表
typedef struct seqlist
{
datatype* a;//需要储存的数据
int size;//有效数据个数
int capacity;//空间容量
}SL;
//初始化
void init(SL* L);//表的三个数据都要改
//销毁
void destroy(SL* L);//销毁是表中的一个数据空间,而这个数据空间的类型是表的结构体类型
//头插
void push_front(SL* L, datatype x);
//尾插
void push_back(SL *L,datatype x);
//头删
void dele_front(SL *L);
//尾删
void dele_back(SL *L);
//打印
void display(SL *L);
//判空
int empty(SL* L);
//指定位置之前插入
void insert_pos(SL *L,int position,datatype x);
//删除指定位置
void dele_pos(SL* L, int position);
//扩容
void check_capacity(SL* L);
//查找
int find(SL* L, datatype x);
seqlist.c
void init(SL* L)
{
/*L->a = NULL;
L->size = 0;
L->capacity = 0;*/
L->a = (datatype*)malloc(sizeof(datatype) * 4);
if (L->a == NULL)
{
printf("初始化失败!");
exit(-1);
}
L->size = 0;
L->capacity = 4;
}
void destroy(SL* L)
{
if(L->a)
free(L->a);//把空间删掉
L->a = NULL;//防止野指针
L->capacity = L->size = 0;
}
void push_front(SL* L, datatype x)
{
assert(L);
//空间够不够?,扩容
if (L->size == L->capacity)
{
datatype* temp = (datatype*)realloc(L->a, L->capacity * sizeof(datatype) * 2);//存储数据的空间扩大二倍
if (temp == NULL)
{
printf("realloc fail!\n");
return;
}
L->a = temp;//使得a指向扩大的空间首地址
L->capacity = L->capacity * 2;
}
//插入
int end = L->size - 1;//指向最后一个数字的位置
while (end >= 0)//等于0的时候还要再往后移
{
L->a[end + 1] = L->a[end];
end--;
}
L->a[0] = x;
L->size++;
}
void push_back(SL* L, datatype x)
{
if (L == NULL)
{
printf("没找到该表!"); exit(-1);
}
//空间够不够?不够需要扩容
if (L->size == L->capacity)
{
/*int newcapcity = L->capacity == 0 ? 4 : 2 * L->capacity;*/
datatype* temp=(datatype *)realloc(L->a, L->capacity * sizeof(datatype) * 2);//存储数据的空间扩大二倍
if (temp == NULL)
{
printf("realloc fail!\n");
return;
}
L->a = temp;//使得a指向扩大的空间首地址
L->capacity = L->capacity * 2;
}
//插入
L->a[L->size] = x;
L->size++;
}
void dele_front(SL* L)//只需要把后面的数前移,直到最后一个元素也移动
{
int start = 0;
while (start < L->size - 1)
{
L->a[start] = L->a[start + 1];
start++;
}
L->size--;
}
void dele_back(SL* L)//尾删无需扩容
{
L->size--;
}
int empty(SL* L)
{
if (L->size == 0)
{
return 1;
}
else return 0;
}
void check_capacity(SL *L)
{
if (L->size == L->capacity)
{
/*int newcapcity = L->capacity == 0 ? 4 : 2 * L->capacity;*/
datatype* temp = (datatype*)realloc(L->a, L->capacity * sizeof(datatype) * 2);//存储数据的空间扩大二倍
if (temp == NULL)
{
printf("realloc fail!\n");
return;
}
L->a = temp;//使得a指向扩大的空间首地址
L->capacity = L->capacity * 2;
}
}
void insert_pos(SL* L, int position, datatype x)
{
assert(L);
check_capacity(L);
assert(position >= 0 && position <= L->size);
int end = L->size - 1;
for (end; end >= position; end--)
{
L->a[end + 1] = L->a[end];
}
L->a[position] = x;
L->size++;
}
void dele_pos(SL* L, int position)
{
assert(L);
if (L == NULL)
{
return;
}
for (position; position < L->size - 1; position++)
{
L->a[position] = L->a[position + 1];
}
L->size--;
}
int find(SL* L,datatype x)
{
assert(L);
int i = 0;
/*for (i = 0; i <= L->size - 1; i++)
{
if ()
{
printf("找到啦!");
return i;
}
}*/
if (i == L->size)
{
printf("找不到!"); return -1;
}
}
再实现contact 顺序表
contact.h
//通讯录存储的不是单一一个类型,而是一个复合类型结构体
typedef struct contactinfo//这里为定义一个需要存储的数据类型,而非表
{
char name[100];
char sex[10];
int age;
char tel[15];
char addr[100];
}cinfo;
//通讯录底层是顺序表来实现
typedef struct seqlist contact;//只是声明,在contact.c里面用
//初始化
void init_contact(contact *L);//这里面传的是顺序表
//销毁
void destroy_contact(contact* L);
//添加联系人
void contactADD(contact *L);
//删除联系人
void contactDele(contact* L);
//修改联系人
void contactModify(contact* L);
//查看通讯录
void contactShow(contact* L);
//查找联系人
int contactFindByName(contact* L,char name[]);
void contactFind(contact* L);
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
#include "seqlist.h"
#include <string.h>
void init_contact(contact* L)
{
init(L);
}
void destroy_contact(contact* L)
{
destroy(L);
}
void contactADD(contact* L)
{
cinfo people;///创造一个结构体变量接受数据
printf("请输入联系人姓名:\n");
scanf("%s", people.name);
printf("请输入联系人性别:\n");
scanf("%s", people.sex);
printf("请输入联系人年龄:\n");
scanf("%d", &people.age);//
printf("请输入联系人电话:\n");
scanf("%s", people.tel);
printf("请输入联系人地址:\n");
scanf("%s", people.addr);
push_back(L, people);
}
void contactDele(contact* L)
{
printf("请输入要删除的用户名称:\n");
char name[100];
scanf("%s", name);
int position = contactFindByName(L,name);
if (position < 0)
{
printf("联系人不存在!\n");
return;
}
dele_pos(L, position);
}
void contactModify(contact* L)
{
printf("请输入要修改的用户名称:\n");
char name[100];
scanf("%s", name);
int position = contactFindByName(L,name);
if (position < 0)
{
printf("要修改的用户不存在!\n");
return;
}
printf("请输入联系人姓名:\n");
scanf("%s", L->a[position].name);
printf("请输入联系人性别:\n");
scanf("%s", L->a[position].sex);
printf("请输入联系人年龄:\n");
scanf("%d", &L->a[position].age);//
printf("请输入联系人电话:\n");
scanf("%s", L->a[position].tel);
printf("请输入联系人地址:\n");
scanf("%s", L->a[position].addr);
}
int contactFindByName(contact* L, char name[])
{
for (int i = 0; i < L->size; i++)
{
if (strcmp(L->a[i].name,name) == 0)
{
return i;
}
}
return -1;
}
void contactShow(contact* L)
{
printf("%-10s %-5s %-5s %-20s %-20s\n","姓名","性别","年龄","电话","地址");
for (int i = 0; i < L->size; i++)
{
printf("%-10s %-5s %-5d %-20s %-20s\n", L->a[i].name, L->a[i].sex, L->a[i].age, L->a[i].tel, L->a[i].addr);
}
}
void contactFind(contact* L)
{
printf("请输入要查找的用户名称:\n");
char name[100];
scanf("%s", name);
int position = contactFindByName(L,name);
if (position < 0)
{
printf("联系人不存在!\n");
return;
}
printf("%-10s %-5s %-5s %-20s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-10s %-5s %-5d %-20s %-20s\n", L->a[position].name,
L->a[position].sex, L->a[position].age, L->a[position].tel, L->a[position].addr);
}
主函数
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "seqlist.h"
#include "contact.h"
void menu()
{
printf("########## 通讯录 ##########\n");
printf("##########1.增加联系人##########\n");
printf("##########2.删除联系人##########\n");
printf("##########3.修改联系人##########\n");
printf("##########4.查找联系人##########\n");
printf("##########5.查看通讯录##########\n");
printf("########## 0.退出 ##########\n");
}
int main()
{
int op = -1;
contact L;
init_contact(&L);
do
{
menu();
printf("请选择你的操作:\n");
scanf("%d", &op);
switch (op)
{
case 1:
contactADD(&L);
break;
case 2:
contactDele(&L);
break;
case 3:
contactModify(&L);
break;
case 4:
contactFind(&L);
break;
case 0:
printf("good bye!");
break;
default:printf("请重新输入:\n");
}
} while (op != 0);
return 0;
}