当前位置: 首页 > news >正文

【C/C++】C语言实现顺序表

C语言实现顺序表

  • 简单描述
  • 代码
  • 运行结果

简单描述

  • 用codeblocks编译通过
  • 源码参考连接

https://gitee.com/IUuaena/data-structures-c.git

代码

  • common.h
#ifndef COMMON_H_INCLUDED
#define COMMON_H_INCLUDED#define LIST_INIT_CAPACITY  100 //!< 线性表初始化长度
#define LIST_INCREMENT      10  //!< 线性表增量
#define ELEM_TYPE           int //!< 线性表元素类型/*! @brief 函数返回值枚举 */
typedef enum {OK = 0,             //!< 正确NON_ALLOCATED = 1,  //!< 内存分配失败NON_EXISTENT = 2,   //!< 不存在OVERFLOW = 3,       //!< 溢出ERROR = 4           //!< 其他类型错误
} status_t;#endif // COMMON_H_INCLUDED
  • seq_list.h
#ifndef SEQ_LIST_H_INCLUDED
#define SEQ_LIST_H_INCLUDED#include "common.h"/*!* @brief **线性表*** @note*/
typedef struct {ELEM_TYPE* elements;    //!< 元素数组int length;             //!< 长度int capacity;           //!< 容量
} seq_list_t;// 顺序表初始化
status_t SeqListInit(seq_list_t* seq_list);// 顺序表插入
status_t SeqListInsert(seq_list_t* seq_list, int pos, ELEM_TYPE elem);// 顺序表删除元素
status_t SeqListDelete(seq_list_t* seq_list, int pos, ELEM_TYPE* elem);// 顺序表查找
int SeqListLocate(seq_list_t* seq_list, ELEM_TYPE elem, int (*compare)(ELEM_TYPE, ELEM_TYPE));// 顺序表的合并
status_t SeqListMerge(seq_list_t* list_a, seq_list_t* list_b, seq_list_t* merged_list);// 顺序表打印
void SeqListPrint(seq_list_t* seq_list);#endif // SEQ_LIST_H_INCLUDED

seq_list.c

