链表的应用——链表实现通讯录

数据结构:用顺序表和单链表实现通讯录(上) 首先简要介绍顺序表和链表的概念和区别以作区分。顺序表:逻辑上是线性的,物理性质上也是线性的。逻辑是线性的(连续的)体现在它可以通过第一个数找到接下来的数。物理性质上的线性体现在分配给它的内存是连续的。它本质上就像一个数组,可以通过下标来访问成员。单链表:这里说的单链表是指不带头单向不循环链表。链表和顺序表是不同的。链表在逻辑上是线性的,但在物理性质上是非线性的。需要的时候申请一块内存,但这块内存和其他内存不一定连续,它可能是散落在四周的,只是通过记住下一个节点的位置,使这些单独存在的空间有了联系。 阅读详情

介绍:

在前面我们提到过,将顺序表中储存数据的类型改为结构体类型,整个顺序表就类似于我们日常生活中的通讯录,也就是说,通讯录可以同过顺序表实现;

而在我们学习完链表之后,我们也知道,顺序表和链表同属于线性表,他们所存储的数据在逻辑上都是连续的,那这个时候我们不禁发出疑问,链表能实现通讯录吗?

答案当然是肯定的,当我们将链表中每个结点中所存储的数据类型改为结构体类型之后,那链表的每个结点就相当于我们通讯录中每一个联系人,那整个链表,也就是我们日常生活中使用的通讯录,今天这篇文章,就来带大家全方位用链表来实现通讯录;

1.准备工作:

1.1.链表中一些对应功能的实现:

实现链表通讯录的增删查改也会使用到和链表增删查改有关的功能,如下:

//单链表的一个结点
typedef struct SListNode
{
	SLDataType data;
	struct SListNode* next;
}SLNode;


//创建单链表的一个结点
SLNode* BuySListNode(SLDataType x);

//单链表尾插数据
void SListPushBack(SLNode** pphead, SLDataType x);

//删除pos结点
void SListErase(SLNode** pphead, SLNode* pos);

//销毁通讯录数据
void DestroyContact(contact** con);

相信大家对单链表的增删查改早已熟记于心,所以将这部分功能实现的代码直接给出来供给参考,若是这方面知识还稍有欠缺和不足,一定要加紧练习,熟悉单链表的功能:

SLNode* BuySListNode(SLDataType x)
{
	SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;

	return newnode;
}


void SListPushBack(SLNode** pphead, SLDataType x)
{
	assert(pphead);

	SLNode* newnode = BuySListNode(x);
	if (*pphead == NULL)
	{
		//链表为空
		*pphead = newnode;
	}
	else
	{
		SLNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}

		tail->next = newnode;
	}
}


