数据结构——单向循环链表、双链表、双向循环链表

目录

一、单向循环链表

  1.1 单向循环链表的概念

  1.2 单向循环链表的操作

    1.2.1 单向循环链表的创建

    1.2.2 单向循环链表的头插

    1.2.3 单向循环链表的遍历

    1.2.4 单向循环链表的头删

    1.2.5 单向循环链表的尾插

    1.2.6 单向循环链表的尾删

    1.2.7 约瑟夫环

  1.3 单向循环列表所有程序

    1.3.1 head.h

    1.3.2 main.c

    1.3.3 fun.c

  1.4 输出效果

二、双链表

  2.1 双链表的概念

  2.2 双链表的操作

    2.2.1 双链表的创建

    2.2.2 双链表的头插

    2.2.3 双链表的遍历

    2.2.4 双链表的头删

    2.2.5 双链表的尾插

    2.2.6 双链表的尾删

  2.3 双链表所有程序

    2.3.1 head.h

    2.3.2 main.c

    2.3.3 fun.c

  2.4 输出效果

三、双向循环列表

  3.1 双向循环链表的概念

  3.2 双向循环链表的操作

    3.2.1 双向循环链表的创建

    3.2.2 双向循环链表的头插

    3.2.3 双向循环链表的遍历

    3.2.4 双向循环链表的头删

    3.2.5 双向循环链表的尾插

    3.2.6 双向循环链表的尾删

  3.3 双向循环链表所有程序

    3.3.1 head.h

    3.3.2 main.c

    3.3.3 fun.c

  3.4 输出效果


一、单向循环链表

  1.1 单向循环链表的概念

        1.单向循环链表:尾节点的指针域指向头结点的地址

        2.单向循环链表的节点:数据域和指针域

        数据域:存储的数据元素

        指针域:存储节点之间的关系,下一个节点的地址,单向循环链表的指针域指向该节点的地址

  1.2 单向循环链表的操作

    1.2.1 单向循环链表的创建

// 创建单向循环链表---------------
Linklist creat_node()
{// 1.创建一个新的节点Linklist s=(Linklist)malloc(sizeof(struct Node));// 2. if(NULL==s)return NULL;// 初始化新节点的数据域s->data=0;// 初始化新节点的指针域s->next=s;return s;
}

    1.2.2 单向循环链表的头插

// 头插---------------
Linklist insert_head(Linklist head,datatype element)
{Linklist s=creat_node();s->data=element;// 1.判断链表是否为空if(NULL==head)head=s;else  // 链表中存在多个节点 >=1{// 找到尾节点Linklist del=head;while(del->next!=head){del=del->next;}s->next=head;head=s;del->next=head;}return head;
}

    1.2.3 单向循环链表的遍历

// 循环遍历---------------
void output(Linklist head)
{//  1.判断链表是否为空if(NULL==head)return;// 2.循环遍历Linklist p=head;printf("Linklist=");do{printf("%d ",p->data);p=p->next;}while(p!=head);putchar(10);return;
}

    1.2.4 单向循环链表的头删

// 单向循环链表的头删---------------
Linklist delete_head(Linklist head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.判断链表是否为1if(head->next==head){free(head);head=NULL;return head;}// 3.头删//  找到尾节点Linklist real=head;while(real->next!=head){real=real->next;}Linklist del;del=head;head=head->next;free(del);del=NULL;real->next=head;return head;
}

    1.2.5 单向循环链表的尾插

// 单向循环链表的尾插---------------
Linklist insert_tail(Linklist head,datatype element)
{// 1.创建新节点,并输入值Linklist s=creat_node();s->data=element;s->next=head;// 2.判断链表是否为空if(NULL==head){head=s;}else{// 3.尾插Linklist p=head;while(p->next!=head)  // 找到最后一个节点{p=p->next;}p->next=s;  // 链接:p指针域指向新节点的地址}return head;
}

    1.2.6 单向循环链表的尾删

