顺序表的应用——通讯录的实现

【(数据结构) —— 顺序表的应用-通讯录的实现】 (数据结构) —— 顺序表的应用-通讯录的实现 阅读详情

介绍:

我们知道,顺序表是将各种类型数据存储到一块连续的空间中,存储数据的类型多样,意味着顺序表的使用方式也多样化,在我们的实际生活中,顺序表的应用非常广泛,这篇文章就来向大家介绍顺序表在我们日常生活中的一种应用——顺序表实现通讯录,所谓通讯录,就是当顺序表中数据存储类型改为存放着联系人信息的结构体类型时,顺序表就可以等同于我们日常生活中的通讯录,实现这种顺序表的增删查改,也就相当于通讯录联系人的增删查改,因此,这种代码实现对于我们自身能力的提升非常重要,在巩固我们知识的同时,还加深了对顺序表的理解和使用;

顺序表增删查改的实现:

在进行我们通讯录的实现之前,我们当然要牢牢掌握当存放数据的类型为int时的动态顺序表的增删查改,由于这并不是这篇文章的重点,我们直接将代码给出,大家可以以此为参考:

头文件部分:

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int SLDataType;

typedef struct SeqList
{
	SLDataType* arr;
	int size;
	int capacity;
}SL;

//初始化顺序表
void SeqListInit(SL* ps);

//摧毁顺序表
void SeqListDestory(SL* ps);

//打印顺序表
void SeqListPrint(SL* ps);

//检查容量
void CheckCapacity(SL* ps);

//顺序表尾插数据
void SeqListPushBack(SL* ps, SLDataType x);

//顺序表头插数据
void SeqListPushFront(SL* ps, SLDataType x);

//顺序表尾删数据
void SeqListPopBack(SL* ps);

//顺序表头删数据
void SeqListPopFront(SL* ps);

//在下标pos前插入数据
void SeqListInsert(SL* ps, int pos, SLDataType x);

//删除下标pos处的数据
void SeqListErase(SL* ps, int pos);

功能实现部分:

#define  _CRT_SECURE_NO_WARNINGS 1

#include "SeqList.h"

void SeqListInit(SL* ps)
{
	assert(ps);

	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}


void SeqListDestory(SL* ps)
{
	assert(ps);

	free(ps->arr);
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}


void SeqListPrint(SL* ps)
{
	assert(ps);

	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}


void CheckCapacity(SL* ps)
{
	assert(ps);
	
	if (ps->capacity == ps->size)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(-1);
		}
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
}


void SeqListPushBack(SL* ps, SLDataType x)
{
	assert(ps);
	//先检查容量,不够增容;
	CheckCapacity(ps);
	ps->arr[ps->size] = x;
	ps->size++;
}


void SeqListPushFront(SL* ps, SLDataType x)
{
	assert(ps);
	//先检查容量,不够增容;
	CheckCapacity(ps);

	int i = ps->size;
	while (i)
	{
		//集体向后挪一位
		ps->arr[i] = ps->arr[i - 1];
		i--;
	}
	ps->arr[0] = x;
	ps->size++;
}


void SeqListPopBack(SL* ps)
{
	assert(ps);
	assert(ps->size);//有元素才能删,没有元素不能调用该函数;

	ps->size--;
}


void SeqListPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size);

	int i = 0;
	//元素集体向前挪动
	while (i < ps->size - 1)
	{
		ps->arr[i] = ps->arr[i + 1];
		i++;
	}

	ps->size--;
}


void SeqListInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos <= ps->size);
	CheckCapacity(ps);
	int i = ps->size;
	while (i > pos)
	{
		ps->arr[i] = ps->arr[i - 1];
		i--;
	}
	ps->arr[pos] = x;
	ps->size++;
}


void SeqListErase(SL* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	int i = pos;
	while (i < ps->size - 1)
	{
		ps->arr[i] = ps->arr[i + 1];
		i++;
	}

	ps->size--;

}

通讯录功能的实现:

前面说到,通讯录的实现就是将顺序表中存储类型改为结构体类型,在存储类型变为结构体之后,其相应的增删查改的方式也会发生一系列微妙变化,但对于顺序表,万变不离其宗形容它再适合不过,不管存储类型怎么变,其增删查改的大致思维是基本一致的;

实现顺序表,我们要先创建Contact.h头文件,对其进行一系列准备工作——创建出顺序表要存储的结构体,以及将顺序表的命名改为通讯录,最后将顺序表中数据的存储类型改为我们创建的结构体类型,以方便我们后续的使用,如下所示:

#define NAME_MAX 20
#define GENDER_MAX 10
#define TELE_MAX 20
#define ADDRESS_MAX 200

//定义一个联系人结构体:——包括姓名、性别、联系电话、年龄,住址;

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


struct SeqList;//提前声明一下需要用到的结构体;


typedef struct SeqList Contact;//将顺序表进化成通讯录—
//顺序表中的每一个数据不再是整型,而是结构体

我们可以看到,我们创建的结构体,它存放着联系人的信息——姓名,性别、电话号码、年龄和地址,做完这些准备工作之后,我们就可以直接上手实验通讯录的功能:

1.通讯录的初始化和销毁:

//通讯录初始化
void InitContact(Contact* pc);

//通讯录销毁
void DestoryContact(Contact* pc);

这两个功能的实现非常简单,存储数据类型的变化,并不影响销毁和创建,因此,对通讯录的初始化和销毁,也就是对顺序表的初始化和销毁,可以直接调用实现顺序表初始化和销毁的函数:

void InitContact(Contact* pc)
{
	assert(pc);
	//初始化通讯录就是初始化顺序表
	SeqListInit(pc);
}


void DestoryContact(Contact* pc)
{
	assert(pc);
	//摧毁通讯录也是摧毁链表;
	SeqListDestory(pc);
}

2.通讯录添加联系人:

//添加联系人
void AddContact(Contact* pc);

顺序表存储数据的类型变成了结构体,我们要存入的数据就不再是像整型那么简单明了,首先我们应该创建出这个结构体,并存放好其中的数据,再根据顺序表尾插或者头插的方式将其存入通讯录中,如下所示:

void AddContact(Contact* pc)
{
	assert(pc);
	//添加数据之前要先构建出要添加的数据:
	PI inform;
	printf("请输入联系人姓名:\n");
	scanf("%s", inform.name);

	printf("请输入联系人性别:\n");
	scanf("%s", inform.gender);

	printf("请输入联系人电话号码:\n");
	scanf("%s", inform.tele);

	printf("请输入联系人年龄:\n");
	scanf("%d", &inform.age);

	printf("请输入联系人地址:\n");
	scanf("%s", inform.address);

	//创建完成,直接尾插进通讯录,如同顺序表的尾插:
	SeqListPushBack(pc, inform);

}

在填入之前可以使用printf标注一下,让我们在使用的时候思路能更加清晰,这里有个小地方一定要注意,姓名、性别、电话号码、联系人地址对应的是字符串%s,而年龄对应的是整型%d,一定要区分清楚,要不然程序无法正常执行;

3.通讯录查找联系人

//查找联系人信息:
void FindContact(Contact* pc);

查找某个联系人,即通过某一条件比对通讯录中的数据,匹配则显示出这个数据的全部信息,而在通讯录中,我们可以通过联系人的姓名或者电话号码来查找联系人,下面我们来一一介绍:

3.1.通过姓名查找联系人

//通过姓名查找联系人
int FindByName(Contact* pc, char* des);

des为我们需要查找的联系人姓名,查找的时候我们要将其首元素地址传入该函数中,那我们要怎么判断呢:这就得使用到我们熟知的一个函数————strcmp,遍历通讯录中的每一个结构体的name部分,通过strcmp比对des中的数据和name中的数据是否相同,相同则strcmp的返回值为0,当其返回值为0时,我们将此时通讯录中数组的下标返回,这样我们就可以通过这个下标直接找到通讯录中这个数据的全部信息,但是,当遍历完全后任然没有与des相匹配的数据,我们需要返回一个无效的下标,比如EOF(-1),这样就意味着查找失败了,如下所示:

int FindByName(Contact* pc, char* des)
{
	assert(pc);
	for (int i = 0; i < pc->size; i++)
	{
		if (strcmp(pc->arr[i].name, des) == 0)
			return i;
	}

	return EOF;
}

3.2.通过电话号码查找联系人

//通过电话号码查找联系人
int FindByTele(Contact* pc, char* des);

此方法跟通过姓名查找联系人的方法完全相同,只是需要遍历的数据成为了结构体中的tele,如下所示:

int FindByTele(Contact* pc, char* des)
{
	assert(pc);
	for (int i = 0; i < pc->size; i++)
	{
		if (strcmp(pc->arr[i].tele, des) == 0)
			return i;
	}

	return EOF;
}

3.3.整体实现:

void FindContact(Contact* pc)
{
	assert(pc);
	//查找的方式有很多种,可以使用姓名或者电话号码;
	int find = 0;
	int choice = 0;
	do
	{
		printf("**************  请选择要查找的方式:**************\n");
		printf("****************** 1.姓名查找 ***********************\n");
		printf("****************** 2.电话查找 **********************\n");
		printf("*************** 0.误选,退出查找 **********************\n");
		printf("请选择:");
		scanf("%d", &choice);
		if (choice == 0)
		{
			printf("已退出:\n");
			return;
		}
		switch(choice)
		{
		case 1:
			printf("请输入要查找联系人的姓名:\n");
			char name[20] = "happy";
			scanf("%s", name);
			find = FindByName(pc, name);
			break;
		case 2:
			printf("请输入要查找联系人的电话号码:\n");
			char tele[20] = "happy";
			scanf("%s", tele);
			find = FindByTele(pc, tele);
			break;
		default:
			printf("选择错误,重新选择:\n");
			break;
		}
	} while (choice != 1 && choice != 2);//选的不是0、1、2还得继续选
	
	if (find == EOF)
	{
		//找不到
		printf("查无此人,退出查找:\n");
		return;
	}
	//找到了
	printf("此人信息为:\n");
	printf("姓名:%s\n", pc->arr[find].name);
	printf("性别:%s\n", pc->arr[find].gender);
	printf("电话号码:%s\n", pc->arr[find].tele);
	printf("年龄:%d\n", pc->arr[find].age);
	printf("地址:%s\n", pc->arr[find].address);

}

4.通讯录删除联系人

//删除通讯录联系人
void DelContact(Contact* pc);

这个功能的实现也比较简单直接,它综合了顺序表增删查改中的查和删,先查后删,首先要根据某一条件,如姓名、电话号码得到对应数据的下标,通过这个下标我们可以直接利用顺序表删除数据的方法删除这个联系人,这里我们以通过姓名删除联系人来做个示范,如下所示:

void DelContact(Contact* pc)
{
	assert(pc);
	printf("请输入要删除人的姓名:\n");
	char name[20] = "happy";
	scanf("%s", name);
	int find = FindByName(pc, name);
	if (find == EOF)
	{
		printf("查无此人:\n");
		return;
	}

	SeqListErase(pc, find);
}

5.通讯录修改联系人:

//修改通讯录
void ModifyContact(Contact* pc);

与删除数据类似,修改通讯录联系人还是需要先通过某一条件找到需要删除数据的下标,再通过这个下标直接修改联系人信息,在修改的时候还是可以用printf备注一下,能让我们在使用的时候更加清晰明了;

void ModifyContact(Contact* pc)
{
	assert(pc);
	printf("请输入要修改的人的姓名:\n");
	char name[20] = "happy";
	scanf("%s", name);
	int find = FindByName(pc, name);
	if (find == EOF)
	{
		printf("查无此人:\n");
		return;
	}
	
	printf("请输入新联系人姓名:\n");
	scanf("%s", pc->arr[find].name);

	printf("请输入新联系人性别:\n");
	scanf("%s", pc->arr[find].gender);

	printf("请输入新联系人电话号码:\n");
	scanf("%s", pc->arr[find].tele);

	printf("请输入新联系人年龄:\n");
	scanf("%d", &pc->arr[find].age);

	printf("请输入新联系人地址:\n");
	scanf("%s", pc->arr[find].address);

	printf("修改成功:\n");

}