void SListErase(SLNode** pphead, SLNode* pos)
{
	assert(pphead && *pphead);
	assert(pos);

	if (pos == *pphead)
	{
		SLNode* next = (*pphead)->next;
		free(*pphead);
		*pphead = next;
	}
	else
	{
		SLNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
}


void SListDestory(SLNode** pphead)
{
	SLNode* cur = *pphead;
	while (cur)
	{
		SLNode* next = cur->next;
		free(cur);
		cur = next;
	}

	*pphead = NULL;
}

1.2.通讯录联系人的定义:

既然要将链表结点中存储的数据的类型改为结构体类型,那么我们当然要把这个结构体给定义出来,这个结构体中需包含联系人的信息,如姓名、性别、年龄、电话号码、家庭地址。

#define NAME_MAX 20
#define GENDER_MAX 10
#define TELE_MAX 20
#define ADDR_MAX 100

typedef struct PersonInform
{
	char name[NAME_MAX];
	char gender[GENDER_MAX];
	int age;
	char tele[TELE_MAX];
	char address[ADDR_MAX];
}PI;

然后将链表结点中存储数据的类型改为PI这一结构体类型;

typedef struct PersonInform SLDataType;

1.3.名称转换:

既然是通讯录,即使其本质上也是链表实现增删查改,但是为了我们代码的可读性和更明确的目的性,我们在特定的名称上需要进行转换:

链表的每一个结点SLNode应改为contact(联系人);

struct SListNode;

typedef struct SListNode contact;

但这里我们要注意,我们在实现通讯录的时候,通讯录的功能当然要单独放置在一个头文件中,我们记为Contact.h,Contact.h头文件最终是要包含在SList.h链表头文件中的,因此所有通讯录的准备工作的实现都是在链表头文件中的内容之前的,所以我们在改链表结点的名称时,应该提前声明一下;

接下来正式进入我们通讯录的实现

2.通讯录的实现:

2.1.通讯录添加联系人:

//添加通讯录数据
void AddContact(contact** con);

在实现链表时,我们都是从定义链表的一个结点的指针开始,链表通讯录也是一样,通讯录中可能原本就没有存储任何联系人,即contact* con=NULL,那这个时候我们就要改变他的指向,让他指向我们所要创建的第一个联系人,所以通讯录的添加联系人也需要传入二级指针;

在该函数中,我们需要先定义出这个联系人,并给出其所有数据,再按照链表头插或尾插的方式插入进去:

void AddContact(contact** con)
{
	PI inform = { 0 };
	printf("请输入要添加的联系人的姓名:>\n");
	scanf("%s", inform.name);
	printf("请输入要添加的联系人的性别:>\n");
	scanf("%s", inform.gender);
	printf("请输入要添加的联系人的年龄:>\n");
	scanf("%d", &inform.age);
	printf("请输入要添加的联系人的电话号码:>\n");
	scanf("%s", inform.tele);
	printf("请输入要添加的联系人的家庭住址:>\n");
	scanf("%s", inform.address);

	SListPushBack(con, inform);
}

2.2.通讯录查找联系人:

//查找通讯录数据
void FindContact(contact* con);

这个功能是为了通过姓名或者电话号码查找到某一联系人,并将其数据全部展示出来:

在实现这个函数之前,我们需要先实现以下两个函数——通过姓名和电话号码查找联系人

//通过电话号码查找联系人,找到后返回该联系人对应的结点
contact* FindByTele(contact* con, char* tele);

//通过姓名查找联系人
contact* FindByName(contact* con, char* name);

查找到该联系人,返回对应的结点,然后我们对这个返回的结点就能加以运用;

这两个函数的实现极其相似,因此在实现这两个函数的过程中,我们需要使用到strcmp函数,不要忘了包含string.h头文件;

2.2.1.FindByTele实现:

contact* FindByTele(contact* con, char* tele)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.tele, tele) == 0)
			return cur;
		cur = cur->next;
	}
	return NULL;//没找到
}

tele为我们要查找的电话号码,找不到则返回空。

2.2.2.FindByName实现:

contact* FindByName(contact* con, char* name)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.name, name) == 0)
			return cur;
		cur = cur->next;
	}
	return NULL;//没找到
}

name为我们要查找的联系人姓名,找不到则返回空;

2.2.3.FindContact实现:

那在实现完这两个函数之后,我们就能直接实现FindContact函数,在实现的时候我们应设置一个类似于菜单的东西,来确定是通过电话号码还是姓名来删除联系人,该函数的实现非常简单,这里直接将代码给出:

void FindContact(contact* con)
{
	assert(con);
	//有两种查找方式,可通过姓名和电话号码查找,找到后打印出该联系人的全部信息
	int choice = 0;
	printf("********* 请选择查找方式:**********\n");
	printf("************* 1.tele **************\n");
	printf("************* 2.name **************\n");
	printf("************* 0.退出 *************\n");
	printf("请选择:>");
	contact* find = NULL;
	do
	{
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			printf("请输入要查找的电话号码:\n");
			char tele[TELE_MAX] = "happy";
			scanf("%s", tele);
			find = FindByTele(con, tele);
			break;
		case 2:
			printf("请输入要查找的姓名:\n");
			char name[NAME_MAX] = "happy";
			scanf("%s", name);
			find = FindByName(con, name);
			break;
		case 0:
			printf("已退出\n");
			break;
		default:
			printf("选择错误,重新选择:\n");
			break;
		}
	} while (choice != 0 && choice != 1 && choice != 2);
	//选择的不是 0、1、2 就会继续调用

	if (find == NULL)
	{
		printf("查无此人:\n");
	}
	else
	{
		printf("姓名: %s\n", find->data.name);
		printf("性别: %s\n", find->data.gender);
		printf("年龄: %d\n", find->data.age);
		printf("电话: %s\n", find->data.tele);
		printf("住址: %s\n", find->data.address);
	}
}

2.3.通讯录删除联系人:

//删除通讯录数据
void DelContact(contact** con);