/*!* @file seq_list.c* @author CyberDash计算机考研, cyberdash@163.com(抖音id:cyberdash_yuan)* @brief 顺序表源文件* @version 1.0.0* @date 2022-07-10* @copyright Copyright (c) 2021*  CyberDash计算机考研*/#include <stdlib.h>
#include <stdio.h>
#include "seq_list.h"/*!* @brief **顺序表初始化*** @param seq_list **顺序表**(指针)* @return **是否成功*** @note* 顺序表初始化* ----------* ----------* - 分配elements数组内存 \n* &emsp; **if** 内存分配失败 : \n* &emsp;&emsp; 返回NON_ALLOCATED \n*/
status_t SeqListInit(seq_list_t* seq_list)
{// 分配elements数组内存seq_list->elements = (ELEM_TYPE*)malloc(LIST_INIT_CAPACITY * sizeof(ELEM_TYPE));if (!seq_list->elements){return NON_ALLOCATED;}// 设置length和capacityseq_list->length = 0;                       // 空表长度为0seq_list->capacity = LIST_INIT_CAPACITY;    // 初始存储容量return OK;
}/*!* @brief **顺序表插入*** @param seq_list **顺序表**(指针)* @param pos **插入位置(插入到该位置结点的前一位置)*** @param elem **待插入元素*** @return **执行结果*** @note* 顺序表插入* ------------* ------------* **注**: 本顺序表实现, 索引从1开始, 区别于数组的从0开始\n* - 插入位置合法性判断 \n* &emsp; **if** 插入位置 < 1 或者 插入位置 > 长度 + 1 : \n* &emsp;&emsp; 返回OVERFLOW \n* - 满容量处理 \n* &emsp; **if** 线性表的容量已满(不扩容无法插入) : \n* &emsp;&emsp; 使用增量LIST_INCREMENT计算新的容量, 并分配新的elements数组内存 \n* &emsp;&emsp; **if** 内存分配失败 : \n* &emsp;&emsp;&emsp; 返回NON_ALLOCATED \n* &emsp;&emsp; 顺序表elements指针指向新数组 \n* &emsp;&emsp; 顺序表capacity增加容量数值 \n* - 插入位置(包含)后面的所有结点向后移动一位 \n* - 插入元素 \n* &emsp; 插入位置赋值 \n* &emsp; 表长+1 \n*/
status_t SeqListInsert(seq_list_t* seq_list, int pos, ELEM_TYPE elem)
{// 插入位置合法性判断if (pos < 1 || pos > seq_list->length + 1){return OVERFLOW;}// 满容量处理if (seq_list->length >= seq_list->capacity){// 使用增量LIST_INCREMENT计算新的容量, 并分配新的elements数组内存unsigned int new_capacity = (seq_list->capacity + LIST_INCREMENT) * sizeof(ELEM_TYPE);ELEM_TYPE* new_elements = (ELEM_TYPE*)realloc(seq_list->elements, new_capacity);if (!new_elements){return NON_ALLOCATED;}seq_list->elements = new_elements;      // 顺序表elements指针指向新数组seq_list->capacity += LIST_INCREMENT;   // 顺序表capacity增加容量数值}// 插入位置(包含)后面的所有结点向后移动一位ELEM_TYPE* insert_pos_elem = seq_list->elements + pos - 1;for (ELEM_TYPE* cur = seq_list->elements + seq_list->length - 1; cur >= insert_pos_elem; cur--){*(cur + 1) = *cur;}*insert_pos_elem = elem;  // 插入elemseq_list->length++;       // 表长增1return OK;
}/*!* @brief **顺序表删除元素*** @param seq_list **顺序表**(指针)* @param pos **被删除结点所在位置*** @param elem **被删除结点的保存变量*** @return **执行结果*** @note* 顺序表删除元素* ------------* ------------* - 删除节点位置正确性检查 \n* &emsp;**if** pos < 1 或者 pos > 线性表长度 : \n* &emsp;&emsp; 返回OVERFLOW \n* - 被删除结点的值赋给保存变量 \n* - 被删除结点后面的所有结点向前移动补位 \n* &emsp; **for loop** 被删除节点后侧所有所有结点 : \n* &emsp;&emsp; 当前结点值赋给前一节点 \n* - 表长减1 \n*/
status_t SeqListDelete(seq_list_t* seq_list, int pos, ELEM_TYPE* elem)
{if (pos < 1 || pos > seq_list->length){return OVERFLOW;}// 待删除节点值赋给保存变量ELEM_TYPE* delete_pos_elem = &(seq_list->elements[pos - 1]);*elem = *delete_pos_elem;ELEM_TYPE* last_elem = seq_list->elements + seq_list->length - 1;   // 表尾元素指针for (ELEM_TYPE* cur = delete_pos_elem + 1; cur <= last_elem; cur++){// 当前结点值赋给前一结点*(cur - 1) = *cur;}// 表长减1seq_list->length--;return OK;
}/*!* @brief **顺序表查找*** @param seq_list **顺序表**(指针)* @param elem **元素值*** @param compare **比较函数*** @return **元素位置*** @note* 顺序表查找* ------------* ------------* 如果没有该元素, 则返回0, 否则返回所在位置(首元素从1开始) \n* - 初始化pos和遍历指针cur \n* &emsp; pos初始化为1(首结点位置) \n* &emsp; cur指向elements数组首元素 \n* - 遍历线性表查找* &emsp; **while** 未遍历完线性表and未找到对应结点 : \n* &emsp;&emsp; pos加1 \n* &emsp;&emsp; cur指向后一元素 \n* - 返回位置 \n* &emsp; 如果找到位置, 返回位置 \n* &emsp; 如果没有找到位置, 返回0 \n*/
int SeqListLocate(seq_list_t* seq_list, ELEM_TYPE elem, int (*compare)(ELEM_TYPE, ELEM_TYPE))
{// 初始化pos和遍历指针curint pos = 1;                            // pos为第1个元素的位置ELEM_TYPE* cur = seq_list->elements;    // cur指向第1个元素的存储位置// 遍历线性表查找while (pos <= seq_list->length && (*compare)(*cur, elem) != 0){pos++;cur++;}// 返回位置if (pos <= seq_list->length){return pos;}return 0;
}/*!* @brief **顺序表的合并*** @param list_a **顺序表a*** @param list_b **顺序表b*** @param merged_list **合并后的顺序表*** @return **执行结果*** @note** 顺序表的合并* ----------* ----------* - 初始化两个顺序表的表头指针/表尾指针 \n* &emsp; list_a_cur指向表a的表头, list_b_cur指向表b的表头 \n* &emsp; list_a_last指向表a的表尾, list_b_last指向表b的表尾 \n* - 合并后的表设置属性分配内存 \n* &emsp; 设置长度/容量 \n* &emsp; 分配内存 \n* &emsp; **if** 内存分配失败 : \n* &emsp;&emsp; 返回NON_ALLOCATED \n* - 执行合并 \n* &emsp; **while** 任意一个表未合并完 : \n* &emsp;&emsp; **if** 表a当前元素 <= 表b当前元素 : \n* &emsp;&emsp;&emsp; 表a当前元素(*list_a_cur)插入合并表表尾 \n* &emsp;&emsp;&emsp; list_a_cur指向后面1位 \n* &emsp;&emsp; **else** (表a当前元素 > 表b当前元素) : \n* &emsp;&emsp;&emsp; 表b当前元素(*list_b_cur)插入合并表表尾 \n* &emsp;&emsp;&emsp; list_b_cur指向后面1位 \n* &emsp;&emsp; merged_list_cur指向后面1位(合并表当前元素向后移动) \n* - 未合并完的表补表尾 \n* &emsp; 表a剩余元素加到合并表尾部(如果表a有剩余) \n* &emsp; 表b剩余元素加到合并表尾部(如果表b有剩余) \n*/
status_t SeqListMerge(seq_list_t* list_a, seq_list_t* list_b, seq_list_t* merged_list)
{ELEM_TYPE* list_a_cur = list_a->elements;   // list_a_cur指针 -> 顺序表a的elements数组首地址ELEM_TYPE* list_b_cur = list_b->elements;   // list_b_cur指针 -> 顺序表b的elements数组首地址ELEM_TYPE* list_a_last = list_a->elements + list_a->length - 1; // last_a_last指针 -> 顺序表a的elements数组尾地址ELEM_TYPE* list_b_last = list_b->elements + list_b->length - 1; // last_b_last指针 -> 顺序表b的elements数组尾地址// 合并后的表设置属性分配内存merged_list->length = list_a->length + list_b->length;  // 长度merged_list->capacity = list_a->capacity + list_b->capacity;        // 容量merged_list->elements = (ELEM_TYPE*)malloc(merged_list->capacity * sizeof(ELEM_TYPE));  // elements数组分配内存if (!merged_list->elements){return NON_ALLOCATED;   // 分配失败}// 执行合并ELEM_TYPE* merged_list_cur = merged_list->elements; // merged_list_cur指针 -> 合并后的顺序表的elements数组首地址while (list_a_cur <= list_a_last && list_b_cur <=list_b_last){// list_a_cur和list_b_cur指向的两个元素, 选择较小的进入merged_list, 对应的cur指针向后移一位, merged_list_cur向后移一位if (*list_a_cur <= *list_b_cur){*merged_list_cur = *list_a_cur;list_a_cur++;}else{*merged_list_cur = *list_b_cur;list_b_cur++;}merged_list_cur++;}// list_a剩余元素加到merged_list尾部(如果list_a有剩余)while (list_a_cur <= list_a_last){*merged_list_cur = *list_a_cur;merged_list_cur++;list_a_cur++;}// list_b剩余元素加到merged_list尾部(如果list_b有剩余)while (list_b_cur <= list_b_last){*merged_list_cur = *list_b_cur;merged_list_cur++;list_b_cur++;}return OK;
}/*!* @brief **顺序表打印*** @param seq_list 顺序表(指针)* @note* 顺序表打印* ---------* ---------* 循环打印顺序表各元素*/
void SeqListPrint(seq_list_t* seq_list)
{for (int i = 0; i < seq_list->length; i++){printf("%d ", seq_list->elements[i]);}
}
  • main.c