6.通讯录展示

//展示通讯录
void ShowContact(Contact* pc);

展示出通讯录这个功能的实现就非常直接了,不过还是要区分好%s和%d的使用,以免程序无法正常执行,我们也可以发挥自己的想象让整个打印的界面更加美观:

void ShowContact(Contact* pc)
{
	assert(pc);
	printf("--------------------------------------\n");
	printf("  姓名   性别   电话号码   年龄   地址  \n");
	for (int i = 0; i < pc->size; i++)
	{
		printf("| %s | %s | %s | %d | %s |\n", pc->arr[i].name,
			pc->arr[i].gender,
			pc->arr[i].tele,
			pc->arr[i].age,
			pc->arr[i].address);
	}
	printf("--------------------------------------\n");
}

通讯录的使用展示:

我们已经知道了通讯录所功能的实现,我们可以通过一个菜单将这些功能串接起来,以此来调用我们的整个通讯录,菜单如下所示:

void menu()
{
	printf("**************************************************\n");
	printf("**********************通讯录***********************\n");
	printf("********** 1.新增联系人      2.删除联系人 **********\n");
	printf("********** 3.修改联系人      4.查找联系人 **********\n");
	printf("********** 5.展示通讯录      0.退出通讯录 **********\n");
	printf("**************************************************\n");
	printf("**************************************************\n");
}

接下来是全部的代码和结果展示:

1.代码实现:

头文件部分:

#pragma once

#define NAME_MAX 20
#define GENDER_MAX 10
#define TELE_MAX 20
#define ADDRESS_MAX 200

//定义一个联系人结构体:——包括姓名、性别、联系电话、年龄,住址;

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


struct SeqList;//提前声明一下需要用到的结构体;


typedef struct SeqList Contact;//将顺序表进化成通讯录—
//顺序表中的每一个数据不再是整型,而是结构体


//通讯录初始化
void InitContact(Contact* pc);

//通讯录销毁
void DestoryContact(Contact* pc);

//添加联系人
void AddContact(Contact* pc);

//查找联系人信息:
void FindContact(Contact* pc);

//通过姓名查找联系人
int FindByName(Contact* pc, char* des);

//通过电话号码查找联系人
int FindByTele(Contact* pc, char* des);

//删除通讯录联系人
void DelContact(Contact* pc);

//修改通讯录
void ModifyContact(Contact* pc);

//展示通讯录
void ShowContact(Contact* pc);

功能实现部分:

#define  _CRT_SECURE_NO_WARNINGS 1

#include "SeqList.h"

void InitContact(Contact* pc)
{
	assert(pc);
	//初始化通讯录就是初始化顺序表
	SeqListInit(pc);
}


void DestoryContact(Contact* pc)
{
	assert(pc);
	//摧毁通讯录也是摧毁链表;
	SeqListDestory(pc);
}


void AddContact(Contact* pc)
{
	assert(pc);
	//添加数据之前要先构建出要添加的数据:
	PI inform;
	printf("请输入联系人姓名:\n");
	scanf("%s", inform.name);

	printf("请输入联系人性别:\n");
	scanf("%s", inform.gender);

	printf("请输入联系人电话号码:\n");
	scanf("%s", inform.tele);

	printf("请输入联系人年龄:\n");
	scanf("%d", &inform.age);

	printf("请输入联系人地址:\n");
	scanf("%s", inform.address);

	//创建完成,直接尾插进通讯录,如同顺序表的尾插:
	SeqListPushBack(pc, inform);

}


int FindByName(Contact* pc, char* des)
{
	assert(pc);
	for (int i = 0; i < pc->size; i++)
	{
		if (strcmp(pc->arr[i].name, des) == 0)
			return i;
	}

	return EOF;
}