对于该功能的实现,我们要选择通过姓名或者电话号码来删除联系人,这里我们以通过姓名来删除联系人做示范,当然大家也能有自己的想法,代码的实现路径往往不是唯一的;

首先通过FindByName或者FindByTele函数来找到我们需要删除的联系人,结合SListErase来删除这个联系人:

void DelContact(contact** con)
{
	assert(*con);
	printf("请输入要删除的对应联系人的姓名:>\n");
	char name[NAME_MAX] = "happy";
	scanf("%s", name);
	contact* find = FindByName(*con, name);
	
	if (find != NULL)
		SListErase(con, find);
	else
		printf("查无此人\n");
}

2.4.通讯录修改联系人:

//修改通讯录数据
void ModifyContact(contact* con);

该功能的实现和删除联系人非常类似,也是通过FindByName或者FindByTele找到对应我们需要删除的联系人,存放于find中,然后通过find找到该联系人,对其数据进行修改,我们可以发现,这只不过对find的操作和DelContact函数有所不同而已:

void ModifyContact(contact* con)
{
	assert(con);

	printf("请输入要修改的对应联系人的姓名:>\n");
	char name[NAME_MAX] = "happy";
	scanf("%s", name);
	contact* find = FindByName(con, name);

	if (find != NULL)
	{
		printf("请输入新联系人的姓名:\n");
		scanf("%s", find->data.name);
		printf("请输入新联系人的性别:\n");
		scanf("%s", find->data.gender);
		printf("请输入新联系人的年龄:\n");
		scanf("%d", &find->data.age);
		printf("请输入新联系人的电话:\n");
		scanf("%s", find->data.tele);
		printf("请输入新联系人的住址:\n");
		scanf("%s", find->data.address);
	}
	else
		printf("查无此人\n");
}

2.5.展示通讯录和摧毁通讯录:

//展示通讯录数据
void ShowContact(contact* con);

//销毁通讯录数据
void DestroyContact(contact** con);

这两个函数的实现就非常直接了,尤其是摧毁通讯录,和链表的摧毁一模一样,这里给出代码:

void ShowContact(contact* con)
{
	assert(con);

	contact* cur = con;
	printf("| 姓名 | 性别 | 年龄 | 电话 | 住址 |\n");
	while (cur)
	{
		printf("| %s | %s | %d | %s | %s |\n", cur->data.name, cur->data.gender, cur->data.age
			, cur->data.tele, cur->data.address);
		cur = cur->next;
	}
}


void DestroyContact(contact** con)
{
	assert(con);
	
	SListDestory(con);
}

当然了,我们也可以通过自己的发挥来让其展示的画面更加美观;

3.整体功能展示:

为了展示这个通讯录的功能,我们可以定义一个枚举变量和一个菜单,来增加我们代码的可读性:

enum Contact
{
	EXIT,
	ADD,
	DEL,
	FIND,
	MODIFY,
	SHOW
};

void menu()
{
	printf("***********---欢迎浏览通讯录---***********\n");
	printf("******- 1.Add -*********- 2.Del***********\n");
	printf("******- 3.Find -********- 4.Modify -*******\n");
	printf("******- 5.Show -********- 0.Exit -*****\n");
	printf("请选择:>");
}

代码如下:

int main()
{
	//TestContact();
	contact* con = NULL;
	int choice = 0;
	do
	{
		menu();
		scanf("%d", &choice);
		switch (choice)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case FIND:
			FindContact(con);
			break;
		case MODIFY:
			ModifyContact(con);
			break;
		case SHOW:
			ShowContact(con);
			break;
		case EXIT:
			printf("已退出\n");
			break;
		default:
			printf("选择错误,重新选择:\n");
			break;
		}
	} while (choice);

	DestroyContact(&con);

	return 0;
}

4.展示结果:

5.整体代码展示:

到这里我们链表实现通讯录就已经全部结束了,和顺序表其实有很多地方时类似的,如果我们1能熟练的掌握通讯录的实现,相信我们对顺序表和链表的掌握已经非常熟练了,这里将实现这个通讯录的代码全部给出,方便大家自己实现的时候进行参考:

5.1.Contact.h头文件部分:

#pragma once

#include <string.h>
#define NAME_MAX 20
#define GENDER_MAX 10
#define TELE_MAX 20
#define ADDR_MAX 100

typedef struct PersonInform
{
	char name[NAME_MAX];
	char gender[GENDER_MAX];
	int age;
	char tele[TELE_MAX];
	char address[ADDR_MAX];
}PI;

