做双语网站网络推广方法的分类
我们了解顺序表之后来一个比较简单的小项目来巩固一下.
每一个函数我都进行了详细的补充, 各位可以仔细阅读。我将整个项目分为了Contact.h 、Contact.c和test.c三个文件中,其中Contact.h用于函数声明和结构体创建,Contact.c用于函数的实现,test.c用于测试代码。
Contact.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>#define NAME_MAX 20
#define GENDER_MAX 10
#define TELE_MAX 20
#define ADDR_MAX 100//定义通讯录结构体
typedef struct peopleInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tele[TELE_MAX];char addr[ADDR_MAX];
}peoInfo;
//改名为通讯录
typedef peoInfo Contact;//改名便于整体替换类型
typedef peoInfo sqDataType;
//定义顺序表
struct SeqList
{sqDataType* arr;int size;int capacity;
};
//缩写改名
typedef struct SeqList SQL;/*000000000000000000000000000000000000000000000000000000000000000000000000000000000000*///顺序表初始化
void SQLInit(SQL* ps);//检查容量函数
void check_capacity(SQL* ps);//顺序表尾插函数
void TailInsert(SQL* ps, sqDataType info);//任意位置删除联系人
void SQLDelete(SQL* ps, int pos, sqDataType info);//任意位置修改顺序表元素
void SQLModify(SQL* ps, int find);
/*0000000000000000000000000000000000000000000000000000000000000000000000000000000000*/
//初始化通讯录
void ContactInit(Contact* pcon);//增加联系人
void ContactAdd(Contact* pcon);//查找联系人
int Contactsearch(SQL* ps);//修改联系人
void ContactModify(SQL* ps);//删除联系人
void ContactDel(Contact* pcon);//文件保存联系人
void KeepFile(Contact* pcon);//显示通讯录
void ContactShow(SQL* ps);//销毁通讯录
void ContactDestroy(SQL* ps);
Contact.c
#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
//改名联系人信息为通讯录
typedef peoInfo Contact;//顺序表初始化
void SQLInit(SQL* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->size = 0;
}//检查容量函数
void check_capacity(SQL* ps)
{assert(ps);//三目操作符巧妙开辟空间int newcapacity = (ps->capacity == 0) ? 1 : (2 * ps->capacity);//相等的情况if (ps->size == ps->capacity){sqDataType* pa = (sqDataType*)realloc(ps->arr, sizeof(sqDataType) * newcapacity);if (pa == NULL){perror("realloc");return;}ps->arr = pa;printf("扩容成功\n");}
}//顺序表尾插函数
void TailInsert(SQL* ps, sqDataType info)
{assert(ps && &info);//判断是否需要扩容check_capacity(ps);//插入联系人信息ps->arr[ps->size] = info;ps->size++;printf("添加成功\n");
}//任意位置删除顺序表元素
void SQLDelete(SQL* ps, int pos)
{//检验指针有效性和pos的有效性assert(ps && pos >= 0 && pos < ps->size);//pos后的元素全部向前一位for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];ps->size--;}printf("删除成功\n");
}//任意位置修改顺序表元素
void SQLModify(SQL* ps, int pos)
{//创建临时结构体变量peoInfo info;//输入联系人信息printf("请输入联系人姓名:>");scanf("%s", info.name);printf("请输入联系人性别:>");scanf("%s", info.gender);printf("请输入联系人年龄:>");scanf("%s", &info.age);printf("请输入联系人电话:>");scanf("%s", info.tele);printf("请输入联系人地址:>");scanf("%s", info.addr);//修改元素信息ps->arr[pos] = info;
}/************************************************************************************************************************/
//初始化通讯录
void ContactInit(Contact* pcon)
{//其实就是初始化顺序表,因为顺序表的底层就是数组;SQLInit(pcon);//扩容check_capacity(pcon);
}//增加联系人
void ContactAdd(Contact* pcon)
{ //断言assert(pcon);//创建临时联系人结构体peoInfo info;//输入联系人信息printf("请输入联系人姓名:>");scanf("%s", info.name);printf("请输入联系人性别:>");scanf("%s", info.gender);printf("请输入联系人年龄:>");scanf("%d", &info.age);printf("请输入联系人电话:>");scanf("%s", info.tele);printf("请输入联系人地址:>");scanf("%s", info.addr);//尾插函数:插入顺序表TailInsert(pcon,info);
}//查找联系人
int Contactsearch(SQL* ps)//在顺序表中查找
{char name[NAME_MAX];printf("请输入联系人姓名:>");scanf("%s", name);//遍历顺序表,查找联系人for (int i = 0; i < ps->size; i++){if (strcmp(ps->arr[i].name, name) == 0){//找到了return i;}}//没找到return -1;
}//修改联系人信息
void ContactModify(SQL* ps)
{//想要修改联系人,前提是要先找到联系人int find = Contactsearch(ps);if (find < 0){printf("未找到该联系人\n");return;}//修改顺序表中的该元素SQLModify(ps,find);
}//删除联系人
void ContactDel(SQL* ps)
{//想要删除联系人,前提是要先找到联系人int find = Contactsearch(ps);if (find < 0){printf("未找到该联系人\n");return;}//删除顺序表的该元素SQLDelete(ps, find);
}//文件保存联系人
void KeepFile(SQL* ps)
{//打开文件FILE* pf = fopen("C:\\编程\\2024\\continue\\ContactProject_4_7\\ContactProject_4_7\\contact.txt", "w");if (pf == NULL){perror("fopen");return;}//读入文件char arr[100000];for (int i = 0; i < ps->size; i++){fprintf(pf, "%s %s %d %s %s\n", ps->arr[i].name, ps->arr[i].gender, ps->arr[i].age, ps->arr[i].tele, ps->arr[i].addr);}//关闭文件fclose(pf);pf = NULL;
}//显示通讯录
void ContactShow(SQL* ps)
{printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");for (int i = 0; i < ps->size; i++){printf("%s %s %d %s %s\n", ps->arr[i].name, ps->arr[i].gender, ps->arr[i].age, ps->arr[i].tele, ps->arr[i].addr);}
}//销毁通讯录
void ContactDestroy(SQL* ps)
{if (ps->arr != NULL){free(ps->arr);ps->arr = NULL;}ps->capacity = ps->size = 0;printf("通讯录已销毁\n");
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
//改名为通讯录
typedef peoInfo Contact;void menu()
{printf("**************************------通讯录-----******************************\n");printf("************** 1、Add 2、Delete *****************\n");printf("************** 3、Search 4、Modify *****************\n");printf("************** 5、KeepFile 6、Show *****************\n");printf("************** 7、Destroy 0、Exit *****************\n");printf("*************************************************************************\n");
}int main()
{//创建结构体便量Contact con;//初始化ContactInit(&con);int input = 0;int ret = 0;do{//菜单函数menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1://增ContactAdd(&con);break;case 2://删ContactDel(&con);break;case 3://查ret = Contactsearch(&con);if (ret < 0){printf("未找到该联系人\n");}else{//显示联系人信息ContactShow(&con);}break;case 4://改ContactModify(&con);break;case 5://文件操作KeepFile(&con);break;case 6://显示通讯录ContactShow(&con);break;case 7://销毁通讯录ContactDestroy(&con);break;case 0://退出printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}