// 单向循环链表的尾删---------------
Linklist delete_tail(Linklist head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.只有一个节点时else if(head->next==head){free(head);head=NULL;}// 3.有多个节点时else{Linklist del=head;// 找到倒数第二个节点while(del->next->next!=head){del=del->next;}// 删除p的后继free(del->next);del->next=head;}return head;
}

    1.2.7 约瑟夫环

        约瑟夫环:用循环链表编程实现约瑟夫问题

        n个人围成一圈,从某人开始报数1, 2, …, m,数到m的人出圈,然后从出圈的下一个人(m+1)开始重复此过程,直到 全部人出圈,于是得到一个出圈人员的新序列

        如当n=8,m=4时,若从第一个位置数起,则所得到的新的序列 为4, 8, 5, 2, 1, 3, 7, 6。

// 约瑟夫环
Linklist joseph(Linklist head,int n, int m)
{Linklist p=head;Linklist del=NULL;Linklist s=NULL;for(int i=1;i<=n;i++){for(int j=1;j<m-1;j++){p=p->next;}del=p->next;p->next=p->next->next;p=p->next;if(i==1){head=del;head->next=head;}else{s=head;while(s->next!=head){s=s->next;}del->next=head;s->next=del;}}return head;
}

  1.3 单向循环列表所有程序

    1.3.1 head.h

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;
enum passble{SUCCSSES,FALSE=-1};
// 节点结构定义
// 节点:数据、指针域
// Node不可省略
typedef struct Node
{datatype data;  // 数据域:数据元素struct Node *next;  // 指针域:节点之间的关系,下一个节点的地址
}*Linklist;Linklist creat_node();
Linklist insert_head(Linklist head,datatype element);
void output(Linklist head);
Linklist delete_head(Linklist);
Linklist insert_tail(Linklist head,datatype element);
Linklist delete_tail(Linklist head);
int get_len(Linklist head);
Linklist joseph(Linklist head,int n, int m);#endif

    1.3.2 main.c

#include "head.h"
int main(int argc, const char *argv[])
{
// 单向循环链表的创建
// 单向循环链表的头插Linklist head=NULL;int n;printf("请输入插入个数:");scanf("%d",&n);datatype element;for(int i=0;i<n;i++){printf("请输入插入的第 %d 个元素:",i+1);scanf("%d",&element);head=insert_head(head,element);}output(head);// 单向循环链表的头删head=delete_head(head);printf("头删后");output(head);
// 单向循环链表的尾插printf("请输入尾插个数:");scanf("%d",&n);for(int i=0;i<n;i++){printf("请输入尾插元素:");scanf("%d",&element);head=insert_tail(head,element);}output(head);// 单向循环链表的尾删head=delete_tail(head);printf("尾删后");output(head);// 约瑟夫环int m=4;head=joseph(head,n,m);output(head);return 0;
}

    1.3.3 fun.c

