c-数据结构(顺序表、链表)

news/2024/9/18 21:09:21/ 标签: 数据结构, c语言, 链表

概念

对于n各元素的线性表,严格数学定义:其中任意一个数据元素a[i],有且仅有一个前驱a[i-1],有且仅有一个后继a[i+1];首元素a[0]无前驱,尾元素a[n-1]无后继。

顺序表

属于线性表,数据之间的空间是连续,如具名的栈数组,匿名的堆数组。

链表

属于线性表,数据之间的空间不连续(离散),如结构体。

链表
  • 顺序表设计

    1. 顺序表容量;

    2. 顺序表当前最末元素下标位置;

    3. 顺序表指针;

    顺序表
  • 顺序表的相关数据操作代码
    //math文件夹
    ------------------------------------------------------------------------------------------
    seqlist.h
    ------------------------------------------------------------------------------------------
    #ifndef __SEQLIST_H
    #define __SEQLIST_H#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>//定义顺序表的结构体
    typedef struct
    {int capacity;	//顺序表的容量(本质为数组);int last;		//末元素下标int* data;		//数据
    } seqList;//创建顺序表
    seqList *initList(int cap);//判断顺序表是否满了
    bool isFull(seqList *list);//向顺序表表头插入新数据
    bool insert(seqList *list, int data);//遍历顺序表元素
    void show(seqList *list);//删除顺序表指定元素
    bool removeNode(seqList *list, int data);//销毁顺序表
    void destroy(seqList *list);
    #endif
    ------------------------------------------------------------------------------------------
    seqlist.c
    ------------------------------------------------------------------------------------------ 
    #include "seqlist.h"//初始化顺序表
    seqList *initList(int cap)
    {//申请内存seqList *list = malloc(sizeof(seqList));//顺序表非空校验if(list != NULL){//给数据区分配空间list->data = malloc(cap * sizeof(int));if(list->data == NULL){free(list);return NULL;}list->capacity = cap;list->last = -1;}
    }//判断顺序表是否满了
    bool isFull(seqList *list)
    {return list->last == list->capacity - 1;	//尾结点与下标的对应关系
    }//向顺序表表头插入新数据
    bool insert(seqList *list, int data)
    {//判断顺序表是否满了if(isfull(list)){return false;}//将原有数据全部向后移动一位,腾出空间for(int i = list->last; i >= 0; i--){list->data[i+1] = list->data[i];}//将数据插入表头list->data[0] = data;list->last++;return true;
    }//遍历顺序表元素
    void show(seqList *list)
    {//判断是否为空if(list->lats == -1){return;}//遍历for(int i = 0; i <= list->last; i++){printf("%d ", list->data[i]);}printf("\n");
    }//删除顺序表指定元素
    bool removeNode(seqList *list, int data)
    {//判断顺序表是否为空if(isFull(list)){return false;}//找到要产出元素结点int pos;for(int i = 0; i <= list->last; i++){if(list->data[i] == data){pos = i;break;}}//若找不到要删除的的节点if(i > list->last){return false;}//将截至到删除节点后所有元素前移for(int i = pos; i < list->last; i++){list->data[i] = list->data[i+1];}list->last--;return true;
    }//销毁顺序表
    void destroy(seqList *list)
    {if(list == NULL){return;}free(list->data);	//销毁顺序表中的是数据free(list);			//销毁顺序表
    }------------------------------------------------------------------------------------------
    seqlist_main.c
    ------------------------------------------------------------------------------------------
    #include "seqlist.h"int main()
    {//创建顺序表seqList *list = initList(10);if(lits == NULL){perror("初始化顺序表失败!");//结束进程exit(0);}else{printf("初始化顺序表成功!");}int n;	//键盘录入整数printf("请输入人一个整数:\n");while(true){scanf("%d", &n);//控制循环跳出if(n == 0){printf("循环跳出\n");break;}else if(n > 0){//插入数据if(!insert(list,n)){printf("容量已满,插入失败!\n");continue;}}else{//删除数据if(!removeNode(list,-n)){printf("查无此数,删除失败!\n");continue;}}//遍历顺序表show(list);}//销毁destroy(list);
    }
    顺序表优缺点
  • 优点

    1. 无需多余信息来记录数据间关系,数据存储密度高;

    2. 存储空间连续,随机访问速度快;

  • 缺点

    1. 插入删除数据时,需要成片移动数据,很不方便;

    2. 数据节点较多时,需要一整片较大连续空间;

    3. 数据节点数量变化剧烈,内存的释放和分配不灵活;

  • 链表基本操作

    1. 节点设计;

    2. 初始化空链表

    3. 增删节点;

    4. 链表遍历;

    5. 销毁链表

  • 链表
    链表相关数据操作代码
    //math1文件夹
    ----------------------------------------------------------------------------------------------
    slist.h
    ----------------------------------------------------------------------------------------------
    #ifndef	__SLIST_H
    #define __SLIST_H#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>typedef int DATA;//创建单链表的结构体
    typedef struct Node
    {DATA data;			//存储数据struct Node *next;	//存储下一节点地址
    }NODE;//初始化单链表结构体
    int slist_create(NODE**, DATA);//向单链表插入一个数据(头插法)
    int slist_addHead(NODE**, DATA);//向单链表插入一个数据(尾插法)
    int slist_addTail(NODE**, DATA);//向单链表插入一个数据(中间插法)
    int slist_insert(NODE**, DATA, DATA);//删除单链表中的数据
    int slist_delete(NODE**, DATA);	参考中间插法//查找链表中的数据
    NODE* slist_find(const NODE*, DATA);//修改更新链表数据
    int slist_update(const NODE*, DATA, DATA);//遍历链表
    void slist_showAll(const NODE*);//销毁单链表
    void slist_destroy(NODE**);#endif
    ----------------------------------------------------------------------------------------------
    slist.c
    ----------------------------------------------------------------------------------------------
    #include "slist.h"/*
    @function:   int slist_create(NODE** head,DATA data);
    @berif:     创建单项链表
    @argument:   head: 指向头指针变量的地址,用来接收首节点地址data: 存储在节点中的数据
    @return :   成功返回 0失败返回 -1
    */
    //初始化单链表结构体
    int slist_create(NODE** head, DATA data)
    {NODE* p = (NODE*)malloc(sizeof(NODE));//非空校验if(!p){return -1;}//单链表赋初值p->data = data;p->next = NULL;*head = p;return 0;
    }/*
    @function:   int slist_addHead(NODE** head,DATA data);
    @berif:     向链表头部插入一个节点数据
    @argument:   head: 指向头指针变量的地址,用来接收首节点地址data: 存储在新节点中的数据
    @return :   成功返回 0失败返回 -1
    */
    //向单链表插入一个数据(头插法)
    int slist_addHead(NODE** head, DATA data)
    {NODE* p = (NODE*)malloc(sizeof(NODE));if(!p){return -1;}p->data = data;p->next = *head;*head = p;return 0;
    }/*
    @function:   int slist_addTail(NODE** head,DATA data);
    @berif:     向链表尾部插入一个节点数据
    @argument:   head: 指向头指针变量的地址,用来接收首节点地址data: 存储在新节点中的数据
    @return :   成功返回 0失败返回 -1
    */
    //向单链表插入一个数据(尾插法)
    int slist_addTail(NODE** head, DATA data)
    {NODE* pNew = (NODE*)malloc(sizeof(NODE));if(!pNew){return -1;}pNew->data = data;pNew->next = NULL;//寻找尾节点,默认头节点为尾节点,并创建临时变量qNODE *p = *head, *q = NULL;if(!p){*head = pNew;return 0;}while(p){q = p;p = p->next;}q->next = pNew;	//将要插入的数放在原先尾节点的后面作为新的尾节点return 0;
    }/*
    @function:   int slist_insert(NODE** head,DATA pos ,DATA data);
    @berif:     向链表节点值为pos的位置插入一个节点数据data
    @argument:   head: 指向头指针变量的地址pos: 插入节点位置的节点数据data: 存储在新节点中的数据
    @return :   成功返回 0失败返回 -1
    */
    //向单链表插入一个数据(中间插法)
    int slist_insert(NODE** head, DATA pos, DATA data)
    {//创建新节点NODE *pNew = (NODE*)malloc(sizeof(NODE));if(!pNew){return -1;}//给新结点赋值pNew->data = data;pNew->next = NULL;NODE *p = *head, *q = NULL;//第一种情况,若原链表无任何一个节点if(!p){*head = pNew;	//新节点作为头节点return 0;}//第二种情况,原链表只有一个头节点if(memcmp(&(p->data),&pos,sizeof(DATA)) == 0){pNew->next = *head;		//头插法*head = pNew;return 0;}//第三种情况,原链表有多个节点while(p){//尾插法if(memcmp(&(p->data),&pos,sizeof(DATA)) == 0){//两句顺序不可调换,否则会覆盖pNew->next = p;	q->next = pNew;return 0;}//此时,q为前驱,p为后继;依次往后走q = p;p = p->next;}//第四种情况,要插入的位置pos不存在q->next = pNew;return 0;
    }/*
    @function:   int slist_delete(NODE** head,DATA data);
    @berif:     删除链表中节点值为data的节点
    @argument:   head: 指向头指针变量的地址data: 删除节点中的数据
    @return :   成功返回 0失败返回 -1
    */
    //删除单链表中的数据
    int slist_delete(NODE** head, DATA data)
    {NODE* p = *head, *q = NULL;//第一种情况,若原链表无任何一个节点if(!p){return -1;}//第二种情况,要删除的刚好是头节点if(memcmp(&(p->data),&data,sizeof(DATA)) == 0){*head = p->next;free(p);return 0;}//第三种情况,逐个查找要删除的节点while(p){if(memcmp(&(p->data),&data,sizeof(DATA)) == 0){q->next = p->next;//这一步释放p并不影响数据的删除free(p);return 0;}q = p;p = p->next;}return -1;
    }/*
    @function:   NODE* slist_find(const NODE* head,DATA data);
    @berif:     查找链表数据data
    @argument:   head: 指向头指针变量data: 待查找的数据
    @return :   成功返回节点的地址失败返回NULL
    */
    //查找链表中的数据
    NODE* slist_find(const NODE* head, DATA data)
    {const NODE* p = head;while(p){if(memcmp(&(p->data),&data,sizeof(DATA)) == 0){return (NODE*)p;}p = p->next;}return NULL;
    }/*
    @function:   int slist_update(const NODE* head,DATA old,DATA newdata);
    @berif:     更新链表数据old 为 newdata
    @argument:   head: 指向头指针变量old: 待更新的节点数据newdata: 更新后的节点数据
    @return :   成功返回 0失败返回 -1
    */
    //修改更新链表数据
    int slist_update(const NODE* head, DATA old_data, DATA new_data)
    {NODE* p = NULL;if( !(p = slist_find(head,old_data)) ){return -1;}p->data = new_data;return 0;
    }/*
    @function:   void slist_showAll(const NODE* head);
    @berif:     遍历链表数据
    @argument:   head: 指向头指针变量
    @return :   无
    */
    //遍历链表
    void slist_showAll(const NODE* head)
    {const NODE* p = head;while(p){printf("%d ", p->data);p = p->next;}printf("\n");
    }/*
    @function:   void slist_destroy(NODE** head);
    @berif:     回收链表
    @argument:   head: 指向头指针变量的地址
    @return :   无
    */
    //销毁单链表
    void slist_destroy(NODE** head)
    {NODE* p = *head, *q = NULL;while(p)	//逐个遍历回收{q = p;p = p->next;free(q);}*head = NULL;
    }
    ----------------------------------------------------------------------------------------------
    slist_main.c
    ----------------------------------------------------------------------------------------------
    #include "slist.h"
    #define DELETE 1int main()
    {NODE *head = NULL;if (slist_create(&head, 888) < 0){perror("单链表创建失败!");// exit(0);return -1;}printf("单链表创建成功!\n");slist_addTail(&head, 999);slist_addTail(&head, 222);slist_addTail(&head, 666);slist_addTail(&head, 777);	// 运行效果:999 222 666 777slist_addHead(&head, 555);	// 运行效果:555 999 222 666 777slist_insert(&head, 555, 1024);	// 运行效果:1024 555 999 222 666 777slist_insert(&head, 222, 1080);	// 运行效果:1024 555 999 1080 222 666 777slist_showAll(head);DATA data;while (1){
    #ifdef DELETEprintf("请输入要删除的数据:");scanf("%d", &data);if (data == -1)break;if (slist_delete(&head, data) < 0){puts("删除失败,请重试");continue;}slist_showAll(head);
    #elseNODE *pFind = NULL;DATA newdata = 512;printf("请输入要查找的数据:");scanf("%d", &data);if (data == -1)break;// if(!(pFind = slist_find(head,data)))if (slist_update(head, data, newdata) == -1){puts("查找的数据不存在,请重试");continue;}// printf("查找数据:%d  内存地址:%p\n",pFind -> data, &(pFind -> data));slist_showAll(head);
    #endif}slist_destroy(&head);puts("====销毁后====");slist_showAll(head);return 0;
    }
    链表
    链表相关数据操作代码
    //math2文件夹
    ----------------------------------------------------------------------------------------------
    dlist.h
    ----------------------------------------------------------------------------------------------
    #ifndef __DLIST_H
    #define __DLIST_H#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>typedef int DATA;//定义双向链表结构体
    typedef struct node
    {DATA data;          //数据struct node *prev;  //前驱指针struct node *next;  //后继指针
    }NODE;//创建双向链表
    int dlist_create(NODE**, DATA);//向双链表插入数据(头插法)
    int dlist_addHead(NODE**, DATA);//向双链表插入数据(尾插法)
    int dlist_addTail(NODE**, DATA);//向双链表插入数据(中间插法)
    int dlist_insert(NODE**, DATA, DATA);//链表数据查询
    NODE* dlist_find(const NODE*, DATA);//链表数据更新
    int dlist_update(const NODE*, DATA, DATA);//链表数据遍历
    void dlist_showAll(const NODE*);//链表数据删除
    int dlist_delete(NODE**, DATA);//销毁双链表
    void dlist_destroy(NODE**);#endif
    ----------------------------------------------------------------------------------------------
    dlist.c
    ----------------------------------------------------------------------------------------------
    #include "dlist.h"//创建双向链表
    int dlist_create(NODE** head, DATA data)
    {//创建新节点NODE* pNew = (NODE*)malloc(sizeof(NODE));//判断是否申请成功if(!pNew){return -1;}//给节点赋初值pNew->data = data;              //数据pNew->prev = pNew->next = NULL; //前驱后继指向空*head = pNew;                   //新节点作为头节点return 0;
    }//向双链表插入数据(头插法)
    int dlist_addHead(NODE** head, DATA data)
    {//创建新节点,申请内存空间NODE *pNew = (NODE*)malloc(sizeof(NODE));//判断是否申请成功if(!pNew){return -1;}//给新节点赋值pNew->data = data;pNew->prev = NULL;pNew->next = *head;//如果头节点存在if(*head){(*head)->prev = pNew;}*head = pNew;return 0;
    }//向双链表插入数据(尾插法)
    int dlist_addTail(NODE** head, DATA data)
    {//创建新节点,申请内存NODE *pNew = (NODE*)malloc(sizeof(NODE));//判断是否申请成功if(!pNew){return -1;}//给新节点赋初值pNew->data = data;pNew->next = pNew->prev = NULL;NODE *p = *head;//第一种情况,头节点不存在if(!p){*head = pNew;return 0;}//第二种情况,有一个或多个结点while (p->next) //循环来找到尾结点{p = p->next;}//尾节点的后继指向新插入节点p->next = pNew;//新插入节点的前驱指向尾节点pNew->prev = p;return 0;
    }//向双链表插入数据(中间插法)
    int dlist_insert(NODE** head, DATA pos, DATA data)
    {//创建新节点,申请空间NODE* pNew = (NODE*)malloc(sizeof(NODE));//判断是否申请成功if(!pNew){return -1;}//给新节点赋初值pNew->data = data;pNew->next = pNew->prev = NULL;NODE* p = *head, *q = NULL;//第一种情况,没有头节点if(!p){*head = pNew;return 0;}//第二种情况,只有一个头节点if(memcmp(&(p->data),&pos,sizeof(DATA)) == 0){pNew->next = p;p->prev = pNew;*head = pNew;return 0;}//第三种情况,有多个节点while (p){if(memcmp(&(p->data),&pos,sizeof(DATA)) == 0){/*顺序:先自己再别人,先后再前*/pNew->next = p;pNew->prev = q;p->prev = pNew;q->next = pNew;return 0;}q = p;p = p->next;}//第四种情况,找不到要插入的位置(也就是找不到pos)q->next = pNew;pNew->prev = q;return 0;
    }//链表数据查询
    NODE* dlist_find(const NODE* head, DATA data)
    {const NODE* p = head;while (p){if (memcmp(&(p->data),&data,sizeof(DATA)) == 0){return (NODE*)p;}//向后查询p = p->next;//向前查询//p = p->prev;}return NULL;
    }//链表数据更新
    int dlist_update(const NODE* head, DATA old_data, DATA new_data)
    {NODE* p = NULL;if( !(p = dlist_find(head,old_data))){return -1;}p->data = new_data;return 0;
    }//链表数据遍历
    void dlist_showAll(const NODE* head)
    {const NODE* p = head;while(p){//两种遍历方式不可同时使用printf("%d ", p->data);//向后遍历p = p->next;//向前遍历//p = p->prev;}printf("\n");
    }//链表数据删除
    int dlist_delete(NODE** head, DATA data)
    {NODE* p = *head;//第一种情况,原链表没有节点if(!p){return -1;}//第二种情况,要删除的刚好是头节点if(memcmp(&(p->data),&data,sizeof(DATA)) == 0){//1.链表中只有一个节点if(p->next == NULL){free(p);*head = NULL;return 0;}//2.链表中有两个以上节点*head = p->next;        //此前head和p都指向头节点p->next->prev = NULL;   //解除p的引用关系free(p);return 0;}//第三种情况,逐个查找要删除节点while (p){if(memcmp(&(p->data),&data,sizeof(DATA)) == 0){p->prev->next = p->next;    //解除上一个节点和被删节点的关系//要删除的p刚好是尾节点if(p->next == NULL){p->prev->next = NULL;}else    //要删除的p不是尾节点{p->next->prev = p->prev;}free(p);return 0;}p = p->next;    //改变循环条件}return -1;  
    }//销毁双链表
    void dlist_destroy(NODE** head)
    {NODE* p = *head, *q = NULL;while (p){//实现指针尾随q = p;p = p->next;free(q);}*head = NULL;
    }
    ----------------------------------------------------------------------------------------------
    dlist_main.c
    ----------------------------------------------------------------------------------------------
    #include "dlist.h"
    #define OP   2  int main(void)
    {NODE*  head = NULL;int a[] = {1,3,5,7,9};int n = sizeof a / sizeof a[0];register int i = 0;for(; i < n; i++){dlist_addTail(&head,a[i]);}dlist_showAll(head);while(1){
    #if (OP == 0)DATA   data;NODE   *pFind = NULL;printf("请输入要查找的数据(-1 退出):");scanf("%d",&data);if(data == -1)break;if(!(pFind = dlist_find(head,data))){puts("查找的数据不存在,请重试...");continue;}  printf("在内存地址为 %p 的内存空间中找到了 %d\n",&(pFind->data),pFind->data);
    #elif (OP == 1)   DATA   data;NODE   *pFind = NULL;printf("请输入要插入位置的数据(-1 退出):");scanf("%d",&data);if(data == -1)break;if(dlist_insert(&head,data,407)){puts("插入失败,请重试...");continue;}dlist_showAll(head);
    #elseDATA   data;NODE   *pFind = NULL;printf("请输入要删除位置的数据(-1 退出):");scanf("%d",&data);if(data == -1)break;if(dlist_delete(&head,data)){puts("删除失败,请重试...");continue;}dlist_showAll(head);
    #endif}dlist_destroy(&head);puts("=====回收后====");dlist_showAll(head);return 0;
    }
    链表优缺点
  • 优点

    1. 插入删除数据仅需调整几个指针,较为便捷;

    2. 数据节点较多时,无需整片连续空间,可利用离散内存;

    3. 节点变化剧烈时,内存的分配和释放灵活、速度快;

  • 缺点

    1. 不支持立即随机访问任意随机数据;

    2. 需要多余指针记录节点间的关联关系;


http://www.ppmy.cn/news/1518512.html

相关文章

在 Java 中使用泛型时遇到的问题,,无法正确将响应数据映射为需要的数据

public <T> List<T> getOrderList(String shopId, Class<T> tClass) {// --- 省略一些中间过程----ParameterizedTypeReference<KeRuYunCommonResultVO<KPOSPageResultVO<T>>> responseType new ParameterizedTypeReference<KeRuYunCom…

Python日志,按日期分割日志文件(每天一个新的日志文件)

为了创建一个Python类来管理日志&#xff0c;并使其支持按日期分割日志文件&#xff08;每天一个新的日志文件&#xff09;&#xff0c;你可以使用Python标准库中的logging模块和logging.handlers.TimedRotatingFileHandler。下面是一个简单的示例&#xff0c;展示了如何实现这…

linux怎么安装Android Studio

方法一 下载安装包到linux系统解压 tar.gz文件的解压方式为 tar -zxvf 文件名&#xff08;tar -zxvf filename.tar.gz 命令的作用是&#xff0c;使用gzip解压缩&#xff08;-z&#xff09;&#xff0c;解包&#xff08;-x&#xff09;名为filename.tar.gz的归档文件&#xf…

使用PostgreSQL的CLI客户端查询数据不显示问题

问题 今天在使用PostgreSQL的命令行工具&#xff08;CLI&#xff09;查询数据时&#xff0c;数据不显示问题。 解决 使用CLI客户端登录数据库后&#xff0c;需要设置打印&#xff0c;设置边框为2: peterlocalhost testdb> \pset border 2或者&#xff0c;使用元组方式显…

clerk中authenticateWithRedirect方法讲解

clerk.authenticateWithRedirect 主要用于处理 Clerk 的 OAuth 登录过程&#xff0c;其工作流程大致如下&#xff1a; 1、用户发起登录请求&#xff1a; 用户点击登录按钮&#xff0c;触发 OAuth 登录流程。 2、重定向到 OAuth 提供商&#xff1a; clerk.authenticateWithRed…

回溯法-0/1背包问题

什么是回溯法&#xff1f; 回溯法是一种搜索算法&#xff0c;它通过深度优先搜索的方式来解决决策问题。它从根节点开始&#xff0c;逐步扩展节点&#xff0c;直到找到所有可能的解。 回溯法的基本思想 开始节点&#xff1a;从根节点出发&#xff0c;这个节点是解空间的起点…

word文档转html(只支持段落和表格)

maven依赖<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> import org.apache.poi.xwpf.usermodel.*;import java.io.*;public class Wor…

基于Java+SpringMvc+Vue求职招聘系统详细设计实现

基于JavaSpringMvcVue求职招聘系统详细设计实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &…

【60天备战软考高级系统架构设计师——第三天:软件工程原则与常用方法】

开篇 软件工程的原则和方法指导开发团队在项目中组织和管理代码及架构。这些原则和方法可以帮助团队提高软件的可维护性和可扩展性。今天&#xff0c;我将重点介绍软件工程中的一些基本原则以及常用方法和工具&#xff0c;帮助大家更好地应对实际开发中的挑战。 软件工程的基…

【Spring Boot 3】【Web】配置HTTPS

【Spring Boot 3】【Web】配置HTTPS 背景介绍开发环境开发步骤及源码工程目录结构背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或…

【Android】UIMode

要修改 Android 设备的 UiMode&#xff08;用户界面模式&#xff09;&#xff0c;可以使用 UiModeManager 类进行设置。不同的 UI 模式适用于不同的使用场景&#xff0c;比如夜间模式、汽车模式等。下面是一些常见的修改方法&#xff1a; 1. 修改夜间模式 夜间模式可以通过 U…

Ubuntu/Linux 配置 locale

文章目录 Ubuntu/Linux 配置 locale1 概述2 locale2.1 locale 规则命令规则环境变量优先级 2.2 查看当前 locale 设置2.3 查看当前系统所有可用的 locale2.4 安装中文 locale 语言环境/字符集2.5 安装 locales 包2.6 使用 locale-gen 命令生成语言支持2.7 设置当前默认字符集 3…

基于机器学习的工业制造缺陷分析预测系统

B站视频及代码下载&#xff1a;基于机器学习的工业制造缺陷分析预测系统-视频-代码 1. 项目简介 制造缺陷是工业生产过程中面临的重大挑战之一&#xff0c;对产品质量和生产效率产生直接影响。准确预测和分析制造缺陷的发生&#xff0c;可以帮助企业提高生产质量、降低成本&…

【Linux】:文件IO

目录 1.C文件接口 1.1 当前路径是什么&#xff1f; 1.2 "w"和"a"​编辑 2.系统文件I/O 2.1 "比特宏"标识符的实现: 2.2 open 1.系统默认创建文件的权限只写 2.设置新建文件的权限 3. 覆盖写/清空写/追加写 3.访问文件的本质 3.1 文件…

Java 入门指南:Java Socket 网络通信编程

Socket Socket&#xff08;套接字&#xff09;是用于网络通信的编程接口、网络通信的基础&#xff0c;通过它可以实现不同计算机之间的数据传输&#xff0c;应用程序可以通过它发送或接收数据&#xff1b;就像操作文件那样可以打开、读写和关闭。它提供了一种机制&#xff0c;…

Scrcpy手机投屏投屏到电脑上(windows/mac)

项目场景&#xff1a; 在开发app程序时&#xff0c;需要进行投屏演示程序。市面上有很多可用软件&#xff0c;但是体验感不友好&#xff08;1收费、2操作繁琐&#xff0c;3手机端PC端都需要下载对应的软件&#xff09;很头痛&#xff01;&#xff01;&#xff01; Scrcpy是真的…

需方软件供应链安全保障要求及开源场景对照自评表(上)

国标《信息安全技术 软件供应链安全要求》确立了软件供应链安全目标&#xff0c;规定了软件供应链安全风险管理要求和供需双方的组织管理和供应活动管理安全要求。 开源软件供应链作为软件供应链的一种特殊形式&#xff0c;该国标亦适用于指导开源软件供应链中的供需双方开展组…

灵神算法题单——不定长滑动窗口(求最长最大)

1208. 尽可能使字符串相等 简单的滑动窗口三部曲&#xff1a;移入窗口、是否移出、更新结果。 算差值这里采用abs()函数来实现 class Solution { public:int equalSubstring(string s, string t, int maxCost) {int ls.size();int ant0,miINT_MIN;for(int i0,j0;i<l;i){a…

什么是IP地域封锁?有什么作用?

在互联网的广阔世界里&#xff0c;信息流通无界&#xff0c;但出于安全、管理或特定业务需求&#xff0c;对访问者的地域进行限制成为了一种常见的做法。这就是所谓的“IP地域封锁”。本文将深入探讨IP地域封锁的定义、实施方式以及其在实际应用中的作用。 一、IP地域封锁的定…

获取当前计算机的处理器架构platform.machine()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 获取当前计算机的处理器架构 platform.machine() 选择题 关于以下代码的输出结果说法正确的是&#xff1f; import platform print("【执行】print(platform.machine())") prin…