数据结构(三)循环链表 约瑟夫环

文章目录

  • 一、循环链表
    • (一)概念
    • (二)示意图
    • (三)操作
      • 1. 创建循环链表
        • (1)函数声明
        • (2)注意点
        • (3)代码实现
      • 2. 插入(头插,尾插,任意位置插入)
        • (1)头插
          • ① 函数声明
          • ② 注意点
          • ③ 代码实现
        • (2)尾插
          • ① 函数声明
          • ② 注意点
          • ③ 代码实现
        • (3)任意位置插入
          • ① 函数声明
          • ② 注意点
          • ③ 代码实现
      • 3. 删除(头删,尾删,任意位置删除)
        • (1)头删
          • ① 函数声明
          • ② 注意点
          • ③ 代码实现
        • (2)尾删
          • ① 函数声明
          • ② 注意点
          • ③ 代码实现
        • (3)任意位置删除
          • ① 函数声明
          • ② 注意点
          • ③ 代码实现
      • 4. 修改
        • (1)函数定义
        • (2)注意点
        • (3)代码实现
      • 5. 查询
        • (1)函数定义
        • (2)注意点
        • (3)代码实现
      • 6. 清空和销毁
        • (1)函数定义
        • (2)注意点
        • (3)代码实现
      • 7. 打印链表(方便查看实验现象)
        • (1)函数定义
        • (2)注意点
        • (3)代码实现
      • 8. 排序(以正序排序为例)
        • (1)函数定义
        • (2)注意点
        • (3)代码实现
      • 9.剔重
        • (1)函数定义
        • (2)注意点
        • (3)代码实现
    • (四)应用:实现约瑟夫环
      • 1.问题描述
      • 2. 问题分析
      • 3. 代码实现
      • 4. 使用前面的循环链表实现
  • 二、代码源码已上传资源

一、循环链表

(一)概念

操作和单向链表的操作基本一样
只是判断链表结束的条件不同

循环链表又分为有头循环链表和无头循环链表,其中无头结点的循环链表相对更常见些,因此下文以实现无头循环链表为例。

(二)示意图

在这里插入图片描述

(三)操作

结构体定义:

//数据元素结构体
typedef struct circle_node
{
    int data;
    struct circle_node *next;
}nd_t;

//数据对象结构体
typedef struct circle_list
{
    nd_t *phead; //指向头节点
    //还可以添加其他成员
}list_t;

1. 创建循环链表

(1)函数声明

int create_list(list_t **my_list);

创建循环链表的第一个节点,
第一个节点的next指向它自己
将第一个节点的堆区地址传给main函数中的指针

(2)注意点
  1. 入参不能为空
  2. 因为需要将申请的第一个节点的地址写入main函数中的指针变量中,因此必须传入二级指针
  3. 申请内存空间后检查是否申请成功
(3)代码实现
int create_list(list_t **my_list){
    if(NULL==my_list){
        return -1;
    }
    *my_list=(list_t *)malloc(sizeof(list_t));
    if(NULL==*my_list){
        return -1;
    }
    (*my_list)->phead=NULL;
    return 0;
}

2. 插入(头插,尾插,任意位置插入)

(1)头插
① 函数声明

int insert_list_by_head(list_t *my_list,int num);

创建新节点
找到尾节点,将尾节点的next指向新的节点
新节点的next指向首节点
*phead指向pnew

② 注意点
  1. 入参不能为NULL
  2. 头插需要更改main函数中phead指针的值,因此需要传二级指针
  3. 需要保证链表中至少有一个节点,无头链表中只要phead不为NULL,就说明至少有一个节点
③ 代码实现
int insert_list_by_head(list_t *my_list,int num){
    //入参不合理
    if(NULL==my_list)
        return -1;
    //创建新节点
    nd_t *pnew=(nd_t *)malloc(sizeof(nd_t));
    if(NULL==pnew)
        return -1;
    pnew->data=num;
    //插入首节点
    if(NULL==my_list->phead){
        my_list->phead=pnew;
        pnew->next=pnew;
        return 0;
    }
    //如果插入的不是第一个节点
    //先找到尾节点
    nd_t *ptemp=my_list->phead;
    while(ptemp->next!=my_list->phead)
    {
        ptemp=ptemp->next;
    }
    //插入
    ptemp->next=pnew;
    pnew->next=my_list->phead;
    my_list->phead=pnew;
    return 0;
}
(2)尾插
① 函数声明

