Start And Stick
上一期我们将通讯录的项目的基本功能已经实现,这一篇文章我们将对通讯录进行完善。
目录
Start And Stick
上期回顾:
上期必要代码:
数据打印:
代码讲解:
头部插入数据:
代码讲解:
任意位置数据修改:
代码讲解:
最代码整合:
sqlist.h文件:
slist.c文件:
test.c文件:
上期回顾:
通讯录(上)http://t.csdnimg.cn/Vg3o3
话不多说我们开始代码实现:
上期必要代码:
typedef struct pereon
{
char name[20];
int age;
char gender[2];
char phone[13];
}PE;
typedef PE WANG;
typedef struct sqlist {
WANG* a;
int cp;
int numbers;
}SL;
数据打印:
//数据打印
void SLprint(SL* p1) {
assert(p1);
printf("%s %s %s %s\n", "姓名", "年龄", "性别", "电话");
for (int i = 0; i < p1->numbers; i++)
{
printf("%-s %-d %-s %-s\n",
p1->a[i].name,
p1->a[i].age,
p1->a[i].gender,
p1->a[i].phone
);
}
}
代码讲解:
这里打印字符串需要用%s,打印整形需要用%d。这里我们需要着重讲解的是:
p1->a[i]表示的意思。首先根据运算先后顺序p1->a先结合,结合后可以看作:WANG*a。之后可以看作a[i],也就是*(a+i)。这里*(a+i)又可以看作PE,对其进行引用可以。
数据销毁:
//数据销毁
void SLdestory(SL* p1) {
assert(p1);
free(p1->a);
p1->a = NULL;
p1->cp = p1->numbers = 0;
}
对结点进行释放内存,同时对数据进行初始化。
头部插入数据:
这里会有读者问为啥头部插入数据要放在这一篇文章讲呢,肯定是有一点特殊啊!!
//数据头部插入
void SLheaddeposit(SL*p1)
{
int mz = p1->cp == 0 ? 2 : 2 * p1->cp;
if (p1->cp == p1->numbers) {
p1->a = (WANG*)realloc(p1->a, mz * sizeof(WANG));
p1->cp = mz;
}
assert(p1);
WANG p2 = inform();
//将原本的数据移动
for (int i = p1->numbers; i>=0 ; i--)
{
if (i == 0)
{
p1->a[i] = p2;
}
p1->a[i] = p1->a[i - 1];
}
}
代码讲解:
我们这里还是要判断是否要申请空间,也就和前面一样。接下来我们需要将录入的新数据先存入我们所定义的零时变量p2中,之后我们需要将原本的数据从后开始移动,以防止数据的覆盖问题。
任意位置数据修改:
最后我们来实现任意指定位置的数据删除和插入,因为两者的思路差不多所以我们仅实现一个:
这里我们来实现任意位置的数据插入:
void SLanydeposit(SL*p1)
{
assert(p1);
int m = 0;
printf("请输入想要插入数据的下标:");
scanf("%d", &m);
//录入数据,
PE p = inform();
//将原本的数据移动,插入数据
for (int i = p1->numbers; i >= m; i--)
{
if (i == m)
{
p1->a[i] = p;
}
else
{
p1->a[i] = p1->a[i - 1];
}
}
}
代码讲解:
这里我们需要考虑一个事情:如果i=p1->numbers=0,这里我们的m只能为0。所以for循环也可以处理该数据的插入。
这里代码的目录和选择可以根据自己的喜好来进行更改。
最代码整合:
最后我们进行代码的整合,test.c文件和sqlist.h我们就不再讲解了。
sqlist.h文件:
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
typedef struct pereon
{
char name[20];
int age;
char gender[2];
char phone[13];
}PE;
typedef PE WANG;
typedef struct sqlist {
WANG* a;
int cp;
int numbers;
}SL;
//数据存放
PE inform();
//数据尾部插入
void SLdeposit(SL* p1);
//数据删除
void SLdelete(SL* p1);
//数据查找
int SLfind(SL* p1);
//数据打印
void SLprint(SL* p1);
//数据销毁
void SLdestory(SL* p1);
//图表打印
void menu();
//数据初始化
void SLinit(SL* p1);
//数据头部插入
void SLheaddeposit(SL* p1);
//任意位置数据前的插入
void SLanydeposit(SL* p1);
slist.c文件:
#define _CRT_SECURE_NO_WARNINGS 1
#include"sqlist.h"
//数据初始化
void SLinit(SL* p1)
{
p1->a = NULL;
p1->cp = p1->numbers = 0;
}
//数据录入
PE inform()
{
printf("请输入数据:");
PE inof;
printf("请输入name:");
scanf("%s", inof.name);
printf("请输入age:");
scanf("%d", &inof.age);
printf("请输入gender:");
scanf("%s", inof.gender);
printf("请输入phone number:");
scanf("%s", inof.phone);
return inof;
}
//数据头部插入
void SLheaddeposit(SL*p1)
{
int mz = p1->cp == 0 ? 2 : 2 * p1->cp;
if (p1->cp == p1->numbers) {
p1->a = (WANG*)realloc(p1->a, mz * sizeof(WANG));
p1->cp = mz;
}
assert(p1);
WANG p2 = inform();
//将原本的数据移动
for (int i = p1->numbers; i>=0 ; i--)
{
if (i == 0)
{
p1->a[i] = p2;
}
p1->a[i] = p1->a[i - 1];
}
}
//数据尾部插入
void SLdeposit(SL* p1)
{
int mz = p1->cp == 0 ? 2 : 2 * p1->cp;
if (p1->cp == p1->numbers) {
p1->a = (WANG*)realloc(p1->a, mz * sizeof(WANG));
p1->cp = mz;
}
assert(p1);
p1->a[p1->numbers] = inform();
p1->numbers++;
}
//数据删除
void SLdelete(SL* p1)
{
assert(p1);
int i = SLfind(p1);
if(i>=0);
{
for (int m = i; m < p1->numbers-1; m++)
{
p1->a[m] = p1->a[m + 1];
}
printf("删除成功\n");
p1->numbers--;
}
if (i == -1) {
printf("no people is this name\n");
}
}
//数据查找
int SLfind(SL*p1)
{
assert(p1);
printf("please write your name:");
char name[20];
scanf("%s", name);
for (int i = 0; i < p1->numbers; i++)
{
int m=strcmp(name, p1->a[i].name);
if (m == 0)
printf("%s %s %s %s\n", "姓名", "年龄", "性别", "电话");
printf("%-s %-d %-s %-s\n",
p1->a[i].name,
p1->a[i].age,
p1->a[i].gender,
p1->a[i].phone
);
return i;
}
printf("查找失败\n");
return -1;
}
//数据打印
void SLprint(SL* p1) {
assert(p1);
printf("%s %s %s %s\n", "姓名", "年龄", "性别", "电话");
for (int i = 0; i < p1->numbers; i++)
{
printf("%-s %-d %-s %-s\n",
p1->a[i].name,
p1->a[i].age,
p1->a[i].gender,
p1->a[i].phone
);
}
}
//数据销毁
void SLdestory(SL* p1) {
assert(p1);
free(p1->a);
p1->a = NULL;
p1->cp = p1->numbers = 0;
}
//图表打印
void menu()
{
printf("**************\n");
printf("****通讯录****\n");
printf("*1.增加联系人*\n");
printf("*2.删除联系人*\n");
printf("*3.查找联系人*\n");
printf("*4.显示联系人*\n");
printf("**0.退出服务**\n");
printf("**************\n");
printf("**************\n");
}
//任意位置数据前的插入
void SLanydeposit(SL*p1)
{
assert(p1);
int m = 0;
printf("请输入想要插入数据的下标:");
scanf("%d", &m);
//录入数据,
PE p = inform();
//将原本的数据移动,插入数据
for (int i = p1->numbers; i >= m; i--)
{
if (i == m)
{
p1->a[i] = p;
}
else
{
p1->a[i] = p1->a[i - 1];
}
}
}
test.c文件:
#include"sqlist.h"
int main()
{
int choice = 0;
SL connect;
SL* p1 = &connect;
SLinit(p1);
do
{
menu();
printf("Please make your owen choice: ");
scanf("%d", &choice);
switch (choice)
{
case 1:
SLdeposit(p1);
break;
case 2:
SLdelete(p1);
break;
case 3:
SLfind(p1);
break;
case 4:
SLprint(p1);
break;
case 0:
printf("退出成功");
break;
default:
printf("输入错误");
break;
}
} while (choice);
return 0;
}
到这里我们的结构体实现通讯录就结束了,我们江湖再见。