#include <stdio.h>
#include <stdlib.h>
#include "seq_list.h"/*!* @brief **比较函数*** @param item1 **元素1*** @param item2 **元素2*** @return **结果*** @note* 比较函数* -------* -------* **if** 元素1 > 元素2 : \n* &emsp; 返回1 \n* **else if** 元素1 = 元素2 : \n* &emsp; 返回0 \n* **else if** 元素1 < 元素2 : \n* &emsp; 返回-1 \n*/
int compare(ELEM_TYPE item1, ELEM_TYPE item2)
{if (item1 > item2){return 1;}else if (item1 == item2){return 0;}else{return -1;}
}/*!* @brief **测试线性表插入*** @note* 测试线性表插入* ------------* ------------**/
void TestSeqListInsert()
{printf("\n");printf("|------------------------ CyberDash ------------------------|\n");printf("|                       测试顺序表的插入                       |\n");seq_list_t* seq_list = (seq_list_t*)malloc(sizeof(seq_list_t));SeqListInit(seq_list);printf("初始化顺序表sqList完成\n\n");ELEM_TYPE elem1 = 1;ELEM_TYPE elem2 = 2;ELEM_TYPE elem3 = 3;printf("在位置1前边插入elem1: %d\n", elem1);SeqListInsert(seq_list, 1, elem1);printf("在位置2前边插入elem2: %d\n", elem2);SeqListInsert(seq_list, 2, elem2);printf("在位置3前边插入elem3: %d\n", elem3);SeqListInsert(seq_list, 3, elem3);printf("\n打印顺序表sqList:\n");SeqListPrint(seq_list);printf("\n-------------------------------------------------------------\n\n");
}/*!* @brief **测试线性表删除*** @note* 测试线性表删除* ------------* ------------*/
void TestSeqListDelete()
{printf("\n");printf("|------------------------ CyberDash ------------------------|\n");printf("|                       测试顺序表的删除                       |\n");seq_list_t* seq_list = (seq_list_t*)malloc(sizeof(seq_list_t));SeqListInit(seq_list);printf("初始化顺序表sqList完成\n\n");ELEM_TYPE elem1 = 1;ELEM_TYPE elem2 = 3;ELEM_TYPE elem3 = 5;printf("在位置1前边插入elem1: %d\n", elem1);SeqListInsert(seq_list, 1, elem1);printf("在位置2前边插入elem2: %d\n", elem2);SeqListInsert(seq_list, 2, elem2);printf("在位置3前边插入elem3: %d\n", elem3);SeqListInsert(seq_list, 3, elem3);printf("\n删除位置2的元素\n");ELEM_TYPE delete_item;SeqListDelete(seq_list, 2, &delete_item);printf("被删除的元素值: %d\n", delete_item);printf("\n打印顺序表sqList:\n");SeqListPrint(seq_list);printf("\n-------------------------------------------------------------\n\n");
}/*!* @brief **测试线性表查找*** @note* 测试线性表查找* ------------* ------------*/
void TestSeqListLocate()
{printf("\n");printf("|------------------------ CyberDash ------------------------|\n");printf("|                       测试顺序表的查找                      |\n");seq_list_t* seq_list = (seq_list_t*)malloc(sizeof(seq_list_t));SeqListInit(seq_list);printf("初始化顺序表sqList完成\n\n");ELEM_TYPE elem1 = 1;ELEM_TYPE elem2 = 3;ELEM_TYPE elem3 = 5;printf("在位置1前边插入elem1: %d\n", elem1);SeqListInsert(seq_list, 1, elem1);printf("在位置2前边插入elem2: %d\n", elem2);SeqListInsert(seq_list, 2, elem2);printf("在位置3前边插入elem3: %d\n", elem3);SeqListInsert(seq_list, 3, elem3);ELEM_TYPE elem0 = 4;int pos0 = SeqListLocate(seq_list, elem0, compare); // 查找elem0的位置int pos1 = SeqListLocate(seq_list, elem1, compare); // 查找elem1的位置printf("\n");printf("elem0:%d在顺序表中的位置:%d\n", elem0, pos0);   // 位置0表示没有该元素printf("elem1:%d在顺序表中的位置:%d\n", elem1, pos1);printf("\n-------------------------------------------------------------\n\n");
}/*!* @brief **测试线性表合并*** @note* 测试线性表合并* ------------* ------------*/
void TestSeqListMerge()
{printf("\n");printf("|------------------------ CyberDash ------------------------|\n");printf("|                       测试顺序表的合并                       |\n");ELEM_TYPE elements[6] = { 1, 2, 3, 4, 5, 6 };seq_list_t* seq_list_a = (seq_list_t*)malloc(sizeof(seq_list_t));SeqListInit(seq_list_a);seq_list_t* seq_list_b = (seq_list_t*)malloc(sizeof(seq_list_t));SeqListInit(seq_list_b);// 顺序表a插入3个元素SeqListInsert(seq_list_a, 1, elements[0]);SeqListInsert(seq_list_a, 2, elements[2]);SeqListInsert(seq_list_a, 3, elements[4]);// 顺序表b插入3个元素SeqListInsert(seq_list_b, 1, elements[1]);SeqListInsert(seq_list_b, 2, elements[3]);SeqListInsert(seq_list_b, 3, elements[5]);printf("顺序表a: ");SeqListPrint(seq_list_a);printf("\n");printf("顺序表b: ");SeqListPrint(seq_list_a);printf("\n");seq_list_t* merged_list = (seq_list_t*)malloc(sizeof(seq_list_t));SeqListInit(merged_list);SeqListMerge(seq_list_a, seq_list_b, merged_list);printf("合并后的顺序表merged: list: \n");SeqListPrint(merged_list);printf("\n-------------------------------------------------------------\n\n");
}int main()
{printf("你好!顺序表\n");TestSeqListInsert();TestSeqListDelete();TestSeqListLocate();TestSeqListMerge();return 0;
}