int insert_list_by_tail(list_t *my_list,int num);

创建新节点
找到尾节点,将尾节点的next指向新的节点
新节点的next指向首节点

② 注意点
  1. 头插和尾插的区别仅在于是否需要修改main函数中的指针变量
③ 代码实现
int insert_list_by_tail(list_t *my_list,int num){
    if(NULL==my_list)
        return -1;
    //创建新节点
    nd_t *pnew=(nd_t *)malloc(sizeof(nd_t));
    if(NULL==pnew)
        return -1;
    pnew->data=num;
    //插入首节点
    if(NULL==my_list->phead){
        my_list->phead=pnew;
        pnew->next=pnew;
        return 0;
    }
    //找到尾节点
    nd_t *ptemp=my_list->phead;
    while(ptemp->next!=my_list->phead)
    {
        ptemp=ptemp->next;
    }
    //插入
    ptemp->next=pnew;
    pnew->next=my_list->phead;
    return 0;
}
(3)任意位置插入
① 函数声明

int insert_list_by_pos(list_t *my_list,int pos,int num);

找到要插入的位置的前一个节点
创建新节点
插入节点

② 注意点
  1. 不支持插入在第一个位置
  2. 如果插入的前一个位置在最后一个可以,但是在第一个就不合理了
③ 代码实现
int insert_list_by_pos(list_t *my_list,int pos,int num){
    if(NULL==my_list)
        return -1;
    if(pos<0)
        return -1;
    //找到要插入的节点的前一位
    nd_t *ptemp=my_list->phead;
    int i=0;//记录ptemp移动了几步
    while(ptemp->next!=my_list->phead){
        if(i==pos-1) break; 
        ptemp=ptemp->next;
        i++;
    }
    //如果已经到尾节点了还没移动到pos位置就说明位置不合理
    if(i<pos-1){
        printf("位置不合理\n");
        return -1;
    }
    //创建新节点
    nd_t *pnew=(nd_t *)malloc(sizeof(nd_t));
    if(NULL==pnew)
        return -1;
    pnew->data=num;
    //插入第一个节点
    if(NULL==my_list->phead){
        my_list->phead=pnew;
        pnew->next=pnew;
        return 0;
    }
    //插入到头节点
    if(0==pos){
        nd_t *ptail=my_list->phead;
        while(ptail->next!=my_list->phead)
            ptail=ptail->next;
        ptail->next=pnew;
        pnew->next=my_list->phead;
        my_list->phead=pnew;
        return 0;
    }
    //插入节点
    pnew->next=ptemp->next;
    ptemp->next=pnew;

    return 0;
}

3. 删除(头删,尾删,任意位置删除)

(1)头删
① 函数声明

delete_list_by_head(list_t *my_list);

找到尾节点
尾节点的next置成*phead->next
*phead=*phead->next
free(pdef)

② 注意点
  1. 需要传入二级指针
  2. 当表中只有一个节点时,进行删除操作时相当于将表销毁了。
③ 代码实现
int delete_list_by_head(list_t *my_list){
    //传参为空或者表为空
    if(NULL==my_list||NULL==my_list->phead)
        return -1;
    //只有一个节点
    if(my_list->phead->next==my_list->phead){
        free(my_list->phead);
        my_list->phead=NULL;
        printf("表已清空\n");
        return 0;
    }
    //多个节点
    //找到尾节点
    nd_t *ptemp=my_list->phead->next;
    while(ptemp->next!=my_list->phead)
    {
        ptemp=ptemp->next;
    }
    //头删
    nd_t *pdel=my_list->phead;
    my_list->phead=my_list->phead->next;
    ptemp->next=my_list->phead;
    free(pdel);
    pdel=NULL;
    return 0;
}
(2)尾删
① 函数声明

