数据结构实验二之线性表(中)

实验题3:实现双链表的各种基本运算的算法

题目描述

编写一个程序dlinklist.cpp,实现双链表的各种基本运算和整体建表算法(偏

双链表的元素类型ElemType为int),并在此基础上设计一个程序exp2-3.cpp完成以

功能。

(1)初始化双链表h。

(2)依次采用尾插法插入元素a、b、c、d、e。

(3)输出双链表h。

(4)输出双链表h的长度。

(5)判断双链表h是否为空。

(6)输出双链表h的第3个元素。

(7)输出元素a的位置。

(8)在第4个元素的位置上插入元素f。

(9)输出双链表h。

(10)删除双链表h的第3个元素。

(11)输出双链表h。

(12)释放双链表h。

dlinklist.cpp程序,其中包含如下函数。

· InitList(DLinkNode *&L):初始化双链表L。

· DestroyList(DLinkNode*L):释放双链表L。

·ListEmpty(DLinkNode*L):判断双链表L是否为空表。

· ListLength(DLinkNode*L):返回双链表L中的元素个数。

· DispList(DLinkNode *L.):输出双链表L。

. GetElem(DLinkNode *I.int i,ElemType &.e):获取双链表L中的第i个元素。

· LocateElem(DLinkNode*L.ElemType e):在双链表L中查找元素e。

. ListInsert(DLinkNode *&1 .. int i.ElemType e):在双链表L的第i个位置上插

入元素e。

· ListDelete(DLinkNode *&L,int i,ElemType &e):从双链表L中删除第i个

元素。

运行代码