struct SListNode;

typedef struct SListNode contact;


//添加通讯录数据
void AddContact(contact** con);

//通过电话号码查找联系人,找到后返回该联系人对应的结点
contact* FindByTele(contact* con, char* tele);

//通过姓名查找联系人
contact* FindByName(contact* con, char* name);

//删除通讯录数据
void DelContact(contact** con);

//展示通讯录数据
void ShowContact(contact* con);

//查找通讯录数据
void FindContact(contact* con);

//修改通讯录数据
void ModifyContact(contact* con);

//销毁通讯录数据
void DestroyContact(contact** con);

5.2.Contact.c功能实现部分:

#define  _CRT_SECURE_NO_WARNINGS 1

#include "SList.h"



void AddContact(contact** con)
{
	PI inform = { 0 };
	printf("请输入要添加的联系人的姓名:>\n");
	scanf("%s", inform.name);
	printf("请输入要添加的联系人的性别:>\n");
	scanf("%s", inform.gender);
	printf("请输入要添加的联系人的年龄:>\n");
	scanf("%d", &inform.age);
	printf("请输入要添加的联系人的电话号码:>\n");
	scanf("%s", inform.tele);
	printf("请输入要添加的联系人的家庭住址:>\n");
	scanf("%s", inform.address);

	SListPushBack(con, inform);
}


contact* FindByTele(contact* con, char* tele)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.tele, tele) == 0)
			return cur;
		cur = cur->next;
	}
	return NULL;//没找到
}


contact* FindByName(contact* con, char* name)
{
	assert(con);
	contact* cur = con;
	while (cur)
	{
		if (strcmp(cur->data.name, name) == 0)
			return cur;
		cur = cur->next;
	}
	return NULL;//没找到
}

void FindContact(contact* con)
{
	assert(con);
	//有两种查找方式,可通过姓名和电话号码查找,找到后打印出该联系人的全部信息
	int choice = 0;
	printf("********* 请选择查找方式:**********\n");
	printf("************* 1.tele **************\n");
	printf("************* 2.name **************\n");
	printf("************* 0.退出 *************\n");
	printf("请选择:>");
	contact* find = NULL;
	do
	{
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			printf("请输入要查找的电话号码:\n");
			char tele[TELE_MAX] = "happy";
			scanf("%s", tele);
			find = FindByTele(con, tele);
			break;
		case 2:
			printf("请输入要查找的姓名:\n");
			char name[NAME_MAX] = "happy";
			scanf("%s", name);
			find = FindByName(con, name);
			break;
		case 0:
			printf("已退出\n");
			break;
		default:
			printf("选择错误,重新选择:\n");
			break;
		}
	} while (choice != 0 && choice != 1 && choice != 2);
	//选择的不是 0、1、2 就会继续调用

	if (find == NULL)
	{
		printf("查无此人:\n");
	}
	else
	{
		printf("姓名: %s\n", find->data.name);
		printf("性别: %s\n", find->data.gender);
		printf("年龄: %d\n", find->data.age);
		printf("电话: %s\n", find->data.tele);
		printf("住址: %s\n", find->data.address);
	}
}


void DelContact(contact** con)
{
	assert(*con);
	printf("请输入要删除的对应联系人的姓名:>\n");
	char name[NAME_MAX] = "happy";
	scanf("%s", name);
	contact* find = FindByName(*con, name);
	
	if (find != NULL)
		SListErase(con, find);
	else
		printf("查无此人\n");
}


void ShowContact(contact* con)
{
	assert(con);

	contact* cur = con;
	printf("| 姓名 | 性别 | 年龄 | 电话 | 住址 |\n");
	while (cur)
	{
		printf("| %s | %s | %d | %s | %s |\n", cur->data.name, cur->data.gender, cur->data.age
			, cur->data.tele, cur->data.address);
		cur = cur->next;
	}
}


void ModifyContact(contact* con)
{
	assert(con);

	printf("请输入要修改的对应联系人的姓名:>\n");
	char name[NAME_MAX] = "happy";
	scanf("%s", name);
	contact* find = FindByName(con, name);

	if (find != NULL)
	{
		printf("请输入新联系人的姓名:\n");
		scanf("%s", find->data.name);
		printf("请输入新联系人的性别:\n");
		scanf("%s", find->data.gender);
		printf("请输入新联系人的年龄:\n");
		scanf("%d", &find->data.age);
		printf("请输入新联系人的电话:\n");
		scanf("%s", find->data.tele);
		printf("请输入新联系人的住址:\n");
		scanf("%s", find->data.address);
	}
	else
		printf("查无此人\n");
}