int delete_list_by_tail(list_t *my_list);

找到尾节点的前一节点,
尾删操作

② 注意点
  1. 需要传入二级指针
  2. 当表中只有一个节点时,进行删除操作时相当于将表销毁了。
③ 代码实现
int delete_list_by_tail(list_t *my_list){
    //传参为空或者表为空
    if(NULL==my_list||NULL==my_list->phead)
        return -1;
    //只有一个节点
    if(my_list->phead->next==my_list->phead){
        free(my_list->phead);
        my_list->phead=NULL;
        printf("表已清空\n");
        return 0;
    }
    //多个节点
    //找到尾节点的前一个节点
    nd_t *ptemp=my_list->phead->next;
    while(ptemp->next->next!=my_list->phead)
    {
        ptemp=ptemp->next;
    }
    //尾删
    nd_t *pdel=ptemp->next;
    ptemp->next=my_list->phead;
    free(pdel);
    pdel=NULL;
    return 0;
}
(3)任意位置删除
① 函数声明

int delete_list_by_pos(list_t *my_list,int pos);

② 注意点
  1. 链表中至少有一个节点
  2. 如果只有一个节点时要删除第0个位置可以成功,此时链表销毁;其他位置均为不合理
  3. 如果多个节点时,需要区分是不是要删除头节点
  4. ptemp是要删除的节点的前一个节点,它不能是尾节点
③ 代码实现
int delete_list_by_pos(list_t *my_list,int pos){
    //传参为空或者表为空
    if(NULL==my_list||NULL==my_list->phead)
        return -1;
    if(0>pos){
        return -1;
    }
    //如果链表中只有一个节点
    if(my_list->phead->next==my_list->phead){
        //删除第一个位置的节点
        if(0==pos){
            free(my_list->phead);
            my_list->phead=NULL;
            return 0;
        }
        //删除其他位置节点,均是位置不合理
        printf("位置不合理\n");
        return -1;
    }
    //链表有多个节点
    nd_t *pdel=my_list->phead;
    //删除第一个位置的节点
    //找到尾节点
    nd_t *ptemp=my_list->phead;
    while(ptemp->next!=my_list->phead)
    {
        ptemp=ptemp->next;
    }
    if(0==pos){
        my_list->phead=my_list->phead->next;
        ptemp->next=my_list->phead;
        free(pdel);
        pdel=NULL;
        return 0;
    }
    //删除其他位置节点
    //找到要删除的节点的前一个节点
    ptemp=my_list->phead;
    for(int i=0;i<pos-1;i++){
        //要删除的节点的前一个节点不能是尾节点
        if(ptemp->next->next==my_list->phead){
            printf("删除位置不合理\n");
            return -1;
        }
        ptemp=ptemp->next;
    }
    pdel=ptemp->next;
    ptemp->next=pdel->next;
    free(pdel);
    pdel=NULL;
    return 0;
}

4. 修改

(1)函数定义

int modify_list_by_pos(list_t *my_list,int pos,int num);

遍历链表找到第pos个位置

(2)注意点
  1. 如果已经到达尾节点就不能再继续向下遍历修改
(3)代码实现
int modify_list_by_pos(list_t *my_list,int pos,int num){
    //至少有一个节点
    if(NULL==my_list||NULL==my_list->phead)
        return -1;
    if(0>pos){
        return -1;
    }
    //找到第pos个位置
    nd_t *ptemp=my_list->phead;
    for(int i=0;i<pos;i++){
        if(ptemp->next==my_list->phead){
            printf("位置不合理\n");
            return -1;
        }
        ptemp=ptemp->next;
    }
    ptemp->data=num;
    return 0;
}

5. 查询

(1)函数定义

int search_list_by_pos(list_t *my_list,int pos,int *num);

找到第pos个位置
读取数据域数据

(2)注意点
  1. 查询和修改的唯一区别是对数据的处理,修改是将新的数据写到第pos尾的数据域;修改是将pos位的数据域写到num中
  2. 循环结束条件与修改和删除一样