dlinklist.cpp
#include <stdio.h>
#include <malloc.h>typedef int ElemType;
typedef struct DNode
{ElemType data;struct DNode* prior;struct DNode* next;
} DLinkNode;// 头插法创建双向链表
void CreateListF(DLinkNode*& L, ElemType a[], int n)
{DLinkNode* s;// 分配头结点空间L = (DLinkNode*)malloc(sizeof(DLinkNode));L->prior = L->next = NULL;for (int i = 0; i < n; i++){// 分配新结点空间s = (DLinkNode*)malloc(sizeof(DLinkNode));s->data = a[i];// 将新结点插入头结点之后s->next = L->next;if (L->next != NULL)L->next->prior = s;L->next = s;s->prior = L;}
}// 尾插法创建双向链表
void CreateListR(DLinkNode*& L, ElemType a[], int n)
{DLinkNode* s, * r;// 分配头结点空间L = (DLinkNode*)malloc(sizeof(DLinkNode));L->prior = L->next = NULL;r = L;for (int i = 0; i < n; i++){// 分配新结点空间s = (DLinkNode*)malloc(sizeof(DLinkNode));s->data = a[i];// 将新结点插入终端结点之后r->next = s;s->prior = r;r = s;}r->next = NULL;
}// 初始化双向链表
void InitList(DLinkNode*& L)
{// 分配头结点空间L = (DLinkNode*)malloc(sizeof(DLinkNode));L->prior = L->next = NULL;
}// 判断链表是否为空
bool ListEmpty(DLinkNode* L)
{return L->next == NULL;
}// 求链表长度
int ListLength(DLinkNode* L)
{DLinkNode* p = L;int i = 0;while (p->next != NULL){i++;p = p->next;}return i;
}// 输出链表
void DispList(DLinkNode* L)
{DLinkNode* p = L->next;while (p != NULL){// 输出当前结点数据printf("%c ", p->data);p = p->next;}printf("\n");
}// 求链表中第 i 个元素的值
bool GetElem(DLinkNode* L, int i, ElemType& e)
{int j = 0;DLinkNode* p = L;if (i <= 0) return false;while (j < i && p != NULL){j++;p = p->next;}if (p == NULL)return false;else{e = p->data;return true;}
}// 查找第一个值域为 e 的元素的序号
int LocateElem(DLinkNode* L, ElemType e)
{int i = 1;DLinkNode* p = L->next;while (p != NULL && p->data != e){i++;p = p->next;}if (p == NULL)return 0;elsereturn i;
}// 在链表中插入第 i 个元素
bool ListInsert(DLinkNode* L, int i, ElemType e)
{int j = 0;DLinkNode* p = L, * s;if (i <= 0) return false;while (j < i - 1 && p != NULL){j++;p = p->next;}if (p == NULL)return false;s = (DLinkNode*)malloc(sizeof(DLinkNode));s->data = e;s->next = p->next;if (p->next != NULL)p->next->prior = s;s->prior = p;p->next = s;return true;
}// 删除链表中第 i 个元素
bool ListDelete(DLinkNode*& L, int i, ElemType& e)
{int j = 0;DLinkNode* p = L, * q;if (i <= 0) return false;while (j < i - 1 && p != NULL){j++;p = p->next;}if (p == NULL)return false;q = p->next;if (q == NULL)return false;e = q->data;p->next = q->next;if (q->next != NULL)q->next->prior = p;free(q);return true;
}// 销毁链表
void DestroyList(DLinkNode*& L)
{DLinkNode* pre = L, * p = pre->next;while (p != NULL){free(pre);pre = p;p = p->next;}free(pre);
}
Excp2-3.cpp
#include <stdio.h>
#include <stdlib.h>
#include "dlinklist.cpp"int main() {DLinkNode* h;ElemType e;printf("双链表的基本运算如下:\n");printf("(1)初始化双链表 h\n");InitList(h);printf("(2)依次采用尾插法插入元素 a,b,c,d,e\n");ListInsert(h, 1, 'a');ListInsert(h, 2, 'b');ListInsert(h, 3, 'c');ListInsert(h, 4, 'd');ListInsert(h, 5, 'e');printf("(3)输出双链表 h:");DispList(h);printf("(4)双链表 h 长度:%d\n", ListLength(h));printf("(5)双链表 h 为%s\n", (ListEmpty(h) ? "空" : "非空"));GetElem(h, 3, e);printf("(6)双链表 h 的第 3 个元素:%c\n", e);printf("(7)元素 a 的位置:%d\n", LocateElem(h, 'a'));printf("(8)在第 4 个元素位置上插入元素 f\n");ListInsert(h, 4, 'f');printf("(9)输出双链表 h:");DispList(h);printf("(10)删除 h 的第 3 个元素\n");ListDelete(h, 3, e);printf("(11)输出双链表 h:");DispList(h);printf("(12)释放双链表 h\n");DestroyList(h);return 0;
}