int FindByTele(Contact* pc, char* des)
{
	assert(pc);
	for (int i = 0; i < pc->size; i++)
	{
		if (strcmp(pc->arr[i].tele, des) == 0)
			return i;
	}

	return EOF;
}


void FindContact(Contact* pc)
{
	assert(pc);
	//查找的方式有很多种,可以使用姓名或者电话号码;
	int find = 0;
	int choice = 0;
	do
	{
		printf("**************  请选择要查找的方式:**************\n");
		printf("****************** 1.姓名查找 ***********************\n");
		printf("****************** 2.电话查找 **********************\n");
		printf("*************** 0.误选,退出查找 **********************\n");
		printf("请选择:");
		scanf("%d", &choice);
		if (choice == 0)
		{
			printf("已退出:\n");
			return;
		}
		switch(choice)
		{
		case 1:
			printf("请输入要查找联系人的姓名:\n");
			char name[20] = "happy";
			scanf("%s", name);
			find = FindByName(pc, name);
			break;
		case 2:
			printf("请输入要查找联系人的电话号码:\n");
			char tele[20] = "happy";
			scanf("%s", tele);
			find = FindByTele(pc, tele);
			break;
		default:
			printf("选择错误,重新选择:\n");
			break;
		}
	} while (choice != 1 && choice != 2);//选的不是0、1、2还得继续选
	
	if (find == EOF)
	{
		//找不到
		printf("查无此人,退出查找:\n");
		return;
	}
	//找到了
	printf("此人信息为:\n");
	printf("姓名:%s\n", pc->arr[find].name);
	printf("性别:%s\n", pc->arr[find].gender);
	printf("电话号码:%s\n", pc->arr[find].tele);
	printf("年龄:%d\n", pc->arr[find].age);
	printf("地址:%s\n", pc->arr[find].address);

}


void DelContact(Contact* pc)
{
	assert(pc);
	printf("请输入要删除人的姓名:\n");
	char name[20] = "happy";
	scanf("%s", name);
	int find = FindByName(pc, name);
	if (find == EOF)
	{
		printf("查无此人:\n");
		return;
	}

	SeqListErase(pc, find);
}


void ModifyContact(Contact* pc)
{
	assert(pc);
	printf("请输入要修改的人的姓名:\n");
	char name[20] = "happy";
	scanf("%s", name);
	int find = FindByName(pc, name);
	if (find == EOF)
	{
		printf("查无此人:\n");
		return;
	}
	
	printf("请输入新联系人姓名:\n");
	scanf("%s", pc->arr[find].name);

	printf("请输入新联系人性别:\n");
	scanf("%s", pc->arr[find].gender);

	printf("请输入新联系人电话号码:\n");
	scanf("%s", pc->arr[find].tele);

	printf("请输入新联系人年龄:\n");
	scanf("%d", &pc->arr[find].age);

	printf("请输入新联系人地址:\n");
	scanf("%s", pc->arr[find].address);

	printf("修改成功:\n");

}


void ShowContact(Contact* pc)
{
	assert(pc);
	printf("--------------------------------------\n");
	printf("  姓名   性别   电话号码   年龄   地址  \n");
	for (int i = 0; i < pc->size; i++)
	{
		printf("| %s | %s | %s | %d | %s |\n", pc->arr[i].name,
			pc->arr[i].gender,
			pc->arr[i].tele,
			pc->arr[i].age,
			pc->arr[i].address);
	}
	printf("--------------------------------------\n");
}

使用部分:

#define  _CRT_SECURE_NO_WARNINGS 1

#include "SeqList.h"

void TestContact()
{
	Contact con;
	InitContact(&con);
	AddContact(&con);
	AddContact(&con);
	FindContact(&con);

}

enum Contacts
{
	Exit,
	Add,
	Delete,
	Modify,
	Find,
	Show,
};

void menu()
{
	printf("**************************************************\n");
	printf("**********************通讯录***********************\n");
	printf("********** 1.新增联系人      2.删除联系人 **********\n");
	printf("********** 3.修改联系人      4.查找联系人 **********\n");
	printf("********** 5.展示通讯录      0.退出通讯录 **********\n");
	printf("**************************************************\n");
	printf("**************************************************\n");
}