void DestroyContact(contact** con)
{
	assert(con);
	
	SListDestory(con);
}

5.3.测试及实验部分:

#define  _CRT_SECURE_NO_WARNINGS 1

#include "SList.h"

void TestContact()
{
	contact* con = NULL;
	AddContact(&con);
	AddContact(&con);
	FindContact(con);
	
}

enum Contact
{
	EXIT,
	ADD,
	DEL,
	FIND,
	MODIFY,
	SHOW
};

void menu()
{
	printf("***********---欢迎浏览通讯录---***********\n");
	printf("******- 1.Add -*********- 2.Del***********\n");
	printf("******- 3.Find -********- 4.Modify -*******\n");
	printf("******- 5.Show -********- 0.Exit -*****\n");
	printf("请选择:>");
}

int main()
{
	//TestContact();
	contact* con = NULL;
	int choice = 0;
	do
	{
		menu();
		scanf("%d", &choice);
		switch (choice)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case FIND:
			FindContact(con);
			break;
		case MODIFY:
			ModifyContact(con);
			break;
		case SHOW:
			ShowContact(con);
			break;
		case EXIT:
			printf("已退出\n");
			break;
		default:
			printf("选择错误,重新选择:\n");
			break;
		}
	} while (choice);

	DestroyContact(&con);

	return 0;
}

单链表的应用———简单的通讯录 本人初学数据结构,代码还不够完善,还望各位大神,可以指点一二。#include //建立通讯录 #include #include typedef struct Node{ char name[20]; char Iphonedata[11]; int qq; struct Node *next; }Node,*LinkList; void CreatList(Lin 阅读详情

相关推荐

C语言:实现用链表实现通讯录功能

通讯录功能可以使用链表数据结构来实现。鱼弦:优快云内容合伙人、优快云新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)链表实现通讯录功能适用于需要存储和管理联系人信息的场景,例如个人通讯录、电话簿、客户管理系统等。以下是一个示例的C语言代码实现,展示了如何使用链表实现通讯录功能。使用链表实现通讯录功能是一种常见的数据结构应用,它可以用于存储和管理联系人信息。

走向CTO的路上... 661

数据结构小项目----通讯录的实现(这里用链表实现) 超详细~~~~૮(˶ᵔ ᵕ ᵔ˶)ა

目录Contact.h说明:结构体与头文件的包含: ​编辑 函数在头文件的声明与定义: Contact.c中各个函数的实现:1.检查链表中的数据是否满了,满了就扩容 2.链表的尾插 3.链表的删除4.查找名字是否匹配 5.初始化通讯录6. 通讯录的摧毁7.添加联系人的信息8.删除联系人的信息 9.修改联系人信息 10.查找联系人11.通讯录当前的联系人展示ConTest.c源文件:测试数据: 最后完整代码展示: Contact.h:Contact.c:ConTest.c: 代码详解: 2

2302_79862386的博客 1956

手把手教你用STM32CubeMX配置I3C通信(含动态地址分配实战)

本文提供了一份基于STM32CubeMX配置I3C通信的实战指南,重点讲解了动态地址分配的实现步骤。通过详细的工程配置、从设备枚举、CCC命令使用及数据读写示例,帮助开发者快速掌握这一高效通信协议,以替代传统的I2C或SPI接口,满足多传感器连接与低功耗设计需求。

c8d9e0f1的博客 543

C语言用链表实现通讯录管理系统

C语言链表实现通讯录、将链表存入文件中。包括链表结点的增加、删除、查询,链表的输出,构建菜单项,结构体。

weixin_62291385的博客 3639

基于FPGA的 SelectIO IP核 的仿真验证-----( LVDS差分高速传输)

SelectIO IP核 的仿真验证

qq_43618170的博客 1万+

Edge浏览器IE模式失效?最新142版本隐藏按钮的3种解决方案

本文针对Edge浏览器142版本中IE模式按钮消失的问题,提供了3种实用解决方案,包括注册表修改、手动添加网站到IE模式列表和企业策略部署方案,帮助用户解决兼容性问题,确保老旧系统正常访问。

