通讯录项目(终)

Start And Stick

上一期我们将通讯录的项目的基本功能已经实现,这一篇文章我们将对通讯录进行完善。

目录

Start And Stick

上期回顾:

上期必要代码:

数据打印:

代码讲解:

头部插入数据:

代码讲解:

任意位置数据修改:

代码讲解:

最代码整合:

sqlist.h文件:

slist.c文件:

test.c文件:


上期回顾:

通讯录(上)icon-default.png?t=N7T8http://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;
}

到这里我们的结构体实现通讯录就结束了,我们江湖再见。

相关推荐

  1. C++项目通讯录管理系统)

    2024-01-29 05:14:01       26 阅读
  2. 基于单链表实现通讯录项目

    2024-01-29 05:14:01       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-29 05:14:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-29 05:14:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-29 05:14:01       87 阅读
  4. Python语言-面向对象

    2024-01-29 05:14:01       96 阅读

热门阅读

  1. 典型相关分析

    2024-01-29 05:14:01       57 阅读
  2. leetcode670最大交换

    2024-01-29 05:14:01       56 阅读
  3. 驾照考试-科目二

    2024-01-29 05:14:01       52 阅读
  4. MySQL 导出数据

    2024-01-29 05:14:01       50 阅读