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

C语言数据结构:链表的增删改查及动态创建

目录

一,链表与数组

① 定义区别

② 实现区别

二,链表遍历和计算链表中节点数量

① 链表遍历

② 计算节点数量

三,查找链表节点

四,增加节点到链表中

① 在节点后方插入

② 在节点前方插入

● 在头节点前方插入

● 在其他节点前方插入

五,删除链表中指定的节点

① 删除链表头节点

② 删除链表其它节点

六,修改链表中指定的节点

七,动态创建链表

① 头插法创建链表

② 尾插法创建链表


一,链表与数组

① 定义区别

数组:数组是在内存中连续存储的具有相同类型的一组数据的集合

      ● 数组中数的类型必须相同;

      ● 数组中数在内存中必须是连续存储的

链表:把它想象成自行车链条,由n个节点组成,可以对这些节点进行“增,删,改,查”等操作,即对数据的操作。

      ● 可以进行动态存储分配

      ● 可以在节点中定义多种数据类型

      ● 用NULL来表示空节点;

      ● 链表都有一个头指针,一般以head来表示,存放的是一个地址

      ● 链表中包含头结点其它节点两种,头结点是没有数据域的;

      ● 链表中每个节点都分为两个区域,一个数据域,一个是指针域;

② 实现区别

数组:

#include <stdio.h>int main()
{int i;int arr[] = {1,2,3,4,5,6,7,8};int len = sizeof(arr)/sizeof(arr[0]);for(i=0;i<len;i++){printf("%d ",arr[i]);}putchar('\n');printf("number=%d\n",len);return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4 5 6 7 8 
number=8

链表:

#include <stdio.h>struct Test{int data;struct Test *next;
};int main()
{struct Test t1 = {1,NULL};struct Test t2 = {2,NULL};struct Test t3 = {3,NULL};struct Test t4 = {4,NULL};t1.next = &t2; //t1节点的下一个节点为&t2,因为struct Test *next,所以要取地址t2.next = &t3; //t2节点的下一个节点为&t3t3.next = &t4; //t3节点的下一个节点为&t4printf("%d %d %d %d\n",t1.data,t1.next->data,t1.next->next->data,t1.next->next->next->data);//此处以结构体的方式打印,用来引入链表主题return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4

二,链表遍历和计算链表中节点数量

① 链表遍历

struct Test *p = head;              //定义链表头while(p != NULL){           //如果链表头不为空printf("%d ",p->data);  //就先打印链头的值p = p->next;        //一直链接下一个数的值,不断打印,直到节点值为NULL就停止
#include <stdio.h>struct Test{int data;struct Test *next;
};void printLink(struct Test *head)
{struct Test *p = head;      //定义链表头while(p != NULL){           //如果链表头不为空printf("%d ",p->data);  //就先打印链头的值p = p->next;        //一直链接下一个数的值,不断打印,直到节点值为NULL就停止}putchar('\n');
}
int main()
{struct Test t1 = {1,NULL};struct Test t2 = {2,NULL};struct Test t3 = {3,NULL};struct Test t4 = {4,NULL};t1.next = &t2;t2.next = &t3;t3.next = &t4;printLink(&t1); //此处t1就是链头,要取链表头的地址return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4

② 计算节点数量

int cnt = 0;  //接收链表数量       struct Test *p = head;while(p != NULL){  //如果链头不为空,那么cnt++直到链尾出现NULL就停止cnt++;    p = p->next;}return cnt; //返回值取cnt
#include <stdio.h>struct Test{int data;struct Test *next;
};void printLink(struct Test *head)
{struct Test *p = head;while(p != NULL){printf("%d ",p->data);   //遍历链表部分p = p->next;}putchar('\n');
}int numLinkList(struct Test *head)
{int cnt = 0;  //接收链表数量       struct Test *p = head;while(p != NULL){  //如果链头不为空,那么cnt++直到链尾出现NULL就停止cnt++;    p = p->next;}return cnt; //返回值取cnt
}
int main()
{int ret;struct Test t1 = {1,NULL};struct Test t2 = {2,NULL};struct Test t3 = {3,NULL};struct Test t4 = {4,NULL};t1.next = &t2;t2.next = &t3;t3.next = &t4;printLink(&t1); //遍历链表ret = numLinkList(&t1);  //t1为链头,该函数传参就传t1的地址printf("num = %d\n",ret);return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4 
num = 4

三,查找链表节点

int searchLinklist(struct Test *head,int n)//定义n为要查找的节点
{struct Test *p = head;while(p != NULL){if(p->data == n){   //如果头节点就是我们要查找的节点return 1;   //那么返回值为1,表示找到}p = p->next;  //否者就继续往下一个节点查找,直到找到或者节点为空就停止}return 0;        //一直没找到就返回0;
}
#include <stdio.h>struct Test{int data;struct Test *next;
};void printLink(struct Test *head)
{struct Test *p = head;while(p != NULL){printf("%d ",p->data); //遍历链表部分p = p->next;}putchar('\n');
}int searchLinklist(struct Test *head,int n)
{struct Test *p = head;while(p != NULL){if(p->data == n){   //如果头节点就是我们要查找的节点return 1;   //那么返回值为1,表示找到}p = p->next;  //否者就继续往下一个节点查找,直到找到或者节点为空就停止}return 0;        //一直没找到就返回0;
}
int main()
{int ret;struct Test t1 = {1,NULL};struct Test t2 = {2,NULL};struct Test t3 = {3,NULL};struct Test t4 = {4,NULL};t1.next = &t2;t2.next = &t3;t3.next = &t4;printLink(&t1);//遍历链表ret = searchLinklist(&t1,3); //查找3这个节点if(ret == 1){    //如果返回值为1printf("have 3\n"); //就查找到3这个节点}else{printf("no 3\n");  //否者就没有3这个节点}ret = searchLinklist(&t1,7); //查找7这个节点if(ret == 1){printf("have 7\n");}else{printf("no 7\n");}return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4   //遍历出来的链表节点
have 3    //查找到有3这个节点
no 7      //没有查找到7这个节点

四,增加节点到链表中

① 在节点后方插入

逻辑分析:

● 函数中需要定义新插入的节点new,和在哪个节点后插入n;

● 遍历链表,找到要插入的节点位置;while(p != NULL){p = p->next;}

● 如果链头就是要找的那个节点:p->data == n;

● 新节点的下一个=找的那个节点的下一个:new->next = p->next

● 找的那个节点的下一个节点就是新插入的节点:p->next = new; 

#include <stdio.h>struct Test{int data;struct Test *next;
};void printLink(struct Test *head)   //遍历链表部分
{struct Test *p = head;while(p != NULL){printf("%d ",p->data);p = p->next;}putchar('\n');
}void searchBehindLink(struct Test *head,struct Test *new,int n)
{                                    //new为新节点,n为要在哪个节点后插入节点struct Test *p = head;while(p != NULL){    //需要遍历步骤,找到要在那个节点后方插入节点      if(p->data == n){ //如果链头的值就是要找的那个节点new->next = p->next; //新节点的下一个=找的那个节点的下一个p->next = new; //找的那个节点的下一个就是新插入的节点}p = p->next;}
}
int main()
{int ret;struct Test t1 = {1,NULL};struct Test t2 = {2,NULL};struct Test t3 = {3,NULL};struct Test t4 = {4,NULL};struct Test new = {100,NULL}; //定义要插入的节点,插入的数是100t1.next = &t2;t2.next = &t3;t3.next = &t4;printLink(&t1);//遍历searchBehindLink(&t1,&new,3);//在节点3后面插入新节点100printLink(&t1);//插入新节点后在遍历一次,看是否插入成功return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4         //原先的节点数
1 2 3 100 4     //插入成功,在3节点后方插入100

② 在节点前方插入

● 在头节点前方插入

如果在头结点插入新节点,那么头节点的地址就会发生改变,需要定义指针变量来接收新的头结点地址。

#include <stdio.h>struct Test{int data;struct Test *next;
};void printLink(struct Test *head) //遍历链表部分
{struct Test *p = head;while(p != NULL){printf("%d ",p->data);p = p->next;}putchar('\n');
}struct Test *searchFrontLink(struct Test *head,struct Test *new,int n)
{struct Test *p = head;if(p->data == n){  //链表头的前方插入new->next = p; //直接让新节点new->next等于现在的头就行了return new; //返回一个new}
}
int main()
{int ret;struct Test t1 = {1,NULL};struct Test t2 = {2,NULL};struct Test t3 = {3,NULL};struct Test t4 = {4,NULL};struct Test new = {102,NULL}; //插入102struct Test *head = NULL;t1.next = &t2;t2.next = &t3;t3.next = &t4;head = &t1;printLink(head);//遍历链表head = searchFrontLink(head,&new,1);//返回的是new,main函数中的头发生改变,重新用head来接收printLink(head);//添加完成,再次遍历链表,验证是否插入成功return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4      //遍历链表
102 1 2 3 4  //在头节点前方插入新节点102,插入成功

● 在其他节点前方插入

struct Test *searchFrontLink(struct Test *head,struct Test *new,int n)
{struct Test *p = head;while(p->next != NULL){ //此时没有在链头的前方插入,所以要定义链头的下一个不为NULLif(p->next->data == n){   //链头的下一个节点就是我们要找的节点new->next = p->next; //插入进来的新节点就是头节点的下一个p->next = new; //头节点的下一个就是新节点return p; //此时要返回到头} p = p->next;}return p; //返回头节点
}
#include <stdio.h>struct Test{int data;struct Test *next;
};void printLink(struct Test *head)
{struct Test *p = head;while(p != NULL){printf("%d ",p->data);p = p->next;}putchar('\n');
}struct Test *searchFrontLink(struct Test *head,struct Test *new,int n)
{struct Test *p = head;while(p->next != NULL){ //此时没有在链头的前方插入,所以要定义链头的下一个不为NULLif(p->next->data == n){   //链头的下一个节点就是我们要找的节点new->next = p->next; //插入进来的新节点就是头节点的下一个p->next = new; //头节点的下一个就是新节点return p; //此时要返回到头} p = p->next;}return p; //返回头节点
}
int main()
{int ret;struct Test t1 = {1,NULL};struct Test t2 = {2,NULL};struct Test t3 = {3,NULL};struct Test t4 = {4,NULL};struct Test new = {102,NULL}; //插入新节点102struct Test *head = NULL;t1.next = &t2;t2.next = &t3;t3.next = &t4;head = &t1;printLink(head);searchFrontLink(head,&new,3); //插在节点3的前面printLink(head);return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4 
1 2 102 3 4  //在节点3的前面插入新节点102

五,删除链表中指定的节点

删除节点后,内存中会存在残留的缓存数据,需要使用free()来释放地址空间,而free()一般是需要承接malloc()动态开辟了的地址空间。

① 删除链表头节点

逻辑分析:

● 删除的是头节点,所以不需要遍历;

● 确定头节点就是我们要删除的节点:p->data == n;

● 那么新的头节点就是原来头节点的下一个节点:head = head->next;

● 释放删除节点的内存空间:free();

● 删除链头,链头地址发生改变,需要返回新的链头

#include <stdio.h>
#include <stdlib.h>struct Test{int data;struct Test *next;
};void printLink(struct Test *head)
{struct Test *p = head;while(p != NULL){printf("%d ",p->data);p = p->next;}putchar('\n');
}struct Test *deletLink(struct Test *head,int n)
{struct Test *p = head;if(p->data == n){  //如果头节点的值就是我们要删除的节点head = head->next; //那么新的头节点就是原来头节点的下一个节点free(p); //删除了节点就要释放删除节点的内存return head;//链头被删除,头发生了改变,就要返回新链头}
}
int main()
{int ret;struct Test t1 = {1,NULL};struct Test t2 = {2,NULL};struct Test t3 = {3,NULL};struct Test t4 = {4,NULL};struct Test *head = NULL;struct Test *p = (struct Test *)malloc(sizeof(struct Test));//动态开辟链头地址空间
//      t1.next = &t2;p->data = 1;//头节点里的值为1p->next = &t2;//头节点的下一个节点为t2t2.next = &t3;t3.next = &t4;//      head = &t1;head = p;printLink(head);head = deletLink(head,1);//头发生该表,需要新的链头来承接链表头printLink(head);return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4 
2 3 4     //头结点1被删除

② 删除链表其它节点

逻辑分析:

● 遍历链表,遍历出要删除的其它节点;

● 因为不是删链头,所以循环遍历的条件为:p->next != NULL;

● 找到要删除的节点:p->next->data == n;

● 返回值为链头

#include <stdio.h>struct Test{int data;struct Test *next;
};void printLink(struct Test *head)
{struct Test *p = head;while(p != NULL){printf("%d ",p->data);p = p->next;}putchar('\n');
}struct Test *deletLink(struct Test *head,int n)
{struct Test *p = head;while(p->next != NULL){  //不是删除头节点,所以定义头节点的下一个节点不为NULLif(p->next->data == n){  //如果头节点的下一个节点就是我们要删除的节点p->next = p->next->next; //那么头节点的下一个就是头节点下一个的下一个return head;}p = p->next;}
}
int main()
{int ret;struct Test t1 = {1,NULL};struct Test t2 = {2,NULL};struct Test t3 = {3,NULL};struct Test t4 = {4,NULL};struct Test *head = NULL;t1.next = &t2;t2.next = &t3;t3.next = &t4;head = &t1;printLink(head);head = deletLink(head,2);printLink(head);return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4 
1 3 4    //节点2被删除

六,修改链表中指定的节点

int changeLink(struct Test *head,struct Test *new,int n)
{struct Test *p = head;while(p != NULL){   //遍历if(p->data == n){ //如果头结点的data就是我们=要改变的节点np->data = new->data;//那么找到的节点数据就等于要改的数据return 1;//返回1,修改成功}p = p->next;//没有找到那个节点,就一直遍历到NULL节点停止}
}
#include <stdio.h>struct Test{int data;struct Test *next;
};void printLink(struct Test *head)
{struct Test *p = head;while(p != NULL){printf("%d ",p->data);p = p->next;}putchar('\n');
}int changeLink(struct Test *head,struct Test *new,int n)
{struct Test *p = head;while(p != NULL){   //遍历if(p->data == n){ //如果头结点的data就是我们=要改变的节点np->data = new->data;//那么找到的节点数据就等于要改的数据return 1;//返回1,修改成功}p = p->next;//没有找到那个节点,就一直遍历到NULL节点停止}
}
int main()
{struct Test t1 = {1,NULL};struct Test t2 = {2,NULL};struct Test t3 = {3,NULL};struct Test t4 = {4,NULL};struct Test *head = NULL;struct Test new = {9,NULL};//要改成的节点为9t1.next = &t2;t2.next = &t3;t3.next = &t4;head = &t1;printLink(head);changeLink(head,&new,3);//修改节点3为节点9printLink(head);return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
1 2 3 4 
1 2 9 4  //将节点3改为节点9,如果修改头节点也没有问题 

七,动态创建链表

① 头插法创建链表

每一次创建的新节点插入在上一个头节点之前,再让新创建的节点为链头

#include<stdio.h>
#include<stdlib.h>struct Test//声明结构体类型
{int data;//定义数据域struct Test *next;//定义指针域
};//遍历链表
void printLink(struct Test *head)
{struct Test *p = head;while(p != NULL){//p现在是链表头,会一直遍历链表尾NULL时停止printf("%d ",p->data);//输出p节点中data的值p = p->next;//使p指向下一节点}printf("\n");
}struct Test* insertFromHead(struct Test* head,struct Test* new)
{if(head == NULL){//判断链表是否为空head = new;//如果为空把创建的新节点当作链表头}else{new->next = head;//当链表不为空的时候,让新节点插在链表头的前面(称之为头插法)head = new;//再让新节点成为链表头}return head;
}//动态创建链表(头插法)
struct Test* creatLink(struct Test* head)
{struct Test* new;while(1){new = (struct Test*)malloc(sizeof(struct Test));//不断为新节点开辟空间new->next = NULL;printf("input your ne node data:\n");scanf("%d",&(new->data));//输入节点的数据域(data)if(new->data == 0){//判断每次输入的值是否为0,如果为0,停止创建并退出printf("quit!\n");return head;}head = insertFromHead(head,new);}return head;
}int main()
{struct Test* head = NULL;head = creatLink(head);printLink(head);return 0;
}
dhw@dhw-virtual-machine:~$ ./a.out
input your ne node data:
1
input your ne node data:
2
input your ne node data:
3
input your ne node data:
4
input your ne node data:
5
input your ne node data:
6
input your ne node data:
0     //输入0就退出程序
quit!
6 5 4 3 2 1  //从头插入,每一个新插入的节点都为链表头

② 尾插法创建链表

如果头节点为空,那么创建的第一个节点就当做链表头,后面每次创建的新节点都依次插在链表最后一个节点的后面

#include<stdio.h>
#include<stdlib.h>struct Test
{int data;//定义数据域struct Test *next;//定义指针域
};//遍历链表
void printLink(struct Test *head)
{struct Test *p = head;while(p != NULL){//p现在是链表头,会一直遍历链表尾NULL时停止printf("%d ",p->data);//输出p节点中data的值p = p->next;//使p指向下一节点}printf("\n");
}struct Test* insertBehind(struct Test* head,struct Test* new)
{struct Test* p = head;if(p == NULL){//判断链表是否为空return head = new;//如果为空把创建的新节点当作链表头}while(p->next != NULL){//遍历到最后一个节点p = p->next;//使p指向下一节点}p->next = new;//把新节点插入最后一个节点的指针域(next)中return head;//把链表头传回去
}//动态创建链表(尾插法)
struct Test* creatLink(struct Test* head)
{struct Test* new;while(1){new = (struct Test*)malloc(sizeof(struct Test));//开辟空间new->next = NULL;printf("input your ne node data:\n");scanf("%d",&(new->data));//输入节点的数据域(data)if(new->data == 0){//判断每次输入的值是否为0,如果为0,停止创建并退出printf("quit!\n");return head;//返回到头}head = insertBehind(head,new);}
}int main()
{struct Test* head = NULL;head = creatLink(head);printLink(head);}
dhw@dhw-virtual-machine:~$ ./a.out
input your ne node data:
1
input your ne node data:
2
input your ne node data:
3
input your ne node data:
4
input your ne node data:
5
input your ne node data:
6
input your ne node data:
0      //输入0就退出程序
quit!
1 2 3 4 5 6  //按创建节点的顺序,新节点依次往后排列

相关文章:

C语言数据结构:链表的增删改查及动态创建

目录 一&#xff0c;链表与数组 ① 定义区别 ② 实现区别 二&#xff0c;链表遍历和计算链表中节点数量 ① 链表遍历 ② 计算节点数量 三&#xff0c;查找链表节点 四&#xff0c;增加节点到链表中 ① 在节点后方插入 ② 在节点前方插入 ● 在头节点前方插入 ● 在…...

「Python 基础」I/O 编程、正则表达式

文章目录1. I/O 编程文件读写StringIO 和 BytesIO操作文件和目录序列化2. 正则表达式进阶re 模块1. I/O 编程 I/O指Input/Output&#xff1b; Input Stream 从外面&#xff08;磁盘、网络&#xff09;流进内存&#xff1b; Output Stream 从内存流到外面&#xff1b; 同步 …...

java 把pdf图片文档和文章文档转成文字的方法

java 提供了一些库和工具可以用来把 PDF 文档和图片文档转成文本。 Apache PDFBox&#xff1a;这是一个开源的 PDF 库&#xff0c;可以用来提取 PDF 文件中的文本内容。 iText&#xff1a;这是一个用于创建和处理 PDF 文件的库&#xff0c;可以用来提取 PDF 文件中的文本内容。…...

JavaScript 中的全部对象

宿主对象&#xff08;host Objects&#xff09;&#xff1a;由 JavaScript 宿主环境提供的对象&#xff0c;它们的行为完全由宿主环境决定。 【 浏览器环境宿主&#xff0c;全局对象window&#xff0c;window 上又有很多属性&#xff0c;如 document。 全局对象 window 上的属…...

【教学典型案例】23.部分服务总是频繁出现掉线情况

目录一&#xff1a;背景介绍问题描述解决二&#xff1a;问题分析过程解决过程设计到的知识1、nacos的data目录作用。2、nacos data目下的protocol目录3、nacos ip混乱问题三&#xff1a;总结一&#xff1a;背景介绍 问题描述 因为某些特殊原因需要把nacos迁移到另一个版本的n…...

线程安全 List 效率测试

List 常见类以及各自优缺点可自行参考 https://blog.csdn.net/weixin_39883065/article/details/111197724 本机环境 java 版本&#xff1a;1.8.0_161 window 信息&#xff1a; 测试代码 下面通过代码测试 List 线程安全类 Vector、Collections.synchronizedList(List lis…...

LeetCode 热题 C++ 581. 最短无序连续子数组 617. 合并二叉树

581. 最短无序连续子数组 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组&#xff0c;并输出它的长度。 示例 1&#xff1a; 输入&am…...

鉴源论坛 · 观模丨模型检查综述

作者 | 李建文 华东师范大学软件工程学院博导 版块 | 鉴源论坛 观模 01 模型检查的历史 模型检查是一种起源于20世纪70年代末的形式化验证技术。该技术最初由Edmund M. Clarke、E. Allen Emerson和Joseph Sifakis提出&#xff0c;他们因在模型检查领域的贡献而获得了2007年的…...

Easy Deep Learning——池化层

池化是什么&#xff1f;它有什么作用&#xff1f; 还是草地的场景&#xff0c;把草地分成一块块的网格&#xff0c;数量还是太多了&#xff0c;如何继续简化输入数据呢? 这时候可以只取一块网格中所有的小草的大小形状的平均值或者最大值作为一个输入数据&#xff0c;这样就大…...

TryHackMe-VulnNet: Active(ez 域渗透)

VulnNet: Active VulnNet Entertainment在他们以前的网络中遇到了不好的时光&#xff0c;该网络遭受了多次破坏。现在&#xff0c;他们移动了整个基础架构&#xff0c;并再次聘请您作为核心渗透测试人员。您的目标是获得对系统的完全访问权限并破坏域。 这应该是我在thm打的最…...

TencentOS Server 安装 PostgreSQL

TencentOS 简介 2019 年&#xff0c;随着腾讯公司外部客户的需求&#xff0c;以及公司开源协同战略的推进&#xff0c;tlinux 对外开源并进行了品牌升级&#xff0c;升级为 TencentOS Server。TencentOS 包含三大场景&#xff0c;分别如下&#xff1a; TencentOS Server&…...

多线程的风险 --- 线程安全

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; ✨每日一语&#xff1a;低头赶路&#xff0c;敬事如仪&#xff1b;自知自心&#xff0c;其路则明。 目 录&#x1f378;一. 线程不安全&#x1f379;二. 线程不安全的原因&#x1f…...

Linux信号详解

文章目录Linux信号什么是信号**从生活角度理解: **技术应用角度的信号进程的注意事项信号概念用kill -l命令可以察看系统定义的信号列表信号处理常见方式概览信号产生通过终端按键产生信号使用signal函数自定义SIGINT信号的处理方式使用sigprocmask函数阻塞2号信号和40号信号vo…...

JAVA使用POI操作EXCEL

设置公式totalRow.createCell(4).setCellFormula("SUM(E9:E35");// 执行公式wb.setForceFormulaRecalculation(true);合并单元格sheet.addMergedRegion(new CellRangeAddress(0, 0, 3, 7));单元格格式CellStyle cellStyle wb.createCellStyle();// 字体XSSFFont fon…...

只做笔记有必要买apple pencil吗?苹果笔的代替笔推荐

如果仅仅使用IPAD来进行打游戏和看剧的话&#xff0c;未免有些浪费。ipad的作用还是挺大的&#xff0c;可以用来做学习笔记&#xff0c;也可以用来做绘画&#xff0c;也可以用来做一些重要的内容。很多人都会认为&#xff0c;苹果的电容笔很好用&#xff0c;但是价格上要比一般…...

Hive---sqoop安装教程及sqoop操作

sqoop安装教程及sqoop操作 文章目录sqoop安装教程及sqoop操作上传安装包解压并更名添加jar包修改配置文件添加sqoop环境变量启动sqoop操作查看指定mysql服务器数据库中的表在hive中创建一个teacher表跟mysql的mysql50库中的teacher结构相同将mysql中mysql50库中的sc数据导出到h…...

【C++】register 关键字

文章目录一. 什么是寄存器&#xff1f;二. 为什么要存在寄存器&#xff1f;三. register 修饰变量一. 什么是寄存器&#xff1f; 我们都知道&#xff0c;CPU主要是负责进行计算的硬件单&#xff0c;但是为了方便运算&#xff0c;一般第一步需要先把数据从内存读取到CPU内&…...

剑指 Offer II 024. 反转链表

题目链接 剑指 Offer II 024. 反转链表 easy 题目描述 给定单链表的头节点 head&#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;h…...

从Linux内核中学习高级C语言宏技巧

Linux内核可谓是集C语言大成者&#xff0c;从中我们可以学到非常多的技巧&#xff0c;本文来学习一下宏技巧&#xff0c;文章有点长&#xff0c;但耐心看完后C语言level直接飙升。 本文出自&#xff1a;大叔的嵌入式小站&#xff0c;一个简单的嵌入式/单片机学习、交流小站 从…...

详解Python的装饰器

Python中的装饰器是你进入Python大门的一道坎&#xff0c;不管你跨不跨过去它都在那里。 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数。 def say_hello():print "hello!"def say_goodbye():print "hello!" # bug hereif…...

k8s-Pod域名学习总结

k8s-Pod域名学习总结 大纲 k8s内置DNS服务 配置Pod的域名服务 CornDNS配置 默认Pod的域名 自定义Pod的域名 实战需求 1 Pod有自己的域名 2 集群内部的Pod可以通过域名访问其他的Pod 基础准备&#xff1a; 1 k8s 集群版本1.17 k8s内置DNS服务 k8s1.17安装完成后自动创建…...

0405习题总结-不定积分

文章目录1 不定积分的基本概念2 直接积分法-基本积分公式3 第一换元法-凑微分形式法4 第二类换元法5 分部积分求不定积分6 表格法积分7 有理函数求积分后记1 不定积分的基本概念 例1 f(x){x1,x≥012e−x12,x<0求∫f(x)dxf(x) \begin{cases} x1,\quad x\ge0\\ \frac{1}{2}e^…...

QT 常用控件类型命名参考

拟定的QT的控件命名规则&#xff1a;蛇形命名方式 控件类型开头&#xff0c;以下是QT控件类型命名的参考范例 Buttons Buttons起始字符串对象名称举例Push Buttonbuttonbutton_loginTool Buttontool_button / buttonbutton_switchRadio Buttonradio_button / radioradio_boy…...

MATLAB与图像处理的那点小事儿~

目录 一、学习内容 二、matlab基本知识 三、线性点运算 四、非线性点运算&#xff0c;伽马矫正 五、直方图 1、直方图均衡化 &#xff08;1&#xff09;使用histep函数实现图像均衡化 &#xff08;2&#xff09;使用自行编写的均衡化函数实现图像均衡化 2、直方图规定…...

第十四届蓝桥杯模拟赛(第三期)Java组个人题解

第十四届蓝桥杯模拟赛&#xff08;第三期&#xff09;Java组个人题解 今天做了一下第三期的校内模拟赛&#xff0c;有些地方不确定&#xff0c;欢迎讨论和指正~ 文章目录第十四届蓝桥杯模拟赛&#xff08;第三期&#xff09;Java组个人题解填空题部分第一题【最小数】第二题【E…...

Go语言之条件判断循环语句(if-else、switch-case、for、goto、break、continue)

一、if-else条件判断语句 Go中的if-else条件判断语句跟C差不多。但是需要注意的是&#xff0c;Go中强制规定&#xff0c;关键字if和else之后的左边的花括号"{“必须和关键字在同一行&#xff0c;若使用了else if结构&#xff0c;则前段代码快的右花括号”}"必须和关…...

深入理解AQS

概念设计初衷&#xff1a;该类利用 状态队列 实现了一个同步器&#xff0c;更多的是提供一些模板方法&#xff08;子类必须重写&#xff0c;不然会抛错&#xff09;。 设计功能&#xff1a;独占、共享模式两个核心&#xff0c;state、Queue2.1 statesetState、compareAndSetSta…...

JVM学习笔记十:执行引擎

0. 前言 声明&#xff1a; 感谢尚硅谷宋红康老师的讲授。 感谢广大网友共享的笔记内容。 B站&#xff1a;https://www.bilibili.com/video/BV1PJ411n7xZ 本文的内容基本来源于宋老师的课件&#xff0c;其中有一些其他同学共享的内容&#xff0c;也有一些自己的理解内容。 1. …...

【2023-03-10】JS逆向之美团滑块

提示&#xff1a;文章仅供参考&#xff0c;禁止用于非法途径 前言 目标网站:aHR0cHM6Ly9wYXNzcG9ydC5tZWl0dWFuLmNvbS9hY2NvdW50L3VuaXRpdmVsb2dpbg 页面分析 接口流程 1.https://passport.meituan.com/account/unitivelogin主页接口&#xff1a;需获取下面的参数&#xff0…...

全志V853芯片放开快启方案打印及在快起方式下配置isp led的方法

全志V85x芯片 如何放开快启方案的打印&#xff1f; 1.主题 如何放开快启方案的打印 2.问题背景 产品&#xff1a;v851系列快启方案 软件&#xff1a;tina 其他&#xff1a;特有版本信息添加自由描述 &#xff08;如固件版本&#xff0c;复现概率&#xff0c;特定环境&#x…...

大数据 | (一)Hadoop伪分布式安装

大数据原理与应用教材链接&#xff1a;大数据技术原理与应用电子课件-林子雨编著 Hadoop伪分布式安装借鉴文章&#xff1a;Hadoop伪分布式安装-比课本详细 大数据 | &#xff08;二&#xff09;SSH连接报错Permission denied&#xff1a;SSH连接报错Permission denied 哈喽&a…...

Django/Vue实现在线考试系统-06-开发环境搭建-Django安装

1.0 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(…...

KaiwuDB 时序引擎数据存储内存对齐技术解读

一、理论1、什么是内存对齐现代计算机中内存空间都是按照 byte 划分的&#xff0c;在计算机中访问一个变量需要访问它的内存地址&#xff0c;从理论上看&#xff0c;似乎对任何类型的变量的访问都可以从任何地址开始。但在实际情况中&#xff0c;通常在特定的内存地址才能访问特…...

IR 808 Alkyne,IR-808 alkyne,IR 808炔烃,近红外吲哚类花菁染料

【产品理化指标】&#xff1a;中文名&#xff1a;IR-808炔烃英文名&#xff1a;IR-808 alkyne&#xff0c;Alkyne 808-IR CAS号&#xff1a;N/AIR-808结构式&#xff1a;规格包装&#xff1a;10mg&#xff0c;25mg&#xff0c;50mg&#xff0c;接受各种复杂PEGS定制服务&#x…...

elasticsearch

这里写目录标题1.初识ElasticSearch1.1 了解ES1.2 倒排索引1.2.1 正向索引1.2.2 倒排索引1.2.3 正向和倒排1.3 ES的一些概念1.3.1 文档和字段1.3.2 索引和映射1.3.3 mysql和elasticsearch1.4 安装ES、kibana1.初识ElasticSearch 1.1 了解ES elasticsearch是一款非常强大的开源…...

并发编程---java锁

java锁一 多线程锁synchronized案例分析1.1synchronized介绍1.2 synchronized案例分析1.2.1.标准访问&#xff0c;请问先打印邮件还是短信&#xff1f;1.2.2.邮件⽅法暂停4秒钟&#xff0c;请问先打印邮件还是短信&#xff1f;分析1.2.3.新增⼀个普通⽅法hello&#xff08;&…...

品牌营销 | 学习如何最大限度地发挥品牌营销的作用

您是否想过如何最大限度地发挥品牌营销的潜力&#xff1f;这是一项艰巨的挑战&#xff0c;通过了解品牌营销的基本组成部分&#xff0c;您可以成功地推广您的品牌。 &#xff08;图源&#xff1a;Pixabay&#xff09; 品牌营销的基本组成部分 你需要做什么来发展稳固的品牌&am…...

Linux驱动的同步阻塞和同步非阻塞

在字符设备驱动中&#xff0c;若要求应用与驱动同步&#xff0c;则在驱动程序中可以根据情况实现为阻塞或非阻塞一、同步阻塞这种操作会阻塞应用程序直到设备完成read/write操作或者返回一个错误码。在应用程序阻塞这段时间&#xff0c;程序所代表的进程并不消耗CPU的时间&…...

LearnOpenGL-光照-5.投光物

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject 文章目录投光物平行光点光源聚光不平滑的例子平滑例子投光物 前面几节使用的光照都来自于空间中的一个点 即…...

【C语言】每日刷题 —— 牛客语法篇(1)

前言 大家好&#xff0c;今天带来一篇新的专栏c_牛客&#xff0c;不出意外的话每天更新十道题&#xff0c;难度也是从易到难&#xff0c;自己复习的同时也希望能帮助到大家&#xff0c;题目答案会根据我所学到的知识提供最优解。 &#x1f3e1;个人主页&#xff1a;悲伤的猪大…...

【深度学习】Subword Tokenization算法

在自然语言处理中&#xff0c;面临的首要问题是如何让模型认识我们的文本信息&#xff0c;词&#xff0c;是自然语言处理中基本单位&#xff0c;神经网络模型的训练和预测都需要借助词表来对句子进行表示。 1.构建词表的传统方法 在字词模型问世之前&#xff0c;做自然语言处理…...

五分钟了解支付、交易、清算、银行等专业名词的含义?

五分钟了解支付、交易、清算、银行等专业名词的含义&#xff1f;1. 支付类名词01 支付应用02 支付场景03 交易类型04 支付类型&#xff08;按通道类型&#xff09;05 支付类型&#xff08;按业务双方类型&#xff09;06 支付方式07 支付产品08 收银台类型09 支付通道10 通道类型…...

4个工具,让 ChatGPT 如虎添翼!

LightGBM中文文档 机器学习统计学,476页 机器学习圣经PRML中文版...

初识PO、VO、DAO、BO、DTO、POJO时

PO、VO、DAO、BO、DTO、POJO 区别分层领域模型规约DO(Data Object)DTO(Data Transfer Object)BO(Business Object)AO(ApplicationObject)VO(View Object)Query领域模型命名规约&#xff1a;一、PO :(persistant object )&#xff0c;持久对象二、VO :(value object) &#xff0…...

[2.2.4]进程管理——FCFS、SJF、HRRN调度算法

文章目录第二章 进程管理FCFS、SJF、HRRN调度算法&#xff08;一&#xff09;先来先服务&#xff08;FCFS, First Come First Serve&#xff09;&#xff08;二&#xff09;短作业优先&#xff08;SJF, Shortest Job First&#xff09;对FCFS和SJF两种算法的思考&#xff08;三…...

【代码随想录Day55】动态规划

583 两个字符串的删除操作 https://leetcode.cn/problems/delete-operation-for-two-strings/72 编辑距离https://leetcode.cn/problems/edit-distance/...

Java开发 - 消息队列前瞻

前言 学完了Redis&#xff0c;那你一定不能错过消息队列&#xff0c;要说他俩之间的关联&#xff1f;关联是有的&#xff0c;但也不见得很大&#xff0c;只是他们都是大数据领域常用的一种工具&#xff0c;一种用来提高程序运行效率的工具。常见于高并发&#xff0c;大数据&am…...

MySQL连接IDEA详细教程

使用IDEA的时候&#xff0c;需要连接Database&#xff0c;连接时遇到了一些小问题&#xff0c;下面记录一下操作流程以及遇到的问题的解决方法。 目录 MySQL连接IDEA详细教程 MySQL连接IDEA详细教程 打开idea&#xff0c;点击右侧的 Database 或者 选择 View --> Tool Wind…...

线程(操作系统408)

基本概念 我们说引入进程的目的是更好的使用多道程序并发执行&#xff0c;提高资源的利用率和系统吞吐量&#xff1b;而引入线程的目的则是减小程序在并发执行的时候所付出的时间开销&#xff0c;提高操作系统的并发性能。 线程可以理解成"轻量级进程"&#xff0c;…...

功耗降低99%,Panamorph超清VR光学架构解析

近期&#xff0c;投影仪变形镜头厂商Panamorph获得新型VR显示技术专利&#xff08;US11493773B2&#xff09;&#xff0c;该专利方案采用了紧凑的结构&#xff0c;结合了Pancake透镜和光波导显示模组&#xff0c;宣称比传统VR方案的功耗、发热减少99%以上&#xff0c;可显著提高…...