int main()
{
	Contact con;
	InitContact(&con);
	//TestContact();
	int option = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &option);
		switch (option)
		{
		case Add:
			AddContact(&con);
			break;
		case Delete:
			DelContact(&con);
			break;
		case Modify:
			ModifyContact(&con);
			break;
		case Find:
			FindContact(&con);
			break;
		case Show:
			ShowContact(&con);
			break;
        case Exit:
	        printf("退出通讯录:\n");
	        break;
		default:
			printf("选择错误,重新选择:\n");
			break;
		}
	} while (option);
	DestoryContact(&con);

	return 0;
}

2.结果展示:

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

相关推荐

KEPServerEX与三菱iQ-R系列PLC通讯

KEPServerEX与三菱iQ-R系列PLC通讯Mitsubishi Ethernet北京东方鼎晨科技有限公司目 录1. 前言2. 三菱PLC端相关设置3. Kepware端相关设置KEPServerEX是美国PTC Kepware公司生产的具有行业性的连接平台,KEPServerEX支持150多种通讯协议,用于向您的所有应用程序提供单一来源的工业自动化数据。该平台的设计使用户能够通过一个直观的用户界面来连接、管理、监视和控制不同的自动化设备和软件应用程序。KEPServerEX利用OPC(自动化产业的互

qq_28768521的博客 8096

数据结构—顺序表实现通讯录

1. 能够保存用户信息:姓名,性别,年龄,电话,地址等2. 添加联系人信息3. 删除指定联系人4. 查找指定联系人5. 修改联系人信息6.显示联系人信息。

2301_80418043的博客 2127

设备管理器找不到蓝牙?从驱动到BIOS的系统排查指南

在Windows系统中,蓝牙功能依赖硬件、驱动、系统服务三层协同工作。设备管理器作为硬件状态的可视化窗口,当蓝牙设备消失时,往往意味着某一层链路中断。常见原因包括BIOS无线开关关闭、驱动异常、蓝牙支持服务被禁用,或系统文件损坏。排查思路应从基础概念出发,先理解蓝牙设备在设备管理器中的四种隐藏位置,再通过扫描硬件、检查BIOS、重装驱动、修复服务等步骤逐层定位。这一方法不仅适用于Windows电脑,也适用于HC-05、ESP32等嵌入式蓝牙模块,因为硬件、协议栈、应用层的故障逻辑相通。掌握这套技术价值在于减

weixin_33377602的博客 267

位序、字节序、类型序

计算机学科中的很多问题,都是因为概念的抽象模糊,导致理解上的不确定性,增加学习领悟的难度。对于计算机中数据存放次序的问题,很多教材或文章要么含糊其辞,要么凭空飞来结论,让人看的一头雾水。几经周折,结合多篇文章,对内存中数据存放次序终于有了较深入的理解,现记录如下: 一、几个概念:         1.内存中关于数据的存放顺序有三个层次(即三种不同的视角):                  ...

编码人生 4325

关于使用vcpkg下载osgearth遇到的问题

注意--x-manifest-root=后面跟着的E:\gitproject\osgearth-osgearth-3.5\vcpkg是你下载的源码解压缩后vcpkg.json的文件地址,然后等待编译完成。安装vcpkg后使用vcpkg install osgearth:x64-windows安装好osgearth并且导入项目使用时,发现无法运行官方文档中示例的main.cpp。这里写一种自己用过的使用vcpkg安装osgearth3.5的方法,源码,打开vcpkg所在的命令行,执行。示例main.cpp。

m0_61776040的博客 1524

第33次CCF-CSP认证考试 第一题 词频统计 满分题解

本人小白一枚,抱着学习的态度想到网上找一些csp的参考答案,但由于实力有限,大佬的代码大都看不太懂,于是萌生了想用一些简单,基础的语句完成csp前两题的想法并公开,以便与像我这样实力不强的同学交流学习,如有更好的建议,还请斧正,感谢!

qq_75242106的博客 1869

顺序表应用——通讯录实现

通讯录实现的基础是基于顺序表的实现,对于顺序表如有疑惑之处可翻看之前文章。本篇文章是基础顺序表的扩展,如若觉得不大理解,可翻阅顺序表,顺序表明白了此篇文章也会明白的。完!

2302_81016149的博客 1400

从X86到ARM:全面解析服务器CPU架构的演变与未来趋势

本文深入解析了服务器CPU架构从X86到ARM的演变历程与未来趋势。文章从CISC与RISC两种设计哲学切入,分析了X86凭借生态建立的帝国地位及其面临的功耗挑战,并重点阐述了ARM架构凭借其卓越的能效比优势,正从移动端向数据中心市场发起冲击。未来,异构计算、软硬协同与专用芯片将成为服务器CPU发展的核心方向。

gold的博客 1127

【顺序表的应用-通讯录的实现】

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!提示:以下是本篇文章正文内容,下面案例可供参考好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。不积硅步,无以至千里;不积小流,无以成江海。

2301_79585944的博客 666

【保姆级】联想服务器 Ubuntu 装机:RAID 0/1/5/10 从原理到配置(新手也能一次成)

联想服务器RAID配置指南:Ubuntu系统适配方案 摘要: 联想服务器采用LSI MegaRAID硬件控制器,支持RAID0/1/10/5四种阵列模式。RAID0提供最高性能但无冗余,适合临时数据;RAID1完全镜像确保数据安全,推荐用于系统盘;RAID10兼顾性能与冗余,适合数据库等高要求场景;RAID5平衡容量与成本,适用于文件服务器。配置可通过本地BIOS(Ctrl+R)或XCC远程管理完成,Ubuntu安装时可自动识别虚拟磁盘。注意事项包括:使用同型号硬盘、监控重建进度、避免SSD与机械盘混用等。

2501_93651177的博客 488

Vue3 + uniapp 踩坑:iOS 真机调试一直报错Maximum call stack size exceeded,和(in promise)MiniProgramError err的解决方法

不是你写错代码,是微信开发工具和 iOS 真机调试的兼容问题。开个空项目都报错,勾个设置就没问题,不是你,是工具的锅。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1267

【数据结构】 顺序表的应用 - 通讯录的实现

联系人信息至少应该包含:名字、性别、年龄、电话、地址等由于顺序表的底层就是数组,所以我们就是要利用数组来实现如以下所示的结构在通讯录中由于我们要存储的是多个联系人的信息,因此要定义一个结构体来存储联系人的信息以下定义结构体struct PersonInfo来存储联系人的信息,并且使用typedef将该结构体重命名为Info并且在PersonInfo中姓名,性别,电话,住址每个数组的大小可以用#define来定义。//通讯录数据类型//通讯录数据类型int age;}Info;基于。

weixin_74076508的博客 1091

【图像超分】论文复现:Pytorch实现SRCNN!保姆级复现教程!提供完整代码和最优权重模型(x2、x3、x4)!科研级论文曲线图!计算平均PSNR和SSIM!代码Windows和Linux都可用!

由于很多同学反应没用过jupyter notebook,更习惯用pycharm项目的形式跑代码。于是,本文将用pycharm项目的形式,重新复现SRCNN!【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4703

C语言实现顺序表及顺序表的应用--》通讯录

---------------------------顺序表的应用:通讯录-----------------------------//错误示范-----------------------------------------------------------------------------------元素插入部分-----------------------------------元素删除部分-------------------

ShooterJagger的博客 730

假人有限元模型

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

顺序表详解及应用(通讯录的实现)

(2)能够保存用户信息:名字,性别,年龄,电话,地址等。(1)至少能存储100个人的通讯信息。(3)增加联系人信息。(4)删除指定联系人。(5)查找指定联系人。(6)修改指定联系人。(7)显示联系人信息。

2401_83431652的博客 1215

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C语言顺序表的增删查改以及实际应用(通讯录的实现)

这样做的优点在于。

2301_79995226的博客 2085

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【数据结构】顺序表的应用:基于动态顺序表实现通讯录

因为顺序表中不仅可以保存内置类型,还可以保存自定义类型,所以在Contact.h中定义personInfo结构体用来保存联系人信息,并给该类型起别名为PeoInfo为了方便修改,可以将结构体中的数组大小定义为常量// 定义联系人结构// 姓名、性别、年龄、电话、地址int age;}PeoInfo;因为顺序表中存储的数据是自定义类型数据,所以需要在SeqList.h中修改。此处修改完成会出现很多报错,将SeqList.c中报错的代码暂时注释掉即可。

Z2382430464的博客 374

C语言顺序表的应用:基于动态顺序表实现通讯录

本文内容如下: 1.功能要求 2.功能分析 3.功能的实现 3.1通讯录的命名和修改前置代码 3.2通讯录中个人信息的有关操作 3.2.1通讯录的初始化和销毁 3.2.2通讯录的增加、删除和展示信息 3.2.2.1通讯录的增加信息 3.2.2.2通讯录的删除信息、展示信息 3.2.3通讯录的修改和查找 3.2.3.1通讯录的修改 3.2.3.2通讯录的查找 3.3通讯录界面设置 本文代码: 1.功能要求 1)⾄少能够存储100个⼈的通讯信息 2)能够保存用户信息:名字、性别、年龄、电话、地址等 3)增加联系