代码结果与思路

  1. 创建链表函数

    • 头插法创建双向链表(CreateListF
      • 首先为头结点分配内存空间,并将头结点的前驱和后继指针都置为NULL
      • 然后遍历输入的数组,对于数组中的每个元素:
        • 分配新节点s的内存空间。
        • 将新节点s的数据域设置为当前数组元素的值。
        • 将新节点s插入到头结点之后,具体操作是让新节点的next指针指向原来头结点的下一个节点,如果原来头结点有下一个节点,则让原来头结点的下一个节点的前驱指针指向新节点;再让头结点的next指针指向新节点,新节点的前驱指针指向头结点。
    • 尾插法创建双向链表(CreateListR
      • 同样先为头结点分配内存空间,并初始化头结点的前驱和后继指针为NULL
      • 设置一个指针r指向头结点,作为尾指针。
      • 遍历输入数组,对于每个元素:
        • 分配新节点s的内存空间。
        • 将新节点s的数据域设置为当前数组元素的值。
        • 将新节点s插入到尾指针r之后,即让尾指针rnext指针指向新节点,新节点的前驱指针指向尾指针r;然后更新尾指针r为新节点。
      • 最后将尾指针的next指针置为NULL,表示链表的末尾。
  2. 初始化链表函数(InitList:为双向链表分配头结点空间,并将头结点的前驱和后继指针都置为NULL,完成链表的初始化。

  3. 判断链表是否为空函数(ListEmpty:只需要检查头结点的next指针是否为NULL,如果是,则链表为空,返回true;否则返回false

  4. 求链表长度函数(ListLength

    • 从链表头结点开始遍历,设置一个指针p指向头结点,设置一个计数器i初始值为 0。
    • pnext指针不为NULL时,说明还有节点未遍历,计数器i加一,移动指针p指向下一个节点。
    • 遍历结束后,返回计数器i的值,即为链表的长度。
  5. 输出链表函数(DispList:从链表的第一个有效节点开始输出,设置一个指针p指向头结点的下一个节点。当p不为NULL时,输出p所指节点的数据域,然后移动指针p指向下一个节点,继续输出直到链表末尾。

  6. 求链表中第 i 个元素的值函数(GetElem

    • 首先检查输入的序号i是否合法(大于 0),如果不合法则返回false
    • 设置一个指针p指向头结点,一个计数器j初始值为 0。
    • j小于ip不为NULL时,计数器j加一,移动指针p指向下一个节点。
    • 如果遍历结束后pNULL,说明没有找到第i个节点,返回false;否则将p所指节点的数据域赋值给参数e,并返回true
  7. 查找第一个值域为 e 的元素的序号函数(LocateElem

    • 从链表的第一个有效节点开始查找,设置一个计数器i初始值为 1,设置一个指针p指向头结点的下一个节点。
    • p不为NULLp所指节点的数据域不等于要查找的值e时,计数器i加一,移动指针p指向下一个节点。
    • 如果遍历结束后pNULL,说明没有找到值为e的节点,返回 0;否则返回计数器i的值,即找到的节点的序号。
  8. 在链表中插入第 i 个元素函数(ListInsert

    • 首先检查输入的序号i是否合法(大于 0),如果不合法则返回false
    • 设置一个指针p指向头结点,一个计数器j初始值为 0。
    • j小于i - 1p不为NULL时,计数器j加一,移动指针p指向下一个节点,目的是找到要插入位置的前一个节点。
    • 如果遍历结束后pNULL,说明没有找到要插入位置的前一个节点,返回false
    • 分配新节点s的内存空间,设置新节点的数据域为要插入的值e
    • 将新节点s插入到节点p之后,具体操作是让新节点的next指针指向p的下一个节点,如果p有下一个节点,则让p的下一个节点的前驱指针指向新节点;再让新节点的前驱指针指向ppnext指针指向新节点。最后返回true表示插入成功。
  9. 删除链表中第 i 个元素函数(ListDelete

    • 首先检查输入的序号i是否合法(大于 0),如果不合法则返回false
    • 设置一个指针p指向头结点,一个计数器j初始值为 0。
    • j小于i - 1p不为NULL时,计数器j加一,移动指针p指向下一个节点,目的是找到要删除节点的前一个节点。
    • 如果遍历结束后pNULL,说明没有找到要删除节点的前一个节点,返回false
    • 设置一个指针q指向p的下一个节点,如果qNULL,说明不存在第i个节点,返回false
    • q所指节点的数据域赋值给参数e,然后将节点q从链表中删除,具体操作是让pnext指针指向q的下一个节点,如果q的下一个节点存在,则让q的下一个节点的前驱指针指向p;最后释放节点q的内存空间,并返回true表示删除成功。
  10. 销毁链表函数(DestroyList

  • 从链表头结点开始,依次释放每个节点的内存空间。设置两个指针preppre初始指向头结点,p初始指向头结点的下一个节点。
  • p不为NULL时,释放pre所指节点的内存空间,然后将pre指向pp指向p的下一个节点。
  • pNULL时,说明链表中的所有节点都已释放,再释放pre所指的头结点的内存空间。

实验题4:实现循环单链表的各种基本运算的算法

题目描述

编写一个程序clinklist.cpp,实现循环单链表的各种基本运算和整体建表算法

(假设循环单链表的元素类型ElemType为int),并在此基础上设计一个程序exp2-4.cpp

完成以下功能。

(1)初始化循环单链表h。

(2)依次采用尾插法插入元素a、b、c、d、e。

(3)输出循环单链表h。

(4)输出循环单链表h的长度。

(5)判断循环单链表h是否为空。

(6)输出循环单链表h的第3个元素。

(7)输出元素a的位置。

(8)在第4个元素的位置上插入元素f。

(9)输出循环单链表h。

(10)删除循环单链表h的第3个元素。

(11)输出循环单链表h。

(12)释放循环单链表h。

算法:clinklist.cpp程序,其中包含如下函数。

· InitList(LinkNode*&L):初始化循环单链表L。

· DestroyList(LinkNode*L):释放循环单链表L。

· ListEmpty(LinkNode *L):判断循环单链表L是否为空表。

· ListLength(LinkNode *L):返回循环单链表L中的元素个数。

· DispList(LinkNode *L):输出循环单链表L。

· GetElem(LinkNode *L,int i,ElemType &e):获取循环单链表L中的第i个元素。

· LocateElem(LinkNode*L,ElemType e):在循环单链表L中查找元素e。

· ListInsert(LinkNode*&L,int i,ElemType e):在循环单链表L中的第i个位置

上插入元素e。

· ListDelete(LinkNode*&L,int i,ElemType &e):从循环单链表L中删除第i个

元素。

运行代码

clinklist.cpp
#include <stdio.h>
#include <stdlib.h>typedef int ElemType;
typedef struct Node
{ElemType data;struct Node* next;
} LinkNode;// 头插法创建循环单链表
void CreateListF(LinkNode*& L, ElemType a[], int n)
{LinkNode* s;int i;// 分配头结点空间L = (LinkNode*)malloc(sizeof(LinkNode));L->next = NULL;for (i = 0; i < n; i++){// 分配新结点空间s = (LinkNode*)malloc(sizeof(LinkNode));s->data = a[i];// 将新结点插入头结点之后s->next = L->next;L->next = s;}// 找到尾结点,让尾结点的 next 指向头结点 L,形成循环链表s = L->next;while (s->next != NULL){s = s->next;}s->next = L;
}// 尾插法创建循环单链表
void CreateListR(LinkNode*& L, ElemType a[], int n)
{LinkNode* s, * r;int i;// 分配头结点空间L = (LinkNode*)malloc(sizeof(LinkNode));L->next = NULL;r = L;for (i = 0; i < n; i++){// 分配新结点空间s = (LinkNode*)malloc(sizeof(LinkNode));s->data = a[i];// 将新结点插入终端结点(r 指向的结点)之后r->next = s;r = s;}// 让尾结点的 next 指向头结点 L,形成循环链表r->next = L;
}// 初始化循环单链表
void InitList(LinkNode*& L)
{// 分配头结点空间L = (LinkNode*)malloc(sizeof(LinkNode));// 头结点的 next 指向自身,形成只有一个头结点的循环链表L->next = L;
}// 销毁循环单链表
void DestroyList(LinkNode*& L)
{LinkNode* pre = L, * p = pre->next;while (p != L){// 释放前一个结点free(pre);pre = p;// p 指向下一个结点p = p->next;}// 释放最后一个结点(此时 pre 指向最后一个结点)free(pre);
}// 判断循环单链表是否为空
bool ListEmpty(LinkNode* L)
{return L->next == L;
}// 求循环单链表的长度
int ListLength(LinkNode* L)
{LinkNode* p = L;int i = 0;while (p->next != L){// 移动到下一个结点p = p->next;// 长度加一i++;}return i;
}// 输出循环单链表
void DispList(LinkNode* L)
{LinkNode* p = L->next;while (p != L){// 输出当前结点的数据printf("%c ", p->data);// 移动到下一个结点p = p->next;}printf("\n");
}// 求循环单链表中第 i 个元素的值
bool GetElem(LinkNode* L, int i, ElemType& e)
{int j = 1;LinkNode* p = L->next;if (i <= 0 || L->next == L)return false;if (i == 1){// 提取第一个结点的值e = L->next->data;return true;}while (j <= i - 1 && p != L){// 移动到下一个结点j++;p = p->next;}if (p == L)return false;else{// 提取第 i 个结点的值e = p->data;return true;}
}// 查找第一个值域为 e 的元素的序号
int LocateElem(LinkNode* L, ElemType e)
{LinkNode* p = L->next;int i = 1;while (p != L && p->data != e){// 移动到下一个结点p = p->next;// 序号加一i++;}if (p == L)return 0;elsereturn i;
}// 在循环单链表中插入第 i 个元素
bool ListInsert(LinkNode*& L, int i, ElemType e)
{int j = 1;if (i <= 0) return false;if (L->next == L || i == 1){LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));s->data = e;s->next = L->next;L->next = s;return true;}LinkNode* p = L->next;while (j <= i - 2 && p != L){j++;p = p->next;}if (p == L)return false;else{LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));s->data = e;s->next = p->next;p->next = s;return true;}
}// 删除循环单链表中第 i 个元素
bool ListDelete(LinkNode*& L, int i, ElemType& e)
{int j = 1;LinkNode* p = L, * q;if (i <= 0 || L->next == L)return false;if (i == 1){q = L->next;e = q->data;L->next = q->next;free(q);return true;}while (j < i - 1 && p != L){j++;p = p->next;}if (p == L)return false;else{q = p->next;e = q->data;p->next = q->next;free(q);return true;}
}
Excp2-4.cpp
#include <stdio.h>
#include <stdlib.h>
#include "clinklist.cpp"int main() {LinkNode* h;ElemType e;printf("循环单链表的基本运算如下:\n");printf("(1)初始化循环单链表 h\n");InitList(h);printf("(2)依次采用尾插法插入元素 a,b,c,d,e\n");ListInsert(h, 1, 'a');ListInsert(h, 2, 'b');ListInsert(h, 3, 'c');ListInsert(h, 4, 'd');ListInsert(h, 5, 'e');printf("(3)输出循环单链表 h:");DispList(h);printf("(4)循环单链表 h 长度:%d\n", ListLength(h));printf("(5)循环单链表 h 为%s\n", (ListEmpty(h) ? "空" : "非空"));GetElem(h, 3, e);printf("(6)循环单链表 h 的第 3 个元素:%c\n", e);printf("(7)元素 a 的位置:%d\n", LocateElem(h, 'a'));printf("(8)在第 4 个元素位置上插入元素 f\n");ListInsert(h, 4, 'f');printf("(9)输出循环单链表 h:");DispList(h);printf("(10)删除 h 的第 3 个元素\n");ListDelete(h, 3, e);printf("(11)输出循环单链表 h:");DispList(h);printf("(12)释放循环单链表 h\n");DestroyList(h);return 0;
}

代码结果与思路

定义了一个循环单链表的节点结构体Node(重命名为LinkNode),包含以下成员:

  • data:存储节点的数据,这里数据类型为ElemType,实际上是int类型。
  • next:指向下一个节点的指针。
  1. 创建链表函数

    • 头插法创建循环单链表(CreateListF
      • 首先为头结点分配内存空间,并将头结点的next指针置为NULL
      • 然后遍历输入的数组,对于数组中的每个元素:
        • 分配新节点s的内存空间。
        • 将新节点s的数据域设置为当前数组元素的值。
        • 将新节点s插入到头结点之后,具体操作是让新节点的next指针指向原来头结点的下一个节点,再让头结点的next指针指向新节点。
      • 最后找到尾结点,让尾结点的next指针指向头结点,形成循环链表。
    • 尾插法创建循环单链表(CreateListR
      • 同样先为头结点分配内存空间,并将头结点的next指针置为NULL
      • 设置一个指针r指向头结点,作为尾指针。
      • 遍历输入数组,对于每个元素:
        • 分配新节点s的内存空间。
        • 将新节点s的数据域设置为当前数组元素的值。
        • 将新节点s插入到尾指针r之后,即让尾指针rnext指针指向新节点,然后更新尾指针r为新节点。
      • 最后将尾指针的next指针指向头结点,形成循环链表。
  2. 初始化链表函数(InitList:为循环单链表分配头结点空间,并将头结点的next指针指向自身,形成只有一个头结点的循环链表。

  3. 销毁链表函数(DestroyList

    • 从链表的第一个有效节点开始,依次释放每个节点的内存空间。设置两个指针preppre初始指向头结点,p初始指向头结点的下一个节点。
    • p不等于头结点时,释放pre所指节点的内存空间,然后将pre指向pp指向p的下一个节点。
    • p等于头结点时,说明链表中的所有节点都已释放,再释放pre所指的头结点的内存空间。
  4. 判断链表是否为空函数(ListEmpty:只需要检查头结点的next指针是否指向自身,如果是,则链表为空,返回true;否则返回false

  5. 求链表长度函数(ListLength

    • 从链表的第一个有效节点开始遍历,设置一个指针p指向头结点的下一个节点,设置一个计数器i初始值为 0。
    • pnext指针不等于头结点时,说明还有节点未遍历,计数器i加一,移动指针p指向下一个节点。
    • 遍历结束后,返回计数器i的值,即为链表的长度。
  6. 输出链表函数(DispList

    • 从链表的第一个有效节点开始输出,设置一个指针p指向头结点的下一个节点。
    • p不等于头结点时,输出p所指节点的数据域,然后移动指针p指向下一个节点,继续输出直到回到头结点。
  7. 求链表中第 i 个元素的值函数(GetElem

    • 首先检查输入的序号i是否合法(大于 0)以及链表是否为空,如果不合法或链表为空则返回false
    • 如果i等于 1,直接提取头结点的下一个节点的值并返回true
    • 如果i大于 1,设置一个指针p指向头结点的下一个节点,一个计数器j初始值为 1。
    • j小于i - 1p不等于头结点时,计数器j加一,移动指针p指向下一个节点,目的是找到第i个节点的前一个节点。
    • 如果遍历结束后p等于头结点,说明没有找到第i个节点,返回false;否则将p的下一个节点的数据域赋值给参数e,并返回true
  8. 查找第一个值域为 e 的元素的序号函数(LocateElem

    • 从链表的第一个有效节点开始查找,设置一个计数器i初始值为 1,设置一个指针p指向头结点的下一个节点。
    • p不等于头结点且p所指节点的数据域不等于要查找的值e时,计数器i加一,移动指针p指向下一个节点。
    • 如果遍历结束后p等于头结点,说明没有找到值为e的节点,返回 0;否则返回计数器i的值,即找到的节点的序号。
  9. 在链表中插入第 i 个元素函数(ListInsert

    • 首先检查输入的序号i是否合法(大于 0),如果不合法则返回false
    • 如果链表为空或者i等于 1,直接在头结点之后插入新节点,具体操作是分配新节点s的内存空间,设置新节点的数据域为要插入的值e,让新节点的next指针指向头结点的下一个节点,再让头结点的next指针指向新节点,最后返回true表示插入成功。
    • 如果i大于 1,设置一个指针p指向头结点的下一个节点,一个计数器j初始值为 1。
    • j小于i - 2p不等于头结点时,计数器j加一,移动指针p指向下一个节点,目的是找到要插入位置的前一个节点。
    • 如果遍历结束后p等于头结点,说明没有找到要插入位置的前一个节点,返回false
    • 分配新节点s的内存空间,设置新节点的数据域为要插入的值e
    • 将新节点s插入到节点p之后,具体操作是让新节点的next指针指向p的下一个节点,再让pnext指针指向新节点,最后返回true表示插入成功。
  10. 删除链表中第 i 个元素函数(ListDelete

  • 首先检查输入的序号i是否合法(大于 0)以及链表是否为空,如果不合法或链表为空则返回false
  • 如果i等于 1,直接删除头结点的下一个节点,具体操作是设置一个指针q指向头结点的下一个节点,将q所指节点的数据域赋值给参数e,让头结点的next指针指向q的下一个节点,释放q所指节点的内存空间,最后返回true表示删除成功。
  • 如果i大于 1,设置一个指针p指向头结点,一个计数器j初始值为 1。
  • j小于i - 1p不等于头结点时,计数器j加一,移动指针p指向下一个节点,目的是找到要删除节点的前一个节点。
  • 如果遍历结束后p等于头结点,说明没有找到要删除节点的前一个节点,返回false
  • 设置一个指针q指向p的下一个节点,将q所指节点的数据域赋值给参数e,让pnext指针指向q的下一个节点,释放q所指节点的内存空间,最后返回true表示删除成功。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

springboot itextpdf 形式导出pdf

先看效果(这里只设置了软件版本和 完成情况的勾选框) 导入pom依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version> </dependency> <!--itextpdf--> <d…

C++之初识STL(概念)

STL&#xff08;标准模板库&#xff09; STL广义分类为&#xff1a;容器&#xff0c;算法&#xff0c;迭代器 * **容器**和**算法**之间通过**迭代器**进行无缝连接 意义&#xff1a;C的**面向对象**和**泛型编程**思想&#xff0c;目的就是**复用性的提升** STL六大组件 1. 容…

Flink 本地启动的多种方式

Flink 本地启动的多种方式 Application模式通过代码提交到Yarn上启动 //设置Yarn客户端 YarnClient yarnClient ; Configuration configuration new Configuration(); if (customConfiguration ! null) {configuration.addAll(customConfiguration); } configuration.set(Jo…

PostgreSQL的学习心得和知识总结(一百五十一)|[performance] PostgreSQL列对齐

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

九泰智库 | 医械周刊- Vol.59

⚖️ 法规动态 国家药监局&#xff1a;截至目前已批准296个创新医疗器械上市 近日&#xff0c;国家药监局在“推动高质量发展”系列主题新闻发布会介绍。截至目前&#xff0c;国家药监局已批准296个创新医疗器械上市&#xff0c;这些创新医疗器械主要集中在植介入类设备、高端…

孤独伤感视频素材哪里找?分享热门伤感短视频素材资源网站

你是不是也经常在抖音上刷到很火的伤感视频&#xff0c;那么伤感视频素材都在哪里可以下载呢&#xff1f;作为一名从业多年的视频剪辑师&#xff0c;今天就跟大家聊聊那些可以下载伤感素材高清无水印的网站&#xff0c;如果你也在苦苦找寻伤感素材&#xff0c;快来看看吧&#…

基于Es和智普AI实现的语义检索

1、什么是语义检索 语义检索是一种利用自然语言处理&#xff08;NLP&#xff09;和人工智能&#xff08;AI&#xff09;技术来理解搜索查询的语义&#xff0c;以提供更准确和相关搜索结果的搜索技术&#xff0c;语义检索是一项突破性的技术&#xff0c;旨在通过深入理解单词和…

yolov5训练后自动保存打印到屏幕的性能信息

Windows环境&#xff1a; 执行train程序结束之后&#xff0c;会在屏幕打印下列信息&#xff1a; 我们在进行多轮训练时&#xff0c;性能信息不能及时保存&#xff0c;键入以下代码&#xff0c;可自动保存 #放在引入模块后面 sys.stdout open(train_output.txt, w) #这两行代…

音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件

通过FFmpeg命令可以合并视频和音频。比如合并mp4文件中的视频和AAC裸流&#xff08;关于AAC裸流具体可以参考&#xff1a; 《音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件》&#xff09;中的音频&#xff0c;生成FLV文件&…

string map练习

to_string 在<string>头文件的std命名空间中 要格式化写浮点型入字符串用 2.map 直接尾插 set,map同方法&#xff0c;map只是把键变为pair键值对 4. string的花括号隐式类型转换不能字母个数字母&#xff0c;会被认为是初始化列表&#xff0c;而不是个数加字母的隐式类…

SpringBoot 整合 apache fileupload 轻松实现文件上传与下载(通用版)

我们以Thymeleaf页面模板引擎为例&#xff0c;简单介绍利用 apache fileupload 工具实现文件上传的功能。 2.1、添加相关依赖包 首先创建一个基础的 Spring Boot 项目&#xff0c;并引入相关的依赖包。 2.2、添加相关配置参数 2.3、文件上传示例 对应文件上传的Controller类&…

QT设计中文输入法软键盘DLL给到C#开发步骤

开发目的&#xff1a;本文提供解决触摸屏C#程序中无法输入中文问题&#xff0c;中文拼音采用开源的谷歌输入法程序、使用QT编译中文输入法界面和中文输入法接口给到C#使用。 开发步骤&#xff1a; 1、QT中设计字母和字符输入界面 2、QT中设计数字输入界面 3、QT中封装调用谷歌…

深度学习:卷积神经网络CNN

目录 一、什么是卷积&#xff1f; 二、卷积神经网络的组成 1. 卷积层 2. 池化层 3. 激活函数 4. 全连接层 三、卷积神经网络的构造 四、代码实现 1.数据预处理 2.创建卷积神经网络 3.创建训练集和测试集函数 4.创建损失函数和优化器并进行训练 一、什么是卷积&…

LPDDR4芯片学习(一)——基础知识与引脚定义

一、基础知识 01 dram基本存储单元 当需要将一位数据存储到DRAM中时&#xff0c;晶体管会充电或放电电容。充电的电容表示逻辑高&#xff08;1&#xff09;&#xff0c;放电的电容表示逻辑低&#xff08;0&#xff09;。由于电容会随着时间泄漏电荷&#xff0c;因此需要定期刷…

学习记录:js算法(四十三):翻转二叉树

文章目录 翻转二叉树我的思路网上思路递归栈 总结 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点 图一&#xff1a; 图二&#xff1a; 示例 1&#xff1a;&#xff08;如图一&#xff09; 输入&#xff1a;root [4,2,7,1…

Python记录

1.冒泡排序 时间复杂度O&#xff08;n^2) 选择、插入都是 def bubble(data, reverse):for i in range(len(data)-1):for j in range(len(data)-i-1):if data[j] > data[j1]:data[j], data[j1] data[j1], data[j]if reverse:data.reverse()return data 2.快速排序 时间…

护理陪护小程序|陪护系统||陪护系统开发

在当今社会&#xff0c;随着人口老龄化的加剧和家庭结构的变化&#xff0c;护理与陪护服务的需求日益增长。为了更好地满足这一市场需求&#xff0c;并提升服务效率与质量&#xff0c;护理陪护小程序应运而生。这类小程序不仅为用户提供了便捷、高效的服务预约与管理平台&#…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Redis集群

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建Redis集群 Redis 集群是一种分布式的 Redis 解决方案&#xff0c;能够在多个节点之间分片存储数据&#xff0c;实现水平扩展和高可用性。与传统的主从架构不同&#xff0c;Redis 集群支持数据自动分片、主节点故…

J Transl Med结肠癌分子分型+简单实验

目录 技术路线 实验设计&#xff08;药物敏感性&#xff09; 亮点 方法 从 TCGA 和 GEO 数据库下载大量和单细胞 RNA 测序以及 CRC 的临床数据。HRGs 和 LMRGs 来自分子特征数据库。使用 R 软件包 DESeq2 进行差异表达分析。使用无监督聚类进行分子亚型。使用单变量 Cox 回…

嘉宾云集旌城 只为大赛而来 2024ISGC国际烈酒(中国)大奖赛在德阳落下帷幕

秋高气爽、古蜀之源&#xff0c;迎来第六届国际烈酒&#xff08;中国&#xff09;大奖赛&#xff1b;五谷丰登、重装之都&#xff0c;齐聚百名国际烈酒大奖赛评委。 9月18日&#xff0c;由德阳市人民政府、国家葡萄酒及白酒露酒产品质量检验检测中心、上海合作组织多功能经贸平…