(3)代码实现
int search_list_by_pos(list_t *my_list,int pos,int *num){
    //至少有一个节点
    if(NULL==my_list||NULL==my_list->phead||NULL==num)
        return -1;
    if(0>pos){
        return -1;
    }
    //找到第pos个位置
    nd_t *ptemp=my_list->phead;
    for(int i=0;i<pos;i++){
        if(ptemp->next==my_list->phead){
            printf("位置不合理\n");
            return -1;
        }
        ptemp=ptemp->next;
    }
    *num=ptemp->data;
    return 0;
}

6. 清空和销毁

(1)函数定义

int clean_list(list_t *my_list);
int destory_list(list_t **my_list);

先判断是不是只有一个节点
采用尾删(使用头删的话还要一直修改main函数中的指针变量的值)

(2)注意点
  1. 使用二级指针
  2. 入参不能为空
(3)代码实现
int clean_list(list_t *my_list){
    if(NULL==my_list){
        return -1;
    }
    //不止一个节点
    //采用头删,先找到尾节点前一个节点
    while(my_list->phead!=NULL)
    {
        delete_list_by_head(my_list);
    }
    return 0;
}
int destory_list(list_t **my_list){
    if(NULL==my_list||NULL==*my_list){
        return -1;
    }
    clean_list(*my_list);
    //此时只有一个节点了
    free(*my_list);
    *my_list=NULL;
    return 0;
}

7. 打印链表(方便查看实验现象)

(1)函数定义

int print_list(list_t *my_list);

先打印出第一个节点,
遍历链表,直到ptemp->next==phead时结束

(2)注意点
  1. 在无头链表中phead为NULL,则说明表为空。phead->next==NULL,说明没有第二个节点。
(3)代码实现
int print_list(list_t *my_list){
    if(NULL==my_list)
        return -1;
    nd_t *ptemp=my_list->phead->next;
    //打印头节点
    printf("%d ",my_list->phead->data);
    //当ptemp==mylist->phead时,说明回到了开头
    while(ptemp!=my_list->phead){
        printf("%d ",ptemp->data);
        ptemp=ptemp->next;
    }
    putchar(10);
    return 0;
}

8. 排序(以正序排序为例)

(1)函数定义

int sort_list(list_t *my_list);;

选择排序思路

(2)注意点
  1. 外层循环可以不比较最后一个元素
(3)代码实现
int sort_list(list_t *my_list){
    if(NULL==my_list||NULL==my_list->phead){
        return -1;
    }
    nd_t *p=my_list->phead;
    nd_t *q=NULL;
    while(p->next!=my_list->phead){
        q=p->next;
        while(q!=my_list->phead){
            if(p->data>q->data){
                int temp=p->data;
                p->data=q->data;
                q->data=temp;
            }
            q=q->next;
        }
        p=p->next;
    }
    return 0;
}

9.剔重

(1)函数定义

int dedup_list(list_t *my_list);

动静指针配合
选择排序思路

(2)注意点
  1. 此时外层循环使用p->next!=phead或者p!=phead均可,循环链表此刻不会报段错误,但是用第一种效率会相对略高
(3)代码实现
int dedup_list(list_t *my_list){
    //至少有一个元素
    if(NULL==my_list||NULL==my_list->phead){
        return -1;
    }
    nd_t *p=my_list->phead;
    nd_t *q=NULL;
    nd_t *m=NULL;
    while(p->next!=my_list->phead){
        m=p;
        q=p->next;
        while(q!=my_list->phead){
            if(p->data==q->data){
                m->next=q->next;
                free(q);
                q=m->next;
            }else{
                m=q;
                q=q->next;
            }
        }
        p=p->next;
    }
}

(四)应用:实现约瑟夫环

1.问题描述

有一位叫约瑟夫的将军,在一次战斗中,连同手下的士兵一起被俘虏了。手下的士兵都非常爱国,宁死不投降,约瑟夫将军想了个办法:
让大家站成一圈,开始数数,从1开始数,数到7的人就自杀,
下一个人重新从1开始数,数到7再自杀,依次类推
直到只剩下一个人为止,最终剩下的就是约瑟夫将军,
然后他不想死,他投降了。这种“圈”,我们称之为“约瑟夫环”