2302_82004664的博客 1003

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

本文介绍了一个基于动态顺序表实现的简易通讯录系统。系统采用模块化设计,包含顺序表底层(SeqList)、通讯录业务逻辑(contact)和测试菜单(test)三部分。通讯录支持添加、删除、查找、修改、显示联系人等核心功能,并能通过文件操作实现数据持久化。系统初始化时自动加载历史数据,退出时保存当前数据至文件,确保信息不丢失。关键技术点包括结构体存储联系人信息、动态内存管理实现顺序表扩容、文件读写操作等。代码结构清晰,功能完整,可作为C语言数据结构学习的实践案例。

2502_91744920的博客 2917

数据结构:顺序表及其应用-通讯录的实现

本文对顺序表和通讯录进行了详细的解析。

g1569357228的博客 1335

数据结构:通讯录(顺序表的应用)的实现详解

,然后在这个顺序表结构体中我们就可以很明显的看到我们将这个顺序表结构体类型作用为一个已知的类型并且定义了一个数组arr作为顺序表结构体的一个组员,由此可知,一个。

2403_87691282的博客 1404

通讯录的实现(顺序表应用)

上一篇文章我们讲过顺序表的实现,通讯录与顺序表唯一的区别就是修改了变量,将原来的int类型数组修改为结构体数组,再加写扫雷时用到的方法,我们就可以创建这样一个通讯录。我们还是按照函数声明,函数实现与编写本体的顺序来介绍。