#include "head.h"
// 创建单向循环链表---------------
Linklist creat_node()
{// 1.创建一个新的节点Linklist s=(Linklist)malloc(sizeof(struct Node));// 2. if(NULL==s)return NULL;// 初始化新节点的数据域s->data=0;// 初始化新节点的指针域s->next=s;return s;
}
// 头插---------------
Linklist insert_head(Linklist head,datatype element)
{Linklist s=creat_node();s->data=element;// 1.判断链表是否为空if(NULL==head)head=s;else  // 链表中存在多个节点 >=1{// 找到尾节点Linklist del=head;while(del->next!=head){del=del->next;}s->next=head;head=s;del->next=head;}return head;
}// 循环遍历---------------
void output(Linklist head)
{//  1.判断链表是否为空if(NULL==head)return;// 2.循环遍历Linklist p=head;printf("Linklist=");do{printf("%d ",p->data);p=p->next;}while(p!=head);putchar(10);return;
}
// 单向循环链表的头删---------------
Linklist delete_head(Linklist head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.判断链表是否为1if(head->next==head){free(head);head=NULL;return head;}// 3.头删//  找到尾节点Linklist real=head;while(real->next!=head){real=real->next;}Linklist del;del=head;head=head->next;free(del);del=NULL;real->next=head;return head;
}
// 单向循环链表的尾插---------------
Linklist insert_tail(Linklist head,datatype element)
{// 1.创建新节点,并输入值Linklist s=creat_node();s->data=element;s->next=head;// 2.判断链表是否为空if(NULL==head){head=s;}else{// 3.尾插Linklist p=head;while(p->next!=head)  // 找到最后一个节点{p=p->next;}p->next=s;  // 链接:p指针域指向新节点的地址}return head;
}
// 单向循环链表的尾删---------------
Linklist delete_tail(Linklist head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.只有一个节点时else if(head->next==head){free(head);head=NULL;}// 3.有多个节点时else{Linklist del=head;// 找到倒数第二个节点while(del->next->next!=head){del=del->next;}// 删除p的后继free(del->next);del->next=head;}return head;
}// 约瑟夫环
Linklist joseph(Linklist head,int n, int m)
{Linklist p=head;Linklist del=NULL;Linklist s=NULL;for(int i=1;i<=n;i++){for(int j=1;j<m-1;j++){p=p->next;}del=p->next;p->next=p->next->next;p=p->next;if(i==1){head=del;head->next=head;}else{s=head;while(s->next!=head){s=s->next;}del->next=head;s->next=del;}}return head;
}

  1.4 输出效果

二、双链表

  2.1 双链表的概念

        引入目的:无论是单向循环或单向链表,只能向后遍历吗,不可以向前访问,引出双链表

        1.双向链表:链表既可以向前访问也可以向后访问

        2.双向链表的节点

        3.双向链表节点的结构体定义

        结构体:数据域,两个指针域

        4.双向链表插入和删除的思想

  2.2 双链表的操作

    2.2.1 双链表的创建

// 创建节点
Doublelink creat_link()
{Doublelink s=(Doublelink)malloc(sizeof(struct Node));if(NULL==s)return NULL;s->data=0;  // 新节点的数据域初始化s->next=NULL;  // 新节点的指针域初始化s->last=NULL;return s;
}

    2.2.2 双链表的头插

// 双向列表的头插
Doublelink insert_head(Doublelink head,datatype element)
{Doublelink s=creat_link();s->data=element;// 1.判断链表是否为空if(NULL==head){head=s;return head;}// 2.链表不为空,存在多个节点s->next=head;  // 新节点的next指向头节点head->last=s;  // 头结点的last指向新节点head=s; // 使新节点成为头结点return head;
}

    2.2.3 双链表的遍历

// 双向列表的遍历
void outlink(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return;// 2.链表不为空else{Doublelink p=head;printf("正向遍历 Doublelink= ");while(p->next!=NULL){printf("%c ",p->data);p=p->next;}printf("%c ",p->data);putchar(10);printf("逆向遍历 Doublelink= ");while(p){printf("%c ",p->data);p=p->last;}putchar(10);}return;
}

    2.2.4 双链表的头删

// 双向链表的头删
Doublelink delete_head(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.判断链表节点是否为1else if(head->next==NULL){free(head);head=NULL;return head;}// 2.链表有多个节点head=head->next;  // 让第二个节点成为头结点free(head->last);  // 释放原头结点head->last=NULL;  // 让新头结点的last指向空
}

    2.2.5 双链表的尾插