运行结果

你好!顺序表|------------------------ CyberDash ------------------------|
|                       测试顺序表的插入                       |
初始化顺序表sqList完成在位置1前边插入elem1: 1
在位置2前边插入elem2: 2
在位置3前边插入elem3: 3打印顺序表sqList:
1 2 3
-------------------------------------------------------------|------------------------ CyberDash ------------------------|
|                       测试顺序表的删除                       |
初始化顺序表sqList完成在位置1前边插入elem1: 1
在位置2前边插入elem2: 3
在位置3前边插入elem3: 5删除位置2的元素
被删除的元素值: 3打印顺序表sqList:
1 5
-------------------------------------------------------------|------------------------ CyberDash ------------------------|
|                       测试顺序表的查找                      |
初始化顺序表sqList完成在位置1前边插入elem1: 1
在位置2前边插入elem2: 3
在位置3前边插入elem3: 5elem0:4在顺序表中的位置:0
elem1:1在顺序表中的位置:1-------------------------------------------------------------|------------------------ CyberDash ------------------------|
|                       测试顺序表的合并                       |
顺序表a: 1 3 5
顺序表b: 1 3 5
合并后的顺序表merged: list:
1 2 3 4 5 6
-------------------------------------------------------------Process returned 0 (0x0)   execution time : 0.099 s
Press any key to continue.

