PTA数据结构作业一
6-1 链表的插入算法
本题要求实现一个插入函数,实现在链表llist中的元素x之后插入一个元素y的操作。
函数接口定义:
int InsertPost_link(LinkList llist, DataType x, DataType y); 其中 llist是操作的链表,x是待插入元素y的前驱节点元素,y是待插入的元素
int InsertPost_link (LinkList llist,DataType x,DataType y)
{LinkList m=llist->next;LinkList n;while(m->data!=x){m=m->next;if(m==NULL){printf ("not exist data %d\n",x);return 0;}}n=(LinkList) malloc (sizeof(struct Node));if (n!=NULL){n->data=y;n->next=m->next;m->next=n;return 0;}
}
6-2 链表的删除算法
本题要求实现一个函数,实现删除链表llist中的指定元素deldata。
函数接口定义:
void DelNode_Link(head, deldata);
其中head是操作的链表表头结点,deldata是待删除的元素。
1.创建结构体和宏定义类型名
#include<stdio.h>
#include<stdlib.h>typedef int DataType;
struct Node {DataType data;struct Node* next;
};
typedef struct Node *PNode;
typedef struct Node *LinkList;2.创建头节点。
LinkList SetNullList_Link ()
{LinkList head=(LinkList)malloc(sizeof(struct Node));if(head!=NULL){head->next=NULL;return head;}elseprintf("alloc failure");return head;
}3.利用尾插法创建单向链表。
void CreatList(struct Node* head)
{int data;LinkList p=head->next,pre=head;scanf("%d",&data);while(data!=-1){p=(struct Node*)malloc(sizeof(struct Node));p->data=data;p->next=NULL;pre->next=p;pre=p;scanf("%d",&data);}
}
4.删除值为x的节点。
void DelNode_Link(LinkList head, DataType x)
{LinkList p=head->next;LinkList beforep=head; //通过beforep和p遍历整个链表while(p!=NULL){if(p->data==x){beforep->next=p->next;free(p);//释放节点p,否则占用内存空间break;}else{beforep=p;p=p->next;if(p==NULL)printf("not exist %d\n",x);}}
}5.打印整个链表。
void print(LinkList head)
{LinkList p=head->next;while (p!=NULL){printf("%d ",p->data);p=p->next;}
}6.主函数
int main()
{ int x;LinkList head;head=SetNullList_Link();CreatList(head);scanf("%d",&x);DelNode_Link(head,x);print(head);return 0;
}
6-3 移动链表中的最大值到尾部
编写函数MoveMaxToTail(),实现查找单链表中值最大的结点,并将其移动到链表尾部,注意其他结点的相对次序不变。要求尽量具有较高的时间效率。
例如输入8 12 46 30 5,输出为8 12 30 5 46
函数接口定义:
void MoveMaxToTail (LinkList H );
void MoveMaxToTail(LinkList head)
{
LinkList pre=head;
LinkList r=head;LinkList q=pre->next;while(q!=NULL){ if(pre->data<q->data){ pre=q;}q=q->next;}while(r->next!=pre)r=r->next; //指针r指向最大元素的上一个元素,便于进行删除操作q=head;while(q->next!=NULL)q=q->next; //使q重新指向链表中的最后一个元素,便于进行插入操作if(pre->next==NULL)return; //若最后一个元素为最大元素,则直接返回,不需要进行其他操作else{ r->next=pre->next;pre->next=NULL;q->next=pre;}
}
6-4 合并两个递增有序的单循环链表
本题要求实现一个合并函数,实现对有序单循环链表tail1和tail2的合并,要求合并时实现去重操作,即合并后的链表中没有重复的元素,并且合并后的链表为递增有序链表。
函数接口定义:
PNode mergeNDeduplicateList(PNode tail1, PNode tail2);
其中tail1是待合并的第一个有序单循环链表,采用的尾指针表示方法;tail2是待合并的第二个有序单循环链表,采用的尾指针表示方法;
解法一:
1.创建结构体和宏定义类型名。
#include<stdio.h>
#include<stdlib.h>typedef int DataType;
struct Node {DataType data; struct Node* next;
};
typedef struct Node *PNode;
typedef struct Node *LinkList; 2.创建尾节点,给尾节点的赋值-1。
PNode createEmptyLinkedList()
{PNode current; //尾结点current = (PNode)malloc(sizeof(Node));current->next = NULL;current->data = -1;return current;
}3.创建单循环链表。注意,尾节点并未插入链表中,tail->next指向最后一个节点,并不是tail指向最后一个节点。tail->data的值为-1。
PNode buildCircularLinkedList(int n, PNode tail)
{PNode current=NULL, prev;prev = tail; for (int i = 0; i < n; i++){current = (PNode)malloc(sizeof(Node));current->next = NULL;scanf("%d", ¤t->data);prev->next = current;prev = current;}current->next = tail->next; //形成循环tail->next = current; //tail在此时才变成了尾指针,并指向尾结点;之前一直担任头指针的角色,指向的是首元节点。return tail;
}4.实现有序单循环链表tail1和tail2的合并,要求合并时实现去重操作,即合并后的链表中没有重复的元素,并且合并后的链表为递增有序链表。
PNode mergeNDeduplicateList(PNode tail1, PNode tail2)
{int temp;PNode pre, q;//合并tail1和tail2链表,并将循环链表拆成单向链表LinkList head=tail1->next->next; //head为tail1的首元节点tail1->next->next= tail2->next->next; //将tail1的尾结点与tail2的首元节点相连接tail2->next->next=NULL; //将tail2尾结点的指针域置空//通过指针pre和p的移动,对链表进行冒泡排序(从小到大)。pre=head; //pre指向首元节点q=head->next;for(pre=head; pre->next!=NULL; pre=pre->next)for(q=pre->next; q!=NULL; q=q->next){if(pre->data>q->data){temp=pre->data;pre->data=q->data;q->data=temp;}}//对链表进行去重操作,代码如下pre=head;q=pre->next;while(q!=NULL){if(pre->data==q->data) //两个结点中的数据元素相等{ if(q== tail2->next) //当最后两个元素相等时,需要做特殊处理{tail2->next=pre; //因为q->next=NULL,当执行pre->next=q->next时,会导致pre->next=NULL,pre->next=NULL; //即tail2节点会丢失,不便于等会链表首尾结合和返回tail2指针} else //相等的不是最后两个结点{pre->next=q->next; //删除后一个结点free(q);q=pre->next;}}else //两个结点中的值不相等,则后移,继续对比{pre=q;q=q->next;}}tail2->next->next=head; //对链表进行首尾接合,并使tail2作为尾指针return tail2;
}
5.打印链表。
void printCircularLinkedList(PNode tail)
{PNode current, last;last = tail->next;current = last->next;do{printf("%d ", current->data);current = current->next;} while (current != last->next);
}
6.将函数整合进主函数中。代码如下
int main()
{PNode list1, list2;int list1_number, list2_number;list1 = createEmptyLinkedList();list2 = createEmptyLinkedList();scanf("%d", &list1_number);buildCircularLinkedList(list1_number, list1);scanf("%d", &list2_number);buildCircularLinkedList(list2_number, list2);list1 = mergeNDeduplicateList(list1, list2);printCircularLinkedList(list1);return 0;
}
解法二:
#include<stdio.h>
#include<stdlib.h>typedef int DataType;
struct Node
{DataType data;struct Node * next;
};
typedef struct Node Node;
typedef struct Node *PNode;
typedef struct Node *LinkList;PNode createEmptyLinkedList()
{PNode current;current = (PNode)malloc(sizeof(Node));current->next = NULL;current->data = -1;return current;
}PNode buildCircularLinkedList(int n, PNode tail)
{PNode current=NULL, prev;prev = tail; for (int i = 0; i < n; i++){current = (PNode)malloc(sizeof(Node));current->next = NULL;scanf("%d", ¤t->data);prev->next = current;prev = current;}current->next = tail->next;tail->next = current;return tail;
}PNode mergeNDeduplicateList(PNode tail1, PNode tail2)
{PNode LinkNode;LinkNode = tail2->next->next;tail2->next->next = tail1->next->next;tail1->next->next = LinkNode;free(tail2);PNode StopNode,pre,p;StopNode = tail1->next->next;while(StopNode != tail1->next){pre = StopNode;p = pre->next;while(pre != tail1->next){if(p->data == StopNode->data){if(p == tail1->next)tail1->next = pre;PNode temp;temp = p;pre->next = p->next;p = pre->next;free(temp);}else{pre = pre->next;p = pre->next;}}StopNode = StopNode->next;}do{pre = tail1->next->next;p = pre->next;while(pre != tail1->next){if(p->data < pre->data){DataType TempData;TempData = p->data;p->data = pre->data;pre->data = TempData; }else{pre = pre->next;p = pre->next;}}StopNode = StopNode->next;}while(StopNode != tail1->next);return tail1;
}void printCircularLinkedList(PNode tail)
{PNode current, last;last = tail->next;current = last->next;do{printf("%d ", current->data);current = current->next;} while (current != last->next);
}int main()
{PNode list1, list2;int list1_number, list2_number;list1 = createEmptyLinkedList();list2 = createEmptyLinkedList();scanf("%d", &list1_number);buildCircularLinkedList(list1_number, list1);scanf("%d", &list2_number);buildCircularLinkedList(list2_number, list2);list1 = mergeNDeduplicateList(list1, list2);printCircularLinkedList(list1);return 0;
}
6-5 链表中奇偶结点的移动
本题要求实现一个函数,实现对单循环链表中奇数和偶数结点的移动,要求奇数在前面,偶数在后面,且结点之间的相对顺序不变。
函数接口定义:
PNode Move_Odd_Even(LinkList tail);
tail是单循环链表的尾指针
解法一:
奇偶点移动函数,此函数是本题的重点,采用的方法大致为:
①建立两个新链表,head1链表负责装偶数,head2链表负责装奇数。
②遍历链表每一个节点,若为奇数,则利用尾插法插入head2链表;若为偶数,则利用尾插法插入head1链表;
③将head1和head2的链表头尾连接,形成一个新的单向循环链表,并将次链表的尾指针作为返回值。
PNode Move_Odd_Even(LinkList tail)
{PNode head=tail->next, pre=head->next, q=pre->next;free(head); //释放原链表的头指针,因为头指针无数据LinkList head1=(LinkList)malloc(sizeof(struct Node));PNode pre1=head1; //pre1指针随着新插入的节点移动,便于进行尾插法LinkList head2=(LinkList)malloc(sizeof(struct Node));PNode pre2=head2; //pre2指针随着新插入的节点移动,便于进行尾插法while(q!=head->next) //原链表是循环链表,当q遍历到原来pre的位置(首元节点)时,遍历结束{if (pre->data%2==0) //判断元素是否为偶数{pre->next=pre1->next;pre1->next=pre;pre1=pre1->next;}else //若不是偶数,则为奇数{pre->next=pre2->next;pre2->next=pre;pre2=pre2->next;}pre=q;q=q->next; //pre始终保持在q的前面}
//将head1链表和head2链表合成一个新的单循坏链表head1=head1->next; //head1链表在后,不需要其头结点pre2->next=head1; //两个链表相连接pre1->next=head2; //形成循坏return pre1; //返回新循坏链表的尾指针
}
解法二:
该程序的主要思想在于:
1、遍历栈,找到偶数
2、利用尾插法将偶数插入队尾
#include<stdio.h>
#include<stdlib.h>typedef int DataType;
struct Node
{DataType data; struct Node* next;
};
typedef struct Node *PNode;
typedef struct Node *LinkList; LinkList CreateList_Tail_loop()
{LinkList head = (LinkList)malloc(sizeof(struct Node));PNode cur = NULL;PNode tail = head;DataType data;scanf_s("%d", &data);while (data != -1){ cur = (struct Node*)malloc(sizeof(struct Node));cur->data = data;tail->next = cur;tail = cur;scanf_s("%d", &data);}tail->next = head;return tail;
}
PNode Move_Odd_Even(LinkList tail)
{PNode pre = tail->next;PNode head = tail->next;PNode P2 = NULL;PNode p = pre->next;PNode temp = (struct Node*)malloc(sizeof(struct Node));temp->data = 0;tail->next = temp;temp->next = head;tail = temp;while(p->data){if(p->data%2 ==0){P2 = p;p = p->next;pre->next = p;tail->next = P2;tail = P2;}else{ p = p->next;pre = pre->next;}}pre->next = temp->next;tail->next = head;free(temp);return tail;
}void print(LinkList tail)
{PNode head = tail->next;PNode p = head->next;while (p != head){printf("%d ", p->data);p = p->next;}
}void DestoryList_Link(LinkList tail)
{PNode pre = tail->next;PNode p = pre->next;while (p != tail){free(pre);pre = p;p = pre->next;}free(pre);free(tail);
}int main()
{LinkList tail = NULL;LinkList p = NULL;tail = CreateList_Tail_loop();p = Move_Odd_Even(tail);print(p);DestoryList_Link(tail);return 0;
}
7-1 多项式的加法
用链表表示多项式,并实现多项式的加法运算
输入格式:
输入在第一行给出第一个多项式POLYA的系数和指数,并以0,0 结束第一个多项式的输入;在第二行出第一个多项式POLYB的系数和指数,并以0,0 结束第一个多项式的输入。
输出格式:
对每一组输入,在一行中输出POLYA+POLYB和多项式的系数和指数。
输入样例:
5,0 2,1 1,6 8,15 0,0
-2,1 3,6 4,8 0,0
输出样例:
5,0 4,6 4,8 8,15
解法一:
本题主要思路:
1.建立两个头指针分别为head1和head2链表,链表每一个节点分别记录每一个多项式的系数coef和指数exp。
2.preA遍历链表head1,preB遍历链表head2。
3.建立一个只有一个头节点的链表head,逐步遍历链表head1和head2。分别有如下三种情况:
①preA->exp<preB->exp,将节点preA利用尾插法插入链表head。
②preB->exp<preA->exp,将节点preB利用尾插法插入链表head。
③preB->exp=preA->exp,这种情况分为两种:
当preA->coef+preB->coef=0时,释放节点preA和preB。
当preA->coef+preB->coef≠0时:将多项式指数相同的项的系数相加,记录在preA,并利用尾插法将preA节点插如链表head。
#include<stdio.h>
#include<stdlib.h>
struct tagNode
{float coef; //系数coefficientint exp; //指数exponentstruct tagNode *next; //指针域
};typedef struct tagNode Node;
typedef struct tagNode *PNode;void insertList(PNode head,PNode pnode)
{PNode pPre = head;while(pPre->next != NULL){if(pPre->next->exp>pnode->exp) //链表中节点pPre->next的指数>新加入节点pnode的指数{ //将新节点pnode插入到pPre之后pnode->next = pPre->next;pPre->next = pnode;break;}else //链表中节点pPre->next的指数≤新加入节点pnode的指数,继续往后查找{pPre = pPre->next;}}if(pPre->next == NULL) //新加入节点pnode的指数较大,放在链表最后{pPre->next = pnode;}
}void CreateList(PNode head)
{int exp;float coef;PNode pTemp = NULL;head->next = NULL;scanf("%f,%d",&coef,&exp);while(coef != 0 || exp != 0){pTemp = (PNode)malloc(sizeof(struct tagNode));pTemp->coef = coef;pTemp->exp = exp;pTemp->next = NULL;insertList(head, pTemp);scanf("%f, %d", &coef, &exp);}
}void printLinkedList(PNode head)
{PNode temp = head->next;while(temp != NULL){printf("%0.0f,",temp->coef);printf("%d ",temp->exp);temp = temp->next;}printf("\n");
}void Add_Poly(PNode pa,PNode pb)
{PNode p = pa->next; //链表1,和多项式的结果放在链表1中 PNode q = pb->next;PNode pre = pa;PNode u;float x; //临时变量 while(p != NULL && q != NULL){if(p->exp < q->exp) //比较链表1和链表2当前节点的指数大小,链表1也是存放结果的地方{pre = p;p = p->next; //p指向要比较的下一个节点,pre最终指向结果链表的最后一个节点}else if(p->exp == q->exp) //假如链表1和链表2的指数相等,则要系数相加{x = p->coef + q->coef;if(x != 0) //相加后的系数不是0,保留上一个节点就好了{p->coef = x;pre = p; } else //相加后系数为0,不需要保留任何一个节点,删除链表1的节点{pre->next = p->next;free(p); }p=pre->next; //p指向下一个节点//下面是进行链表2的删除工作u = q;q = q->next;free(u); }else //如果链表2当前节点指数小,把链表2的当前节点加入到链表1中{u = q->next;q->next = p;pre->next = q;pre = q;q = u; }}if(q) //如果链表2比链表1长,需要把链表2多余的部分加入到结果链表中;
//如果链表1比链表2长则不需要任何操作。{pre->next = q; }free(pb);
} int main()
{PNode head1 = (PNode)malloc(sizeof(struct tagNode));PNode head2 = (PNode)malloc(sizeof(struct tagNode));CreateList(head1);CreateList(head2);Add_Poly(head1,head2);printLinkedList(head1);return 0;
}
解法二:
本题主要思路:
1.建立两个头指针分别为head1和head2链表,链表每一个节点分别记录每一个多项式的系数coef和指数exp。
2.preA遍历链表head1,preB遍历链表head2。
3.建立一个只有一个头节点的链表head,逐步遍历链表head1和head2。分别有如下三种情况:
①preA->exp<preB->exp,将节点preA利用尾插法插入链表head。
②preB->exp<preA->exp,将节点preB利用尾插法插入链表head。
③preB->exp=preA->exp,这种情况分为两种:
当preA->coef+preB->coef=0时,释放节点preA和preB。
当preA->coef+preB->coef≠0时:将多项式指数相同的项的系数相加,记录在preA,并利用尾插法将preA节点插如链表head。
#include<stdio.h>
#include<stdlib.h>typedef int DataType;
struct Node
{DataType dataX,dataY; struct Node* next;
};
typedef struct Node *PNode;
typedef struct Node *LinkList; LinkList SetNullList_Link()
{LinkList head = (LinkList)malloc(sizeof(struct Node));if (head != NULL)head->next = NULL;elseprintf("alloc failure");return head;
}void CreateList(struct Node* head)
{PNode p = NULL; PNode q = head;int dataX,dataY;scanf("%d,%d", &dataX,&dataY);while (dataX != 0 || dataY != 0) { p = (struct Node*)malloc(sizeof(struct Node));p->dataX = dataX;p->dataY = dataY;p->next = NULL;q->next = p;q = p;scanf("%d,%d", &dataX,&dataY);}
}PNode mergeNDeduplicateList(PNode POLYA, PNode POLYB)
{PNode A,B,pre;B = POLYB->next;while(B != NULL){pre = POLYA;A = pre->next;while(A != NULL){if(A->dataY == B->dataY){A->dataX = A->dataX + B->dataX;if(A->dataX == 0){pre->next = A->next;free(A);}POLYB->next = B->next;free(B);B = POLYB->next;break;}else if(A->dataY > B->dataY){POLYB->next = B->next;B->next = A;pre->next = B;B = POLYB->next;break;}pre = pre->next;A = pre->next;}}PNode StopNode;StopNode = POLYA;while(StopNode != NULL){pre = POLYA;A = pre->next;while(A->next != NULL){if(A->dataY > A->next->dataY){pre->next = A->next;PNode temp;temp = A->next;A->next = temp->next;temp->next = A;}pre = pre->next;A = pre->next;}StopNode = StopNode->next;}return POLYA;
}void print(LinkList head)
{PNode p = head->next;while (p != NULL){printf("%d,%d ", p->dataX,p->dataY);p = p->next;}
}void DestoryList_Link(LinkList head)
{PNode pre = head; PNode p = pre->next;while (p) {free(pre);pre = p;p = pre->next;}free(pre);
}int main()
{LinkList POLYA,POLYB;POLYA = SetNullList_Link();POLYB = SetNullList_Link();CreateList(POLYA);CreateList(POLYB);POLYA = mergeNDeduplicateList(POLYA,POLYB);print(POLYA);DestoryList_Link(POLYA);return 0;
}
相关文章:
PTA数据结构作业一
6-1 链表的插入算法 本题要求实现一个插入函数,实现在链表llist中的元素x之后插入一个元素y的操作。 函数接口定义: int InsertPost_link(LinkList llist, DataType x, DataType y); 其中 llist是操作的链表,x是待插入元素y的前驱节点元素…...
前端(九)js介绍(2)
js介绍(2) 文章目录 js介绍(2)一、函数1.1函数的两种形式1.2函数的作用域1.3声明与提升 二、bom操作三、dom操作 一、函数 1.1函数的两种形式 //有参函数 //js中的函数只能返回一个值,如果要返回多个需要放在数组或对象中 function func(a,b){return ab } func(1,…...
CUTLASS:高性能 CUDA 线性代数模板库详解
CUTLASS:高性能 CUDA 线性代数模板库详解 引言什么是 CUTLASS?CUTLASS 的主要特点: CUTLASS 的用途如何安装 CUTLASS1. 环境准备2. 下载 CUTLASS3. 构建 CUTLASS4. 设置环境变量5. 验证安装 使用 CUTLASSCUTLASS 的优势总结 引言 在深度学习…...
关于CISP报名费用详情
CISP即“注册信息安全专业人员”,是中国信息安全测评中心实施的国家认证项目,旨在培养信息安全领域的专业人才。对于有意报考CISP的考生而言,了解报名考试费用是备考过程中不可或缺的一环。 CISP的报名考试费用主要包括培训费用、考试费用、…...
css 关于flex布局中子元素的属性flex
css flex布局中子元素的属性flex 1. flex 是 flex-grow、flex-shrink 和 flex-basis 的简写 语法格式: flex: [flex-grow] [flex-shrink] [flex-basis];各属性解析: flex-grow: 子元素如何按比例分配父元素的 剩余空间。 默认值:0&#…...
功率器件热设计基础(四)——功率半导体芯片温度和测试方法
/ 前言 / 功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的热设计基础知识,才能完成精确热设计,提高功率器件的利用率,降低系统成本,并保证系统的可靠性。 功率器件热设计基础系列文章会…...
OpenStack系列第四篇:云平台基础功能与操作(Dashboard)
文章目录 1. 镜像(Image)添加镜像查看镜像删除镜像 2. 卷(Volume)创建卷查看卷删除卷 3. 网络(虚拟网络)创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对(…...
WebSocket封装
提示:记录工作中遇到的需求及解决办法 文章目录 前言二、背景三、WebSocket3.1 什么是 WebSocket ?为什么使用他?四、封装 WebSocket4.1 Javascript 版本4.2 Typescript 版本4.3 如何使用?五、我的痛点如何处理前言 本文将介绍 WebSocket 的封装,比如:心跳机制,重连和一…...
面试题解,JVM的运行时数据区
一、请简述JVM运行时数据区的组成结构及各部分作用 总览 从线程持有的权限来看 线程私有区 虚拟机栈 虚拟机栈是一个栈结构,由许多个栈帧组成,一个方法分配一个栈帧,线程每执行一个方法时都会有一个栈帧入栈,方法执行结束后栈帧…...
【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解
一个愿意伫立在巨人肩膀上的农民...... Crontab是Linux和类Unix操作系统下的一个任务调度工具,用于周期性地执行指定的任务或命令。Crontab允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。这些任务可以按照分钟、小时、日…...
Caffeine Cache Java缓存组件
缓存组件Caffeine Cache 定义介绍整合springboot用法整合spring-boot-starter-cache用法 定义介绍 特性 高性能:基于高效并发设计和 TinyLFU 算法,命中率高。 丰富策略:支持容量限制、过期时间、异步加载、自定义清理策略。 统计监控&#x…...
电子电气架构 --- 什么是自动驾驶技术中的域控制单元(DCU)?
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
Redis核心技术知识点全集
Redis数据结构和常用命令 1. String字符串2. Hash哈希3. List列表4. Set集合5. Sorted Set有序集合6. Redis常用命令参考Redis事务机制...
【每日学点鸿蒙知识】文件读写、屏幕宽度亮度、扫一扫权限、编码器问题、wlan设置
1、参照文档,在操作文件时,读取不到内容或出现程序闪退? 参照文档,进行文件写入和读取时,出现读取不到或闪退 export function createFile() {// 获取应用文件路径let context getContext(this) as common.UIAbilit…...
后端开发-Maven
环境说明: windows系统:11版本 idea版本:2023.3.2 Maven 介绍 Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型(POM),通过一组构建规则和约定来管理项目的构建…...
LiteFlow 流程引擎引入Spring boot项目集成pg数据库
文章目录 官网地址简要项目引入maven 所需jar包配置 PostgreSQL 数据库表使用LiteFlow配置 yml 文件通过 代码方式使用 liteflow数据库sql 数据在流程中周转 官网地址 https://liteflow.cc/ 简要 如果你要对复杂业务逻辑进行新写或者重构,用LiteFlow最合适不过。…...
电子电气架构 --- 汽车电子电器设计概述
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
API 设计:从基础到最佳实践
https://levelup.gitconnected.com/api-design-101-from-basics-to-best-practices-a0261cdf8886 在本次深入研究中,我们将从基础开始,逐步了解 API 设计,并逐步实现定义卓越 API 的最佳实践。 作为开发人员,您可能熟悉其中的许多…...
简易内存池(中)
提示:文章 文章目录 前言一、背景二、第二版代码用例2用例3用例4用例5 总结 前言 前期疑问: 本文目标: 一、背景 最近 二、 针对上述失败用例,修改代码如下 第二版代码 #include <stdbool.h> #include <stdio.h>…...
svn不能添加.a文件
解决办法 在home目录下有一个.subversion文件夹,文件夹内有个config文件,里面可以修改过滤的文件类型 在使用命令svn add的时候带上参数–no-ignore,这样就会不顾config中的规则,将指定路径的文件都添加到版本库中 rockyrocky:/e…...
PH47代码框架 24241231 重要更新
仪式感一下:2024年最后一天,发布 PH47 代码框架的一次重要更新。当然这并不是有意的,而是直到现在才把更新的所有工作全部做完(希望确实如此)。 本次更新要点: 1、加入多IMU支持。本次更新正式加入对 MPU65…...
小程序信息收集(小迪网络安全笔记~
免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,…...
用户界面的UML建模07
4.2 抽象表示层的行为(Abstract Presentation Behaviour) AbstractForm 类定义了一组如下所示的四种操作: showForm() , getData() , sendConfirmation() 和sendCancellation()。在该阶段的设计过程(desig…...
LabVIEW手部运动机能实验系统
在运动科学、人机交互和康复训练等领域,手部运动功能的研究具有重要的应用价值。开发了一个基于LabVIEW的手部运动机能实验系统设计,该系统利用力量作为关键参数,通过实时数据采集和反馈帮助受试者完成精确的手部动作,同时为研究人…...
Java Map 源码解析:核心原理与应用
Java Map 源码解析:核心原理与应用 Java 的 Map 接口是集合框架中一个重要的组成部分,专门用于存储键值对。其强大的功能和灵活的实现使其在各种应用场景中得到了广泛的使用。本文面向对 Java 集合框架有一定了解的开发者,通过对 Map 接口及…...
基于Mosquito源码理解MQTT5.0的属性概念
MQTT 5.0协议相比之前的版本(如MQTT 3.1.1)增加了很多属性,这些属性分布于报文的可变头部(Variable Header)和有效载荷(Payload)中。这些属性大大增强了协议的可扩展性和灵活性,使其能够更好地适应现代物联网应用的复杂需求。 属性的定义在源码包mosquitto-2.0.18/inc…...
easyui textbox使用placeholder无效
easyui textbox使用placeholder无效 在easyui 的textbox控件,请使用data-options 设定 示例 <input type text class easyui-textbox data-options "prompt:请输入您的邮箱"/>...
java AQS
什么是AQS AQS(AbstractQueuedSynchronizer,抽象队列同步器)是 Java 中并发控制的一种机制,位于 java.util.concurrent.locks 包下,它为构建锁、信号量等同步工具提供了一个框架。AQS 通过 队列 来管理多个线程之间的…...
机器人对物体重定向操作的发展简述
物体重定向操作的发展简述 前言1、手内重定向和外部重定向2、重定向原语3、重定向状态转换网络4、连续任意姿态的重定向5、利用其他环境约束重定向总结Reference 前言 对于一些特殊的任务(如装配和打包),对物体放置的位姿由明确的要求&#…...
数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)
编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...
vue3 Teleport瞬移组件
Teleport是瞬移组件,也称为传送门组件 它是一个可以使元素从一个组件转到另一个组件的组件。 如对话框、自定义菜单、警告提示、徽章,以及许多其他需要出现在特殊位置的自定义UI组件。假设现在页面中有两个元素,分别为div元素和button按钮元…...
Go语言学习路线
以下是一个较为系统的Go语言学习路线: 一、基础阶段 环境搭建与工具链熟悉 安装Go语言开发环境。在Go官方网站(https://golang.org/dl/)下载适合您操作系统的安装包并完成安装。 配置Go环境变量,如GOPATH和GOROOT。GOROOT是Go语…...
摄像头监视脚本
摄像头监视脚本,若检测到摄像头画面有变化,保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…...
【Leecode】Leecode刷题之路第97天之交错字符串
题目出处 97-交错字符串-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 97-交错字符串-官方解法 方法1:动态规划 思路: class Solution {public boolean isInte…...
MAC环境安装(卸载)软件
MAC环境安装(卸载)软件 jdknode安装node,并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净,可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…...
Spring Boot + Redisson 封装分布式锁
目标:一行代码调用,简单粗暴。 基操:自动加锁,自动解锁,自动处理异常,自动处理锁超时等。 安装 redis redisson <dependency><groupId>org.springframework.boot</groupId><artifac…...
从零开发一套UWB定位系统需要多长时间?UWB超宽带定位系统源码
从零开发一套UWB定位系统需要多长时间? 从零开发一套UWB定位系统所需的时间会受到多种因素的影响,以下是详细分析: 一、系统复杂度 1、基本功能定位系统 如果只是开发一个简单的UWB定位系统,仅实现基本的定位功能,如在…...
DataCap 2024.4.1 版本发布:MongoDB 驱动支持、工作流引擎升级
尊敬的 DataCap 用户: DataCap 2024.4.1 版本现已正式发布。本次更新包含多项重要功能升级和性能优化,现将主要更新内容公布如下: 核心功能升级 数据库功能增强 (实现功能) 新增数据库管理功能:支持创建、删除和切换数据库完善表…...
常见端口(22、25、53、80、443、110、143、3306、6379、21)和服务的安装与配置手册
文章目录 一、系统初始设置1. 系统与工具的基础配置1.1 系统更新1.2 网络连接测试1.3 工具安装 2. 防火墙配置2.1 启用防火墙服务2.2 检查默认规则2.3 开放常用端口2.4 查看已开放端口 二、常见端口及其用途1. 端口 22(SSH)2. 端口 25(SMTP&a…...
使用maven-mvnd替换maven大大提升编译打包速度
先上结论!!! 多模块清理并打包提升:约3.5倍 多模块不清理打包提升:约5.5倍 单模块提升:约2倍 从计算结果来看,多模块提升的效率更高。在使用mvnd package打包多模块式,可在控制台…...
图像去雾 | 基于Matlab的图像去雾系统(四种方法)
图像去雾 | 基于Matlab的图像去雾系统(四种方法) 目录 图像去雾 | 基于Matlab的图像去雾系统(四种方法)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于Matlab的图像去雾系统(四种方法) 关于图像…...
【Ubuntu 系统 之 开启远程桌面SSH登录】
【Ubuntu 系统 之 开启远程桌面&SSH登录】 一、开启 SSH 登录二、开启远程桌面1、更新包管理器并安装 xrdp1.1、遇到错误1.2、解决方法 2、安装桌面环境(如果服务器上没有 GUI)3、配置 xrdp 使用默认的 GNOME 桌面环境4、配置防火墙允许远程桌面连接…...
利用 AI 生成 XMind 思维导图教程
本文将介绍如何使用 AI 工具(如 ChatGPT 等),从无到有生成层次分明、可直接导入到 XMind 的 Markdown 格式思维导图。主要步骤包括:选择主题、编写并润色 Markdown 文档、在 XMind 中进行导入与可视化。 一、为什么使用 AI XMind…...
电子应用设计方案81:智能AI冲奶瓶系统设计
智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务,特别是在夜间或忙碌时,减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例,满足不同年龄段婴…...
MySQL的索引
没有索引会怎么样 数据库中的数据最终是存储在磁盘上的。 mysql服务器,本质上是内存进程,CURD操作全都是在内存中进行的—索引也是如此。 所以,需要将数据从磁盘读进内存,才能进行操作。 如果没有索引,表中的数据会向…...
Pytest 高级用法:间接参数化
文章目录 1. 引言2. 基础概念2.1 Fixture2.2 参数化 3. 代码实例3.1 基础设置3.2 测试用例示例示例 1:基础的间接参数化示例 2:通过 request 获取参数值示例 3:多参数组合测试示例 4:部分间接参数化 4. 最佳实践5. 总结参考资料 1…...
基于视觉语言模型(VLM)的CogAgent
前言 CogAgent 是由清华大学与智谱AI联合推出的一个多模态大模型,专注于图形用户界面(GUI)的理解和导航。它代表了在视觉语言模型(VLM)领域的一项重要进展,特别是在GUI Agent能力方面。相较于传统的基于文…...
文件传输工具FTransferor<优化篇>
在上一篇文章中,我们详细探讨了FTransferor文件传输工具的设计与实现,并展示了它在局域网文件传输方面的高效性。然而,随着互联网应用场景的不断丰富,传统的基于 TCP/UDP 的传输方式已经无法满足部分开发者的需求。特别是在跨平台…...
【Linux】Centos7下载npm
Index of /dist/v16.20.2/ (nodejs.org) 下载 wget https://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-x64.tar.gz解压 sudo tar -zxvf node-v16.20.2-linux-x64.tar.gz 配置环境变量 sudo vim /etc/profile export NODE_HOME/usr/local/node-v16.20.2-linux-x64 ex…...
Spring boot + Hibernate + MySQL实现用户管理示例
安装MySQL Windows 11 Mysql 安装及常用命令_windows11 mysql-CSDN博客 整体目录 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLS…...