weixin_28308325的博客 501

通讯录(链表实现)

通讯录链表实现

ajl2003的博客 1567

拜耳阵列(Bayer Pattern)和解马赛克简介

拜尔阵列由柯达的布莱斯·拜尔发明,拜尔阵列将更多的像素用于绿色,而不是红色和蓝色,因为人眼对绿色更敏感。但这张照片,每个像素只有rgb中的一种颜色,每个像素还缺少其它两个颜色分量,效果如下图3所示。典型的图像传感器(例如我们在数码相机中使用的图像传感器,主要有CCD, CMOS)由许多单独的光电传感器组成,所有这些传感器都会捕获光线。如果想要获得不同颜色的光,最直接的做法是加入不同颜色的滤镜,从而滤出 RGB 三个通道的颜色。这个覆盖层可以理解为一个过滤层,每种类型的过滤器通常只允许一种颜色的光线的通过。

qq_34999565的博客 5982

c语言基础 通讯录 (链表版)

c语言基础 通讯录 (链表版)

m0_70681152的博客 2974

PID温控实验平台搭建(二)——PID进阶知识介绍及源码分享

最近,我突发奇想去翻阅了一些我本科期间所做的一些小项目,发现都挺有意思的!希望通过我的讲解文章可以帮助你们少走一些弯路!今天,我要分享的是一个PID温控实验平台的搭建,这是一个系列文章,手把手地教你学习和认识PID算法,了解这种算法在温度控制中的应用。由于我知识有限,如果出现一些错误,希望大家可以帮助我指出来,我们一起学习进步!!!

qq_35953617的博客 8049

2021秋-北邮计算机导论期末考试(BUPT)

2021秋-北邮计算机导论期末考试(BUPT) 难度较低适合新手练习

weixin_73985779的博客 1498

单链表的应用 --> 简单通讯录的实现

本文基于单链表实现了一个简易通讯录系统,主要功能包括联系人信息的增删查改、显示及数据持久化存储。系统采用模块化设计,分为单链表底层(SList.h/c)、通讯录业务逻辑(contact.h/c)和测试菜单(test.c)三部分。核心功能通过单链表操作实现,支持100人信息存储,包含姓名、性别、年龄等字段,程序退出时数据会保存至文件。关键实现包括:初始化加载历史数据、按姓名查找节点、链表节点操作等,相比顺序表实现更灵活高效。

2502_91744920的博客 4064

RK3568平台(网络篇)WIFI模块RTL8821CU调试

RTL8821CU是瑞昱半导体推出的usb接口的wifi,下面的教程将介绍如何将RTL8821CU移植到rk3588的平台上。移植usb wifi需要修改的文件Android hal层需要修改的文件//kernel需要修改的文件kernel/arch/arm64/boot/dts/rockchip/rk3399-tve1030g.dtsi //除去板上的sdio的wifi。

weixin_49303682的博客 3905

C语言数据结构-基于单链表实现通讯录

在Contact.h头文件中定义名字最大长度,性别最大长度,电话最大长度,地址最大长度120102050//前置声明//定义结构体int age;}ConInfo;

m0_73678713的博客 2150

AMS TMF8820/21/28 SPAD 掩码和模式选择

为了实现最快的测距周期,将报告周期设置在测距周期以下的毫秒,以确保不会有等待时间。除了8X8固定了pixel的位置意外,其他模式客户可以设计自己的spad掩码,并将spad单独分配给通道。对于这些spad掩码,有一些约束。左下角提示红色代表光学中心,绿色方框表示单个spad,每个MP里可能有2X3个spad,也有2X5个spad,也有3X6+3个spad,这部分适配光学,最大的程度的利用spad区域。以下是几种预定义的spad掩码,非常灵活的配置,来适配各种3X3,4X4,8X8的模式选择。

dream it possible 700

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言实现通讯录管理系统(数据结构链表应用)

实际操作时,系统生成的代码可以直接运行测试,无需配置编译环境。我发现它的文件读写功能模拟很完善,能完整呈现课程设计要求的各项功能,对于数据结构初学者来说,通过修改参数就能快速验证不同实现方式的效果。采用链表存储联系人信息,每个节点包含编号、姓名、性别、电话四个字段。相比数组,链表能动态调整内存使用,适合频繁增删的场景。采用控制台菜单驱动方式,通过数字选择功能模块,每个功能执行后自动返回主菜单,符合基础管理系统操作习惯。查询无结果时提供重新输入选项,提升用户体验。字段间用制表符分隔保证格式统一。