相关文章:

【C/C++】C语言实现顺序表

C语言实现顺序表 简单描述代码运行结果 简单描述 用codeblocks编译通过 源码参考连接 https://gitee.com/IUuaena/data-structures-c.git 代码 common.h #ifndef COMMON_H_INCLUDED #define COMMON_H_INCLUDED#define LIST_INIT_CAPACITY 100 //!< 线性表初始化长度 #def…...

零基础快速上手:搭建类ChatGPT对话机器人的完整指南

来自&#xff1a;鸵傲科技开发 随着人工智能技术的飞速发展&#xff0c;对话机器人已经成为我们日常生活中不可或缺的一部分。它们能够实时响应我们的需求&#xff0c;提供便捷的服务。那么&#xff0c;对于零基础的朋友们来说&#xff0c;如何快速搭建一个类似ChatGPT的对话机…...

Java中的取余与取模运算:概念、区别与实例详解

Java中的取余与取模运算&#xff1a;概念、区别与实例详解 引言一、取余运算&#xff08;Remainder Operation&#xff09;二、取模运算&#xff08;True Modulo Operation&#xff09;三、区别比较四、实战应用 引言 在Java编程中&#xff0c;当我们提到“取余”和“取模”运算…...

Excel制作甘特图

使用Excel表格制作甘特图&#xff0c;可根据任务开始时间和结束时间自动计算工时&#xff0c;并自动用指定颜色填充横道图。 1.新建Excel文档&#xff0c;先设置项目基本信息&#xff0c;包括表格名称&#xff0c;这里设置为“**项目甘特图”&#xff1b;然后添加任务序号列&a…...