// 双向列表的尾插
Doublelink insert_tail(Doublelink head,datatype element)
{Doublelink s=creat_link();s->data=element;// 1.判断链表是否为空if(NULL==head){head=s; // 直接让head指向新节点,即让新节点成为头结点return head;}// 2.链接有一个或多个节点Doublelink p=head;while(p->next!=NULL)  // 找到最后一个节点{p=p->next;}p->next=s;  // 让位后一个节点指向新节点,即新节点成为尾节点s->last=p;  // 让新节点的last指向原尾节点return head;}

    2.2.6 双链表的尾删

// 双向列表的尾删
Doublelink delete_tail(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.判断链表节点是否为1else if(head->next==NULL){free(head);  // 释放头结点head=NULL;  // head指向空return head;}// 3.链表有多个节点else{Doublelink p=head;while(p->next->next!=NULL)  // 找到倒数第二个节点{p=p->next;}free(p->next);  // 释放最后一个节点p->next=NULL;  // 让原倒数第二个节点指向空,即成为最后一个节点return head;}}

  2.3 双链表所有程序

    2.3.1 head.h

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum passble{SUCCESS,FALSE=-1};
typedef char datatype;
// 双向链表节点结构体
typedef struct Node
{//数据域:数据元素datatype data;//指针域:下一个节点的地址struct Node *next;//指针域:上一个节点的地址struct Node *last;
}*Doublelink;
Doublelink creat_link();
Doublelink insert_head(Doublelink head,datatype element);
void outlink(Doublelink head);
Doublelink delete_head(Doublelink head);
Doublelink insert_tail(Doublelink head,datatype element);
Doublelink delete_tail(Doublelink head);#endif

    2.3.2 main.c

#include "head.h"
int main(int argc, const char *argv[])
{Doublelink head=NULL;  // 定义一个链表节点指针int n;printf("请输入存入数据数量n:");scanf("%d",&n);datatype element;for(int i=1;i<=n;i++){printf("请输入第%d个元素:",i);// scanf("%c",&element);getchar();element=getchar();head=insert_head(head,element);}
// 双向列表的遍历outlink(head);// 双向链表的头删head=delete_head(head);printf("头删后\n");outlink(head);// 双向列表的尾插printf("请输入尾插元素个数:");scanf("%d",&n);for(int i=1;i<=n;i++){printf("请输入尾插的第%d个元素:",i);getchar();element=getchar();head=insert_tail(head,element);}outlink(head);// 双向列表的尾删head=delete_tail(head);printf("尾删后\n");outlink(head);return 0;
}

    2.3.3 fun.c

#include "head.h"
// 创建节点
Doublelink creat_link()
{Doublelink s=(Doublelink)malloc(sizeof(struct Node));if(NULL==s)return NULL;s->data=0;  // 新节点的数据域初始化s->next=NULL;  // 新节点的指针域初始化s->last=NULL;return s;
}// 双向列表的头插
Doublelink insert_head(Doublelink head,datatype element)
{Doublelink s=creat_link();s->data=element;// 1.判断链表是否为空if(NULL==head){head=s;return head;}// 2.链表不为空,存在多个节点s->next=head;  // 新节点的next指向头节点head->last=s;  // 头结点的last指向新节点head=s; // 使新节点成为头结点return head;
}// 双向列表的遍历
void outlink(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return;// 2.链表不为空else{Doublelink p=head;printf("正向遍历 Doublelink= ");while(p->next!=NULL){printf("%c ",p->data);p=p->next;}printf("%c ",p->data);putchar(10);printf("逆向遍历 Doublelink= ");while(p){printf("%c ",p->data);p=p->last;}putchar(10);}return;
}// 双向链表的头删
Doublelink delete_head(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.判断链表节点是否为1else if(head->next==NULL){free(head);head=NULL;return head;}// 2.链表有多个节点head=head->next;  // 让第二个节点成为头结点free(head->last);  // 释放原头结点head->last=NULL;  // 让新头结点的last指向空
}// 双向列表的尾插
Doublelink insert_tail(Doublelink head,datatype element)
{Doublelink s=creat_link();s->data=element;// 1.判断链表是否为空if(NULL==head){head=s; // 直接让head指向新节点,即让新节点成为头结点return head;}// 2.链接有一个或多个节点Doublelink p=head;while(p->next!=NULL)  // 找到最后一个节点{p=p->next;}p->next=s;  // 让位后一个节点指向新节点,即新节点成为尾节点s->last=p;  // 让新节点的last指向原尾节点return head;}// 双向列表的尾删
Doublelink delete_tail(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.判断链表节点是否为1else if(head->next==NULL){free(head);  // 释放头结点head=NULL;  // head指向空return head;}// 3.链表有多个节点else{Doublelink p=head;while(p->next->next!=NULL)  // 找到倒数第二个节点{p=p->next;}free(p->next);  // 释放最后一个节点p->next=NULL;  // 让原倒数第二个节点指向空,即成为最后一个节点return head;}}

  2.4 输出效果

三、双向循环列表

  3.1 双向循环链表的概念

        双向循环链表:尾节点的下一个节点是头节点,头节点的上一个节点是尾节点

  3.2 双向循环链表的操作

    3.2.1 双向循环链表的创建

#include "head.h"
// 创建节点
Doublelink creat_link()
{Doublelink s=(Doublelink)malloc(sizeof(struct Node));if(NULL==s)return NULL;s->data=0;  // 新节点的数据域初始化s->next=s;  // 新节点的指针域初始化s->last=s;return s;
}

    3.2.2 双向循环链表的头插

// 双向循环列表的头插
Doublelink insert_head(Doublelink head,datatype element)
{Doublelink s=creat_link();s->data=element;// 1.判断链表是否为空if(NULL==head){head=s;return head;}// 2.链表不为空,存在多个节点s->next=head;  // 新节点的next指向头节点s->last=head->last;  // 新节点的last指向尾节点head->last->next=s;  // 尾节点的next指向新节点head->last=s;  // 头结点的last指向新节点head=s; // 使新节点成为头结点return head;
}

    3.2.3 双向循环链表的遍历

// 双向循环列表的遍历
void outlink(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return;// 2.链表不为空else{Doublelink p=head;printf("正向遍历 Doublelink= ");while(p->next!=head){printf("%c ",p->data);p=p->next;}printf("%c ",p->data);putchar(10);printf("逆向遍历 Doublelink= ");while(p!=head){printf("%c ",p->data);p=p->last;}printf("%c",p->data);putchar(10);}return;
}

    3.2.4 双向循环链表的头删

// 双向循环链表的头删
Doublelink delete_head(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.判断链表节点是否为1else if(head->next==head){free(head);head=NULL;return head;}// 2.链表有多个节点Doublelink p=head;head->last->next=head->next;head=head->next;  // 让第二个节点成为头结点head->last=head->last->last;  // 让新头结点指向尾节点free(p);  // 释放原头结点p=NULL;  // 让指针p指向空return head;
}

    3.2.5 双向循环链表的尾插

// 双向循环列表的尾插
Doublelink insert_tail(Doublelink head,datatype element)
{Doublelink s=creat_link();s->data=element;// 1.判断链表是否为空if(NULL==head){head=s; // 直接让head指向新节点,即让新节点成为头结点return head;}// 2.链接有一个或多个节点head->last->next=s;  // 让最后一个节点指向新节点,即新节点成为尾节点s->next=head;s->last=head->last;  // 让新节点的last指向原尾节点head->last=s;return head;}

    3.2.6 双向循环链表的尾删

// 双向循环列表的尾删
Doublelink delete_tail(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.判断链表节点是否为1else if(head->next==head){free(head);  // 释放头结点head=NULL;  // head指向空return head;}// 3.链表有多个节点else{head->last=head->last->last;  // 让头结点的last指向倒数第二个节点free(head->last->next);  // 释放最后一个节点head->last->next=head;  // 让原倒数第二个节点指向头结点,即成为最后一个节点return head;}}

  3.3 双向循环链表所有程序

    3.3.1 head.h

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum passble{SUCCESS,FALSE=-1};
typedef char datatype;
// 双向链表节点结构体
typedef struct Node
{//数据域:数据元素datatype data;//指针域:下一个节点的地址struct Node *next;//指针域:上一个节点的地址struct Node *last;
}*Doublelink;
Doublelink creat_link();
Doublelink insert_head(Doublelink head,datatype element);
void outlink(Doublelink head);
Doublelink delete_head(Doublelink head);
Doublelink insert_tail(Doublelink head,datatype element);
Doublelink delete_tail(Doublelink head);#endif

    3.3.2 main.c

#include "head.h"
int main(int argc, const char *argv[])
{Doublelink head=NULL;  // 定义一个链表节点指针int n;printf("请输入存入数据数量n:");scanf("%d",&n);datatype element;for(int i=1;i<=n;i++){printf("请输入第%d个元素:",i);// scanf("%c",&element);getchar();element=getchar();head=insert_head(head,element);}
// 双向循环列表的遍历outlink(head);// 双向循环链表的头删head=delete_head(head);printf("头删后\n");outlink(head);// 双向循环列表的尾插printf("请输入尾插元素个数:");scanf("%d",&n);for(int i=1;i<=n;i++){printf("请输入尾插的第%d个元素:",i);getchar();element=getchar();head=insert_tail(head,element);}outlink(head);// 双向循环列表的尾删head=delete_tail(head);printf("尾删后\n");outlink(head);return 0;
}

    3.3.3 fun.c

#include "head.h"
// 创建节点
Doublelink creat_link()
{Doublelink s=(Doublelink)malloc(sizeof(struct Node));if(NULL==s)return NULL;s->data=0;  // 新节点的数据域初始化s->next=s;  // 新节点的指针域初始化s->last=s;return s;
}// 双向循环列表的头插
Doublelink insert_head(Doublelink head,datatype element)
{Doublelink s=creat_link();s->data=element;// 1.判断链表是否为空if(NULL==head){head=s;return head;}// 2.链表不为空,存在多个节点s->next=head;  // 新节点的next指向头节点s->last=head->last;  // 新节点的last指向尾节点head->last->next=s;  // 尾节点的next指向新节点head->last=s;  // 头结点的last指向新节点head=s; // 使新节点成为头结点return head;
}// 双向循环列表的遍历
void outlink(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return;// 2.链表不为空else{Doublelink p=head;printf("正向遍历 Doublelink= ");while(p->next!=head){printf("%c ",p->data);p=p->next;}printf("%c ",p->data);putchar(10);printf("逆向遍历 Doublelink= ");while(p!=head){printf("%c ",p->data);p=p->last;}printf("%c",p->data);putchar(10);}return;
}// 双向循环链表的头删
Doublelink delete_head(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.判断链表节点是否为1else if(head->next==head){free(head);head=NULL;return head;}// 2.链表有多个节点Doublelink p=head;head->last->next=head->next;head=head->next;  // 让第二个节点成为头结点head->last=head->last->last;  // 让新头结点指向尾节点free(p);  // 释放原头结点p=NULL;  // 让指针p指向空return head;
}// 双向循环列表的尾插
Doublelink insert_tail(Doublelink head,datatype element)
{Doublelink s=creat_link();s->data=element;// 1.判断链表是否为空if(NULL==head){head=s; // 直接让head指向新节点,即让新节点成为头结点return head;}// 2.链接有一个或多个节点head->last->next=s;  // 让最后一个节点指向新节点,即新节点成为尾节点s->next=head;s->last=head->last;  // 让新节点的last指向原尾节点head->last=s;return head;}// 双向循环列表的尾删
Doublelink delete_tail(Doublelink head)
{// 1.判断链表是否为空if(NULL==head)return head;// 2.判断链表节点是否为1else if(head->next==head){free(head);  // 释放头结点head=NULL;  // head指向空return head;}// 3.链表有多个节点else{head->last=head->last->last;  // 让头结点的last指向倒数第二个节点free(head->last->next);  // 释放最后一个节点head->last->next=head;  // 让原倒数第二个节点指向头结点,即成为最后一个节点return head;}}

  3.4 输出效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/70016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Iceberg 与 Apache Hudi:数据湖领域的双雄对决

在数据存储和处理不断发展的领域中&#xff0c;数据湖仓的概念已经崭露头角&#xff0c;成为了一种变革性的力量。数据湖仓结合了数据仓库和数据湖的最佳元素&#xff0c;提供了一个统一的平台&#xff0c;支持数据科学、商业智能、人工智能/机器学习以及临时报告等多种关键功能…

JavaScript数组-数组的概念

在JavaScript编程中&#xff0c;数组&#xff08;Array&#xff09;是一种非常重要的数据结构&#xff0c;它允许我们将多个值存储在一个单独的变量中。数组可以包含任意类型的元素&#xff0c;如数字、字符串、对象甚至是其他数组&#xff0c;并提供了丰富的内置方法来操作这些…

AcWing 800. 数组元素的目标和

题目来源&#xff1a; 登录 - AcWing 题目内容&#xff1a; 给定两个升序排序的有序数组 A 和 B&#xff0c;以及一个目标值 x。 数组下标从 0开始。 请你求出满足 A[i]B[j]x的数对 (i,j)。 数据保证有唯一解。 输入格式 第一行包含三个整数 n,m,x&#xff0c;分别表示 …

wordpress资讯类网站整站打包

wordpress程序&#xff0c;内置了价值499元的模板.但是有了模板没有全自动采集相信大多数人都搞不懂&#xff0c;目录那么多&#xff0c;全靠原创几乎是不可能的事情&#xff0c;除非你是大公司&#xff0c;每人控制一个板块&#xff0c; 这套源码里面最有价值的应该是这个采集…

python中的with是做什么的,有什么作用,什么时候需要用到with

&#x1f4cc; Python 中的 with 语句&#xff1a;作用 & 什么时候用 1️⃣ with 是干嘛的&#xff1f; with 主要用来 自动管理资源&#xff0c;确保资源&#xff08;文件、数据库连接等&#xff09;在使用完后能自动释放&#xff0c;避免资源泄露问题。 换句话说&…

浏览器的Cookie 过期时间存储

Cookie 是服务器发送到浏览器的小型文本数据&#xff0c;用于跟踪用户状态&#xff08;如登录信息、偏好设置&#xff09;&#xff0c;存储大小通常限制为 4KB&#xff0c;每个域名下最多允许约 20-50 个 Cookie&#xff08;不同浏览器不同&#xff09;。 属性 属性说明示例注…

hive全量迁移脚本

#!/bin/bash #场景&#xff1a;数据在同一库下&#xff0c;并且hive是内部表&#xff08;前缀的hdfs地址是相同的&#xff09;#1.读取一个文件&#xff0c;获取表名#echo "时间$dt_jian_2-------------------------" >> /home/hadoop/qianyi_zengliang/rs.txt#…

进阶——第十六届蓝桥杯嵌入式熟练度练习(开发板捕获频率和占空比)

单通道捕获频率 HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1); void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {if(htim->InstanceTIM2) {cap1HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);TIM2-&…

Python中如何进行数据库连接?

在 Python 中进行数据库连接&#xff0c;不同的数据库需要使用不同的库。下面分别介绍几种常见数据库&#xff08;SQLite、MySQL、PostgreSQL&#xff09;的连接方法。 1. 连接 SQLite 数据库 SQLite 是一种轻量级的嵌入式数据库&#xff0c;Python 标准库中自带了sqlite3模块…

用C语言实现通用排序函数:深入理解指针与函数指针的魅力

在C语言的学习与应用中&#xff0c;排序是一个非常基础且重要的算法。今天&#xff0c;我们就来深入探讨如何使用C语言实现一个通用的排序函数&#xff0c;通过这个过程&#xff0c;我们将对指针和函数指针有更深刻的理解。 #define _CRT_SECURE_NO_WARNINGS #include<std…

Deepseek R1模型本地化部署与API实战指南:释放企业级AI生产力

摘要 本文深入解析Deepseek R1开源大模型的本地化部署流程与API集成方案&#xff0c;涵盖从硬件选型、Docker环境搭建到模型微调及RESTful接口封装的完整企业级解决方案。通过电商评论分析和智能客服搭建等案例&#xff0c;展示如何将前沿AI技术转化为实际生产力。教程支持Lin…

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理&#xff0c;公式&#xff0c;模式&#xff0c;伸缩因子&#xff0c;旋转方向等&#xff0c;推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现&#xff0c;注意…

Python常见面试题的详解7

1. 内置的数据结构有哪几种 Python 中有多种内置的数据结构&#xff0c;主要分为以下几种&#xff1a; 1.1 数值类型 整数&#xff08;int&#xff09;&#xff1a;用于表示整数&#xff0c;没有大小限制。例如&#xff1a;1, -5, 100。浮点数&#xff08;float&#xff09;…

什么叫以太网?它与因特网有何区别?

以太网和互联网的定义与区别 以太网&#xff08;Ethernet&#xff09;和互联网&#xff08;Internet&#xff09;是两个不同的概念&#xff0c;虽然它们密切相关&#xff0c;但它们的作用和定义是不同的。 以太网&#xff08;Ethernet&#xff09; 以太网是一个 局域网&…

教育小程序+AI出题:如何通过自然语言处理技术提升题目质量

随着教育科技的飞速发展&#xff0c;教育小程序已经成为学生与教师之间互动的重要平台之一。与此同时&#xff0c;人工智能&#xff08;AI&#xff09;和自然语言处理&#xff08;NLP&#xff09;技术的应用正在不断推动教育内容的智能化。特别是在AI出题系统中&#xff0c;如何…

VScode内接入deepseek包过程(本地部署版包会)

目录 1. 首先得有vscode软件 2. 在我们的电脑本地已经部署了ollama&#xff0c;我将以qwen作为实验例子 3. 在vscode上的扩展商店下载continue 4. 下载完成后&#xff0c;依次点击添加模型 5. 在这里可以添加&#xff0c;各种各样的模型&#xff0c;选择我们的ollama 6. 选…

docker安装mysql:8.0

1.docker源 目前docker国内的源基本上用不了了&#xff0c;建议去淘宝找一找&#xff0c;我整了一个大概是10R一个月。 2.拉取镜像 docker pull mysql:8.0 3.启动容器 命令如下&#xff1a; docker run \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD123456 \-v /home/data/mysq…

作用域链精讲

作用域链精讲 1编译阶段1.1分词1.2解析(解析为抽象语法树AST)1.3代码生成 2执行阶段3查询阶段4嵌套机制(这个比较重要)----就近原则5异常5.1计算机为啥要区分LHS和RHS5.2RHS查询5.3LHS查询 6什么是词法作用域7遮蔽效应8变量和函数的声明提升&#xff08;也是预解析&#xff09;…

4.【线性代数】——矩阵的LU分解

四 矩阵的LU分解 1. AB的逆矩阵2. 转置矩阵3. ALU3.1 2x2矩阵3.2 3x3矩阵3.3 nxn的矩阵分解的次数&#xff1f; 1. AB的逆矩阵 { ( A B ) ( B − 1 A − 1 ) I ( B − 1 A − 1 ) ( A B ) I ⇒ ( A B ) − 1 B − 1 A − 1 \begin{cases} (AB)(B^{-1}A^{-1}) I\\ (B^{-1}A^…

Arduino-ESP8266 GPIO(中断或轮询)

检测GPIO高低电平 1. 中断 2. 轮询 gpio.ino // GPIO按键输入 // 监听高电平接线图 // ESP8266 NodeMCU // ┌───────────┐ // │ D1(GPIO5) │──────┤按键一端 // │ │ │ // │ 3V3 │──────┤按键另一端 // └───…