要求:编写代码,模拟约瑟夫环淘汰人的过程,
命令行输入 ./a.out 总人数 数到几自杀 (总人数>1 数到几自杀>1 )
要求程序输出:
第x次 淘汰的是y号
以及最终剩下的是几号
如:输入 ./a.out 5 3 则程序输出
第1次 淘汰的是3号
第2次 淘汰的是1号
第3次 淘汰的是5号
第4次 淘汰的是2号
最后剩下的是 4 号

2. 问题分析

首先需要检查参数的合理性,参数都是以字符串形式保存的,需要转换成int型数据;
无头链表创建链表时就是创建第一个节点,即编号为1的人,之后依次开始创建节点

3. 代码实现

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

typedef struct _Node{
    int data;
    struct _Node *next;
}node_t;

node_t *create_circle(int num){
    //创建第一个节点
    node_t *phead=(node_t *)malloc(sizeof(node_t));
    if(NULL==phead) return NULL;
    phead->data=1;
    phead->next=phead;
    //创建剩余节点
    node_t *pnew=NULL;
    node_t *ptemp=phead;
    for(int i=1;i<num;i++){
        pnew=(node_t *)malloc(sizeof(node_t));
        pnew->data=i+1;
        if(NULL==pnew) return NULL;
        //找到尾节点
        while (ptemp->next!=phead)
            ptemp=ptemp->next;
        pnew->next=ptemp->next;
        ptemp->next=pnew;
    }
    return phead;
}

int print_circle(node_t *phead){
    if(NULL==phead) return -1;
    node_t *ptemp=phead;
    while(ptemp->next!=phead){
        printf("%d ",ptemp->data);
        ptemp=ptemp->next;
    }
    printf("%d ",ptemp->data);
    putchar(10);
    return 0;
}

int del_circle(node_t *phead,int count){
    if(NULL==phead) return -1;
    int c=1;
    int sum=0;
    node_t *pprev=NULL;
    while(phead->next!=phead){
        if(c==count){
            sum++;
            c=1;
            printf("第%d次淘汰%d号\n",sum,phead->data);
            pprev->next=phead->next;
            free(phead);
            phead=pprev->next;
            continue;
        }
        c++;
        pprev=phead;
        phead=phead->next;
    }
    printf("第%d号存活\n",phead->data);
    return 0;
}

int main(int argc, char const *argv[])
{
    if (argc!=3){
        printf("./a/out 总人数 数到几\n");
        return -1;
    }
    int sum=atoi(argv[1]); //人数 
    int num=atoi(argv[2]); //数到几
    node_t *my_list=NULL;
    my_list=create_circle(sum);
    print_circle(my_list);
    del_circle(my_list,num);
    return 0;
}

4. 使用前面的循环链表实现

main.c文件:

#include "circle_list.h"

int del(nd_t *phead,int n);
int main(int argc, char const *argv[])
{
    if(3 != argc)
    {
        printf("参数不合理\n");
        return -1;
    }
    int num=atoi(argv[1]); //保存个数
    int n=atoi(argv[2]);//数到几
    if(num<=0)
    {
        printf("人数应当大于0\n");
        return-1;
    }
    list_t *my_list=NULL;
    //第一个人及其编号
    create_list(&my_list);
    //后面的人
    for(int i=1;i<=num;i++){
        if(insert_list_by_tail(my_list,i)){
            printf("插入失败\n");
            return -1;
        }
    }
    print_list(my_list);  
    del(my_list->phead,n);
    return 0;
}