z202331720425的博客 364

顺序表的应用---通讯录的实现

摘要:本文介绍基于顺序表实现的通讯录系统,通过封装顺序表来存储联系人数据(包括自定义结构体类型)。系统文件结构包括顺序表头文件(SeqList.h)、通讯录头文件(Contact.h)和源文件(Contact.c),其中顺序表头文件需包含通讯录头文件。实现功能包括通讯录的初始化、销毁、添加联系人(使用scanf_s()获取输入时需注意不同类型变量的地址获取方式)以及删除联系人数据。

2501_90311388的博客 207

【数据结构初阶】顺序表的应用

基于顺序表实现通讯录

凤年徐的博客 2385

NzN的数据结构--顺序表及实现

include<stdio.h> //暂时加上//#include"SeqList.h"//SeqList.h中已经包含了Contact.h,就会造成头文件嵌套问题//解决方法:前置声明//通讯录数据类型int age;}Info;//使用顺序表的前置声明//通讯里提供的操作//通讯录的初始化和销毁//实际初始化的还是顺序表//针对通讯录项目起贴切的名字//增加、删除、修改、查找、查看通讯录。

一个闪现必杀技的博客 2450
上一篇: 两个栈实现队列
下一篇: 反转链表相关问题
鼓浪屿Estelle
博客等级 码龄3年 307粉丝 11原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值