Dapr(一) 基于云原生了解Dapr

(这期先了解Dapr&#xff0c;之后在推出如何搭建Dapr&#xff0c;以及如何使用。) 目录 引言&#xff1a; Service Mesh定义 Service Mesh解决的痛点 Istio介绍 Service Mesh遇到的挑战 分布式应用的需求 Multiple Runtime 理念推导 Dapr 介绍 Dapr 特性 Dapr 核心…...

RESTful的优点

优点 1.通过url对资源定位&#xff0c;语义清晰&#xff1b; 2.通过HTTP谓词表示不同的操作&#xff0c;接口自描述&#xff1b; 3.可以对GET、PUT、DELETE请求重试&#xff08;幂等的&#xff09;&#xff1b; 4.可以对GET请求做缓存&#xff1b; 5.通过HTTP状态码反映服务器端…...

网络检测与监控

1.IP sla 服务等级质量检测&#xff0c;思科私有&#xff0c;提供商与用户之间的协议 可以对带宽、延迟、丢包率、网络抖动进行检测 &#xff08;1&#xff09;针对icmp进行检测&#xff1a; r1(config)#ip sla 1 r1(config-ip-sla)#icmp-echo 12.12.12.2 source-ip 12.12…...

基于架构的软件开发方法_1.概述和相关概念及术语

1.体系结构的设计方法概述 基于体系结构的软件设计&#xff08;Architecture-Based Software Design&#xff0c;ABSD&#xff09;方法。ABSD方法是由体系结构驱动的&#xff0c;即指由构成体系结构的商业、质量和功能需求的组合驱动的。 使用ABSD方法&#xff0c;设计活动可以…...

读所罗门的密码笔记07_共生思想(中)

1. 在人工智能系统中建立信任 1.1. 人类的大脑容易被个人倾向、干扰因素和确认偏误所影响 1.2. 古莱说&#xff0c;然而&#xff0c;从不同的角度去思考事实、花更长时间来做决策的能力&#xff0c;可能会让人类拥有“密探”一般的智慧 1.3. 我们可以对决策进行批判性思考&a…...

目标检测——工业安全生产环境违规使用手机的识别

一、重要性及意义 首先&#xff0c;工业安全生产环境涉及到许多复杂的工艺和设备&#xff0c;这些设备和工艺往往需要高精度的操作和严格的监管。如果员工在生产过程中违规使用手机&#xff0c;不仅可能分散其注意力&#xff0c;降低工作效率&#xff0c;更可能因操作失误导致…...

Linux/Ubuntu/Debian 终端命令:设置文件/目录权限和组

更改文件权限&#xff1a; chmod filename&#xff1a;根据指定的权限更改文件的权限。 例如&#xff1a; chmod ux filename # 为文件所有者添加执行权限 递归更改目录权限&#xff1a; chmod -R <说明> 目录名称&#xff1a;递归更改目录及其内容的权限。 例如&#xf…...

QA测试开发工程师面试题满分问答3: python的深拷贝和浅拷贝问题

在 Python 中&#xff0c;深拷贝&#xff08;deep copy&#xff09;和浅拷贝&#xff08;shallow copy&#xff09;是用于创建对象副本的两种不同方式。 浅拷贝是创建一个新的对象&#xff0c;该对象与原始对象的内容相同&#xff08;包括内部嵌套对象的引用&#xff09;&…...

Spire.PDF for .NET【文档操作】演示:合并 PDF 文件并添加页码

搜索了这么多有关 PDF 合并的信息后&#xff0c;很容易发现&#xff0c;无论您在线合并 PDF 文件还是使用 C#/VB.NET 来实现此任务&#xff0c;您都无法逃避对 PDF 文件安全等一些重要问题的担忧&#xff0c;因此需要花费多少时间或者合并后的文件是否支持打印页码等等。不过&a…...

VMware使用PowerCLI 修改分布式虚拟交换机的默认上联接口为LAG

简介 创建VMware 分布式交换机vDS 并配置 LACP接口时&#xff0c;然后创建新的默认分布式端口组不会默认使用LACP的上联接口。这意味着当创建新的端口组时&#xff0c;不可避免地会导致没手动修改上联端口的问题&#xff0c;导致网络不通&#xff0c;因为它们无可用的上联端口…...

什么是EDM邮件推广营销?

电子邮件作为最古老的互联网沟通工具之一&#xff0c;凭借其无可比拟的直达性、个性化潜力与高投资回报率&#xff0c;始终占据着企业营销策略的核心地位。随着人工智能技术的革新应用&#xff0c;云衔科技以其前瞻视野与深厚技术底蕴&#xff0c;倾力打造了一站式智能EDM邮件营…...

NoSQL之 Redis配置

目录 关系数据库与非关系型数据库 关系型数据库&#xff1a; ●非关系型数据库 关系型数据库和非关系型数据库区别&#xff1a; &#xff08;1&#xff09;数据存储方式不同 &#xff08;2&#xff09;扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 Redis简介…...

Android U user+root实现方案

背景 由于项目&#xff08;MTK平台&#xff09;上要实现userroot的版本&#xff0c;供特殊用户使用。Android T上的方案无效&#xff0c;经历了各种搜索查看资料&#xff0c;和bsp大佬一起通宵奋战&#xff0c;整出了方案。梳理记录下&#xff0c;有需要的同学可以参考。 Root…...

CSS3 Transform变形理解与应用

Transform&#xff1a;对元素进行变形&#xff1b; Transition&#xff1a;对元素某个属性或多个属性的变化&#xff0c;进行控制&#xff08;时间等&#xff09;&#xff0c;类似flash的补间动画。但只有两个关键贞。开始&#xff0c;结束。 Animation&#xff1a;对元素某个属…...

语音克隆技术浪潮:探索OpenAI Voice Engine的奇妙之旅

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

将Python程序打包为Windows安装包

本文使用创作助手。 如果你想将Python程序打包为Windows安装包&#xff0c;你可以使用NSIS&#xff08;Nullsoft Scriptable Install System&#xff09;工具。NSIS是一个免费的Windows安装包创建工具。 以下是使用NSIS将Python程序打包为Windows安装包的步骤&#xff1a; 首…...

一个基于大数据的派单管理系统

通常需要处理大量的订单数据&#xff0c;并确保这些数据能够在各个相关部门之间高效、准确地传递。这样的系统不仅有助于提高派单效率&#xff0c;还能优化资源配置&#xff0c;减少不必要的浪费。以下是一个包含所需元素的系统设计方案概述&#xff1a; 数据结构 订单号&…...

【单片机 5.3开关检测】

文章目录 前言一、5.3开关检测1.1没按键按下的1.2有按键按下的 二、改进1.改进 三、独立键盘3.1为什么要取反3.2 实用的按键 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 课程需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xf…...

每天五分钟计算机视觉:如何基于滑动窗口技术完成目标的检测?

汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…...

wpf ContextMenu

ContextMenu上下文菜单 ContextMenu 在 WPF 中是一个非常有用的控件&#xff0c;它提供了一个在用户执行特定操作&#xff08;如右键点击&#xff09;时显示的菜单。ContextMenu 可以附加到几乎所有的 WPF 控件上&#xff0c;使得当用户与这些控件互动时&#xff0c;能够提供一…...

增加网站搜索引擎排名的6个准则

怎样提高网站排名首页 在竞争激烈的网络世界中&#xff0c;网站的排名对于吸引流量和提升曝光至关重要。登上搜索引擎结果页面的首页&#xff0c;意味着更多的曝光和点击率。以下是一些方法&#xff0c;可以帮助您提高网站在搜索引擎中的排名&#xff0c;让其跻身首页&#xf…...

【数据库索引】【面试题】【SQL】什么时候不需要用索引?

在数据库查询优化中,索引是一种重要的工具,可以提高查询性能。然而,并不是所有的情况下都适合使用索引。 以下是一些情况下(收集整理)不建议使用索引: 更新频繁的列:索引会占用数据库资源,当列经常被更新时,索引可能会变得过时,导致查询性能下降。 小数值类型:对于…...

RISC-V/ARM mcu OpenOCD 调试架构解析

Risc-v/ARM mcu OpenOCD 调试架构解析 最近有使用到risc-v的单片机&#xff0c;所以了解了下risc-v单片机的编译与调试环境的搭建&#xff0c;面试时问到risc-v的调试可参看以下内容。 risc-v根据官方的推荐&#xff0c;调试器服务是选择OpenOCD&#xff0c;DopenOCD(开放片上…...

HackTheBox-Mist

整体思路 端口扫描->Pluck CMS组件文件读取漏洞->文件上传获取shell->创建指向exe的快捷方式来提权-> 信息收集&端口利用 namp -sSVC 10.10.11.17目标只开放了80端口&#xff0c;将mist.htb加入到hosts文件后&#xff0c;访问mist.htb Pluck CMS文件读取 在…...

游戏引擎中的声音系统

一、声音基础 1.1 音量 声音振幅的大小 压强p&#xff1a;由声音引起的与环境大气压的局部偏差 1.2 音调 1.3 音色 1.4 降噪 1.5 人的听觉范围 1.6 电子音乐 将自然界中连续的音乐转换成离散的信号记录到内存中 采样 - 量化 - 编码 香农定理&#xff1a;采样频率是信…...

【WPF应用29】WPF中的ComboBox控件详解与应用示例

在Windows Presentation Foundation&#xff08;WPF&#xff09;应用程序开发中&#xff0c;ComboBox控件是一个非常重要的基础控件&#xff0c;它提供了一个下拉列表&#xff0c;允许用户从预定义的选项中选择一个值。ComboBox控件结合了文本框和列表框的功能&#xff0c;既能…...

网站获取用户/google代理

在其他语言中为了避免类和方法重名问题&#xff0c;都有一个类似命名空间的概念&#xff0c;在js中实现类似的功能吗&#xff1f; 可以实现&#xff0c;主要是借助于js中对象的概念来实现&#xff0c;例如&#xff1a; 1 在命名空间中定义方法属性 var GiantCorp GiantCorp||{…...

微信网站/免费加精准客源

在Java&#xff0c;尽管有类库Arrays.sort(arr)可以让我们对数组进行排序&#xff0c;当我们参加笔试时&#xff0c;要对一些经典排序算法进行书写&#xff0c;这就要求我们能够写出一些基本的排序算法;本文想讲下希尔排序&#xff0c;但在希尔排序前&#xff0c;我们先谈谈插入…...

公司使用威联通nas做网站存储/有没有免费推广平台

关注我们&#xff0c;下载更多资源刘伟刘伟&#xff0c;云和恩墨软件开发部研究院研究员&#xff1b;前微博DBA&#xff0c;主要研究方向为开源数据库&#xff0c;分布式数据库&#xff0c;擅长自动化运维以及数据库内核研究。◆◆前言◆◆即便是从数据库特性,SQL功能性等方面,…...

外贸网站如何推广优化/昆明网络营销公司哪家比较好

mysql错误1054modify的解决办法就是给字符串加上引号&#xff0c;语句如“insert into stock(code,name,b_price,s_price,num,rate,profit) values (123,qq,1)。mysql 1054错误往数据库插入数据的时候报错&#xff0c;插入数据的是这样的[SQL] insert into stock(code,name,b_p…...

视频结交网站怎么做/网络营销首先要做什么

Java集合知识概括集合框架概述Collection方法Iterator迭代器接口Collection子接口一&#xff1a;ListCollection子接口二&#xff1a;SetMap接口Collections工具类集合总结集合框架概述 简介&#xff1a; 面向对象语言对事物的体现都是以对象的形式&#xff0c;为了方便对多个…...

青岛企业网站制作/汕头自动seo

文章目录参考局部敏感哈希&#xff08;LSH&#xff09;基本原理介绍背景LSH 的基本思想LSH 的哈希函数族&#xff08;Hash Family&#xff09;LSH 的查找过程LSH 常见的 Hash Function参考 LSH(Locality Sensitive Hashing)原理与实现。 局部敏感哈希(Locality-Sensitive Has…...