int del(nd_t *phead,int n)
{
    if(NULL==phead)
    {
        printf("传参错误\n");
        return -1;
    }
    if(0>=n)
    {
        printf("传参错误,n应当大于0\n");
        return -1;
    }
    int index=0;
    nd_t *pptemp=NULL;

    while(phead->next!=phead)
    {
        for(int i=0;i<n-1;i++) //phead默认移到下一位了,故只需要再移动n-1次
        {
            pptemp=phead;
            phead=phead->next;
        }
        //此时phead是需要删除的节点,执行删除操作
        pptemp->next=phead->next; 
        printf("第%d次删除%d\n",index+1,phead->data);
        free(phead);
        //删除完成后pead等于后一个节点
        phead=pptemp->next;
        index++;
    }
    printf("%d存活\n",phead->data);
    free(phead);
    phead=NULL;
    return 0;
}

二、代码源码已上传资源

链接:
C语言实现循环链表源码链接
C语言实现约瑟夫环源码链接

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app+php 生成微信二维码 分销海报

主要代码如下&#xff0c;可直接复制调试参数&#xff1a; //查询当前用户是否有分销海报public function user_poster(){$this->checkAuth();//查询会员信息$user $this->getUserInfoById($this->user_id);if(!empty($user[distribution_img])){$result[data] $use…

期权高频交易能做吗?期权可以频繁交易吗?

今天带你了解期权高频交易能做吗&#xff1f;期权可以频繁交易吗&#xff1f;在期权交易市场&#xff0c;大部分人都知道不能频繁交易&#xff0c;就连不少投资新手都知道频繁交易是大忌&#xff0c;是错误的&#xff0c;是应该避免的。所以是不行的。 期权高频交易能做吗&…

建WordPress主题官网模板

蓝色的中文WordPress企业模板 https://www.zhanyes.com/qiye/6305.html 暗红色WordPress律师事务所网站模板 https://www.zhanyes.com/qiye/23.html 红色大banner图WordPress外贸网站模板 https://www.zhanyes.com/waimao/27.html

js 表格添加|删除一行交互

一、需求 二、实现 <div style"margin-bottom: 55px"><form action"" method"post" enctype"multipart/form-data" id"reportForm" name"sjf" style"margin-left: 25px;margin-bottom: 50px;&quo…

笔记:Context

Context 是上下文对象&#xff0c;是 Android 常用类 Activity、Service 和 Application 都间接继承 Context &#xff0c;Context 是一个抽象类&#xff0c;内部定义了很多方法和静态常量&#xff0c;具体实现类是 ContextImpl ContextImpl 和 ContextWrapper 继承子 Context…

macOS上编译android的ffmpeg及ffmpeg.c

1 前言 前段时间介绍过使用xcode和qt creator编译调试ffmepg.c&#xff0c;运行平台是在macOS上&#xff0c;本文拟介绍下android平台如何用NDK编译链编译ffmepg库并使用。 macOS上使用qt creator编译调试ffmpeg.c macOS上将ffmpeg.c编译成Framework 大体思路&#xff1a; 其…

LTspice仿真中设置电阻随时间变化的方法

背景&#xff1a; 笔者找了很多资料都没有看到如何设置电阻、电容等参数随时间变化。但在实际模拟中&#xff0c;总会遇到需要模拟这些量的变化。故撰写此文&#xff0c;供大家参考。 除了模拟随时间变化外&#xff0c;同样的思路也可以模拟随其他变量变化 效果展示 设置电…

python3.5如何安装numpy

python3.5如何安装numpy&#xff1f;步骤如下&#xff1a; 1.首先应该将你的Python环境变量设置正确。检验是否正确的方法就是winR&#xff0c;输入cmd 。在窗口中输入python&#xff0c;应该得到如下所示的效果图&#xff1a; 可以在命令框中直接编译python。 2.安装pip&…

乡村振兴与乡村旅游创新:创新乡村旅游产品,提升旅游服务水平,打造特色乡村旅游品牌,助力美丽乡村建设

目录 一、引言 二、乡村旅游产品的创新 &#xff08;一&#xff09;挖掘乡村特色资源 &#xff08;二&#xff09;注重产品体验性 &#xff08;三&#xff09;创新旅游产品形态 三、旅游服务水平的提升 &#xff08;一&#xff09;加强基础设施建设 &#xff08;二&…

ESP32入门:1、VSCode+PlatformIO环境搭建(离线快速安装)