RubyWolf84的博客 246

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

基于双向链表的通讯录C语言实现

本文使用C语言实现了基于双向链表的基础通讯录

都市隸人的博客 741

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

用链表来实现通讯录并保存到文件中

| # 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可

qq_53505979的博客 6513

单链表与双链表

本篇博客还是与数据结构有关,这次讲的是单链表和双链表。为了方便讲解还是和顺序表一样采取通讯录的载体,分为两大类讲。仔细来说的话这里的单向链表指的是单向不带头不循环链表,而双向链表指的是双向带头循环链表。这两个正好是链表两个极端,一个结构简单但是用起来不太方便,一个结构复杂但是非常好用,真是合适的一对。

2302_81342533的博客 1094

基于单链表的通讯录C语言实现

本文使用C语言实现了基于单链表的基础通讯录

都市隸人的博客 625

C语言:基于单链表实现通讯录项目

之前我们用顺序表实现了通讯录,这次我们使用单链表实现。我们定义五个文件,是包含了单链表的结构,及各类库文件声明,各个单链表接口声明用于实现各类单链表接口Contact.h是包含了通讯录的结构,各个通讯录接口声明Contact.c用于实现通讯录接口test.c用作测试和实现通讯录的菜单,控制增删查改的选项。

枫叶栀子的博客 887

附加题、组链表与通讯录(期末模拟)【S】

题目描述 组链表是一种常用的数据结构,它由数组加链表组成,往往用于信息检索中。 每个链表由n个链表结点组成,每个链表都有头结点,头结点不存放实际数据,纯粹作为一个索引。 所有链表的头结点组成一个数组,即数组的每个元素都是一个链表头结点,它的后面延伸着一个链表。 例如一个通讯录包含五个联系人,每个联系人都有姓名和电话,每个联系人都对应一个链表结点。 Tom 8111 Any 1222 Ken 2333 Kim 2444 Tim 8222 我们先创建一个数组包含26个链表头结点,对应26个大

Galaxy_Su的博客 831

通讯录管理系统C语言链表实现

本程序采用链表的方式可以实现对于通讯录信息的管理操作主要有增 删 改 查 显示全部信息 退出六个功能。代码注释都有逻辑简单易懂适合初学者进行链表的学习。代码如下:#include #include #include typedef struct stu{ char name[20];//姓名 int phone;//电话 int telephone;//移动电话 int youbian;//邮编 char ......

m0_53345417的博客 3073

单链表(增删减改)+单链表实现通讯录项目+链表的专用题型

单链表是一种数据结构,它的数据元素在物理上不连续,但在逻辑上是连续的,通过指针链接实现数据元素的顺序。在单链表中,每个节点包含数据区和指针区,用于存放数据和指向下一个节点的地址。单链表的实现主要包括头插法、尾插法、头删、尾删、查找、插入、删除等操作。它广泛应用于企业常用的技术中,如排序、查找、插入、删除等操作。相较于顺序表,链表在内存开辟和元素插入删除方面具有优势,但其访问效率相较较低,需要从头节点开始,依序通过每个节点的指针到达下一个节点1279。单链表的创建。

Jason_from_China的博客 1829

《数据结构之链表篇》--简单通讯录的C++实现

客户端程序: #include"List.h" int menu() { cout << "1.新建联系人" << endl; cout << "2.删除联系人" << endl; cout << "3.浏览通讯录" << endl; cout << "4.退出通讯录" << endl; cout << "请输入:"; int input; cin >> input; retu

WingC的博客 1274

链表的实际应用1

在上次的《链表的基本应用》中,大致的说明了;链表的基本算法和概念,但这也只是书面的介绍而已,而它到底怎么用连我自己也不是很清楚,所以现在在练一些可以用链表来做题的题目,做了几道题,觉得还可以,所以现在再来理一遍思路; “链表的使用主要是要依靠指针和动态空间” (1):通讯录的使用:这个同学们应该比较熟悉吧,先说为什么要用链表吧,因为通讯录中的信息是不确定的,可增加,也可减少,如果只允许

染指弦 7102
上一篇: 反转链表相关问题
下一篇: 贪吃蛇小游戏C语言全实现
鼓浪屿Estelle
博客等级 码龄3年 307粉丝 11原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值