文章目录 背景安装vscode安装配置中文 安装Platform IO安装PIO 新建ESP32工程参考 背景 对于刚接触单片机的同学&#xff0c;使用vscodeplatformIO来学习ESP32是最方便快捷的&#xff0c;比IDF框架简单&#xff0c;且比arduino文件管理性能更好。但是platformIO安装较为麻烦&a…

《中国科技纵横》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a; 问&#xff1a;《中国科技纵横》期刊是核心吗&#xff1f; 答&#xff1a;不是&#xff0c;是万方维普收录的正规期刊。 问&#xff1a;《中国科技纵横》知网收录吗&#xff1f; 答&#xff1a;知网不收录&#xff0c;万方维普收录。主管单位&#xf…

ES 生命周期管理

一 .概念 ILM定义了四个生命周期阶段&#xff1a;Hot&#xff1a;正在积极地更新和查询索引。Warm&#xff1a;不再更新索引&#xff0c;但仍在查询。cold&#xff1a;不再更新索引&#xff0c;很少查询。信息仍然需要可搜索&#xff0c;但是如果这些查询速度较慢也可以。Dele…

出吉林大学计算机考研资料适用于计专966/计学941/软专967

本人是24上岸吉大计算机专硕的考生&#xff0c;先上成绩&#xff1a; 出专业课备考过程的相关笔记资料&#xff0c;也可以提供经验分享等&#xff1a; 吉林大学计算机数据结构基础算法ADL汇总&#xff0c;适用于计专966/计学941/软专967综合整理小绿书以及期末题上重难点算法…

字符串和字符串函数(2)

前言&#xff1a; 在字符串和字符串函数&#xff08;1&#xff09;-CSDN博客中&#xff0c;已将将字符串和字符函数的使用了解&#xff0c;并且实现模拟了一些字符串的库函数。 接下来将继续深入学习字符串和字符串函数。并且模拟实现一些较为复杂的函数。 可控制字符…

gpt-4o api申请开发部署应用:一篇全面的指南

利用 GPT-4o API 开发创新应用&#xff1a;一篇全面的指南 OpenAI 的 GPT-4o 是一款集成了音频、视觉和文本处理能力的多模态人工智能模型&#xff0c;它的出现代表了人工智能领域的重大进步。在本篇文章中&#xff0c;我们将详细介绍如何通过 OpenAI API 使用 GPT-4o&#xf…

xcode开发swift允许发送http请求设置

Xcode 现在新建项目默认只支持HTTPS请求&#xff0c;认为HTTP请求不安全&#xff0c;所以不支持。但是开发环境一般都是http模式&#xff0c;所以需要单独配置才可以访问。 需要到项目的设置里面&#xff0c;点击info&#xff0c;如果没有App Transport Security Setting这一项…

【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(二)

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

生信分析进阶3 - pysam操作bam文件统计unique reads和mapped reads高级技巧合辑

pysam操作bam文件统计unique reads和mapped reads高级技巧 1. Linux服务器读取bam文件 服务器查看bam常用方法。 # bam_path&#xff1a; bam文件路径 samtools view -h bam_path|grep -v ^|less -S2. samtools python os库读取bam文件 缺点速度较慢。 import os# 读取ba…

springboot从2.7.2 升级到 3.3.0

文章目录 概要准备报错调整小结后记 概要 时代在进步&#xff0c;springboot已经来到了3.3.0 , 于是我们也打算升级下sbvadmin到3.3&#xff0c; jdk使用21的版本&#xff0c;下面是升级过程中碰到的一些问题&#xff0c;问题不大。 2.7.2 -> 3.3.0 准备 下载jdk21&#…

AdroitFisherman模块安装日志(2024/5/31)

安装指令 pip install AdroitFisherman-0.0.29.tar.gz -v 安装条件 1:Microsoft Visual Studio Build Tools 2:python 3.10.x 显示输出 Using pip 24.0 from C:\Users\12952\AppData\Local\Programs\Python\Python310\lib\site-packages\pip (python 3.10) Processing c:\u…