数据结构(C语言)代码实现(七)——一元多项式的表示与相加

news2024/11/17 21:48:30

目录

前言

参考资料+格式

头文件LinkList.h

LocateElem函数,定位查找

有序插入(没测试)

完整代码

头文件polynomial.h

测试函数(主函数) 

测试结果


前言

寒假在家,有点学不下去,写文章的速度也很慢,看来四十天完成这项任务是不可能了。但比较兴奋的是,在这个过程中,我调试代码的速度有了明显的提升,很多时候一些小细节我可以通过网上资源的帮助解决,这是我以前严重缺乏的能力。第二个收获就是在复现代码的过程中真正意识到了模块化的好处,就想这篇文章,就与上一篇单链表的代码实现息息相关,可以说,上一篇稍微改改,就可以成为这一篇的一个头文件,因此节省了我很大的工作量。这一章也算告一段落,下面就看看我的成果吧。

数据结构(C语言)代码实现(六)——单链表的实现-CSDN博客

参考资料+格式

1、数据结构C语言严蔚敏版

2、LocateElem函数用的这个博主的代码。

数据结构——算法总结:一元多项式的表示与相加_建立一元多项式链表,实现相加操作,输出结果-CSDN博客

头文件LinkList.h

LocateElem函数,定位查找

Status LocateElem(LinkList L, ElemType e, Position& q, int(*compare)(ElemType, ElemType))
{   // 若升序链表L中存在与e满足判定函数compare()取值为0的元素,则q指示L中
	// 第一个值为e的结点的位置,并返回TRUE;否则q指示第一个与e满足判定函数
	// compare()取值>0的元素的前驱的位置。并返回FALSE
	Position p = L->head;
	Position pp = NULL;
	while (p != NULL && compare(p->data, e) < 0)
	{
		//没到表尾且没有比当前指数大的指数
		pp = p;    //记录当前位置
		p = p->next;    //继续往后找
	}
	if (p == NULL || compare(p->data, e) > 0) // 到表尾或比当前指数大的指数
	{
		q = pp;
		return FALSE;
	}
	else // 找到
	{// 没到表尾且p->data.expn=e.expn
		q = p;
		return TRUE;
	}
}

有序插入(没测试)

//有序插入
Status OrderInsert(LinkList& L, ElemType e, int(*compare)(ElemType, ElemType)) {
	//按有序判定函数compare()的约定,将值为e的结点插入到有序链表L的适当位置上
	Position s = L->head;Position p = L->head->next;
	while (p != NULL && compare(p->data, e) < 0) {
		p = p->next;
		s = s->next;
	}
	Link pp = (Link)malloc(sizeof(LNode));
	if (pp == NULL)return ERROR;//警告C6011
	pp->data = e;
	s->next = pp;
	pp->next = p;
	return OK;
}

不加上面的代码,报错警告C6011,原因是由于内存不够,malloc函数不能分配足够的空间,返回NULL,此时pp为空指针。

完整代码

本来想把Elemtype这个结构体放在polynomial.h这个头文件中,因为和课本代码顺序对得上。但是放在了后面的头文件,第一个头文件中的Elemtype没有办法定义,想互相调用,结果失败。最后就成了现在这个样子。

#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码

//-----线性链表的存储结构---------
//-----实现单向非循环有序链表-----
//-----头结点与首元结点不一致-----

typedef struct term {
	double coef;//系数
	int expn;//指数
}term, ElemType;//两个类型名:term用于本ADT,ElemType为LinkList的数据对象名

typedef struct LNode {//结点类型
	ElemType data;
	struct LNode* next;
}LNode, * Link, * Position;

typedef struct LinkNode {      //链表类型
	Link head, tail;  //分别指向线性链表中的头结点和最后一个结点
	int len;          //指示线性链表中数据元素的个数
}LinkNode, * LinkList;

typedef LinkList polynomial;//用带表头节点的有序链表表示多项式

Status MakeNode(Link& p, ElemType e) {
	//分配由p指向的值为e的结点,并返回OK;若分配失败,则返回ERROR
	p = (Link)malloc(sizeof(LNode));
	if (!p)
		return ERROR;
	p->data = e;
	return OK;
}
void FreeNode(Link& p) {//相当于free函数重命名
	//释放p所指结点
	free(p);
	p = NULL;
}

Status InitList(LinkList& L) {
	//构造一个空的线性链表L
	L = (LinkList)malloc(sizeof(LinkNode));
	if (!L)return ERROR;
	L->head = L->tail = (Link)malloc(sizeof(LNode));
	if (!L->head)return ERROR;
	L->head->next = NULL;
	L->len = 0;
	return OK;
}

Status DestroyList(LinkList& L) {
	//销毁线性链表L,L不再存在
	Link p;
	while (L->head) {//删除所有结点
		p = L->head;
		L->head = L->head->next;
		free(p);
	}
	free(L);
	L = NULL;
	return OK;
}

Status ClearList(LinkList& L) {
	//将线性链表L重置为空表,并释放原链表的结点空间
	Link p = L->head;
	while (L->head->next) {//保留一个结点,让其作为头结点
		p = L->head->next;
		L->head->next = p->next;
		free(p);
	}
	L->tail = L->head;
	L->len = 0;
	return OK;
}

Status InsFirst(Link h, Link s) {
	//已知h指向线性链表的头结点,将s所指结点插入到首元结点之前
	s->next = h->next;
	h->next = s;
	//这个函数没修改L->len的值,课本算法2.20需要补充L->len++。
	return OK;
}

Status DelFirst(Link h, Link& q) {
	//已知h指向线性链表的头结点,删除链表中的首元结点并以q返回
	q = h->next;
	h->next = q->next;
	q->next = NULL;
	return OK;
}

Status Append_add(LinkList& L, Link s) {
	//将指针s所指(彼此以指针相链)的一串结点链接在线性链表L的最后一个结点(用L->tail寻找)
	//之后,并改变链表L的尾指针指向新的尾结点
	while (s) {
		L->tail->next = s;
		L->tail = s;
		L->len++;
		s = s->next;
	}
	return OK;
}

Status Append_sub(LinkList& L, Link s) {
	//将指针s所指(彼此以指针相链)的一串结点链接在线性链表L的最后一个结点(用L->tail寻找)
	//之后,并改变链表L的尾指针指向新的尾结点
	while (s) {
		s->data.coef = -s->data.coef;
		L->tail->next = s;
		L->tail = s;
		L->len++;
		s = s->next;
	}
	return OK;
}

Status Remove(LinkList& L, Link& q) {
	//删除线性链表L中的尾节点并以q返回,改变链表L的尾指针指向新的尾结点
	if (!L->tail)return ERROR;
	Link p = L->head;
	while (p->next != L->tail)
		p = p->next;//寻找尾结点的上一个结点
	q = L->tail;
	L->tail = p;//改变尾结点
	L->tail->next = NULL;
	L->len--;
	return OK;
}

Status InsBefore(LinkList& L, Link& p, Link s) {
	//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前
	//并修改指针p指向新插入的结点
	Link q = L->head;
	while (q->next != p)
		q = q->next;//寻找结点q的上一个结点
	q->next = s;
	s->next = p;//插入s
	p = s;//修改指针p
	L->len++;
	return OK;
}

Status InsAfter(LinkList& L, Link& p, Link s) {
	//已知p指向线性链表L中的一个结点,将s所指的结点插入在p所指结点之后
	//并修改指针p指向新插入的结点
	s->next = p->next;
	p->next = s;
	p = s;
	L->len++;
	return OK;
}

Status SetCurElem(Link& p, ElemType e) {
	//已知p指向线性链表L中的一个结点,用e更新p所指结点中数据元素的值
	p->data = e;
	return OK;
}

ElemType GetCurElem(Link p) {
	//已知p指向线性链表L中的一个结点,返回p所指结点中数据元素的值
	return p->data;
}

Status ListEmpty(LinkList L) {
	//若线性链表L为空表,则返回TRUE,否则返回FALSE
	if (!L->len)
		return TRUE;
	else
		return FALSE;
}

int ListLength(LinkList L) {
	//返回线性链表L中元素个数
	return L->len;
}

Position GetHead(LinkList L) {
	//返回线性链表L中头结点的位置
	return L->head;
}

Position GetLast(LinkList L) {
	//返回线性链表L中尾结点的位置
	return L->tail;
}

Position PriorPos(LinkList L, Link p) {
	//已知p指向线性链表L中的一个结点,返回p所指结点中的直接前驱的位置
	//若无前驱,则返回NULL
	Link q = L->head;
	if (p == L->head)return NULL;
	while (q->next != p)
		q = q->next;
	return q;
}

Position NextPos(LinkList L, Link p) {
	//已知p指向线性链表L中的一个结点,返回p所指结点中的直接后继的位置
	//若无后继,则返回NULL
	return p->next;
}

Status LocatePos(LinkList L, int i, Link& p) {
	//返回p指示线性链表L中第i个结点的位置并返回OK,i值不合法时返回ERROR
	//头结点当作第0结点,首元结点第1个,尾结点第(L->len)个
	if (i<0 || i>L->len)return ERROR;
	int j = 0;Link q = L->head;
	while (j < i) {
		q = q->next;
		++j;//j++也一样
	}
	p = q;
	return OK;
}

Status LocateElem(LinkList L, ElemType e, Position& q, int(*compare)(ElemType, ElemType))
{   // 若升序链表L中存在与e满足判定函数compare()取值为0的元素,则q指示L中
	// 第一个值为e的结点的位置,并返回TRUE;否则q指示第一个与e满足判定函数
	// compare()取值>0的元素的前驱的位置。并返回FALSE
	Position p = L->head;
	Position pp = NULL;
	while (p != NULL && compare(p->data, e) < 0)
	{
		//没到表尾且没有比当前指数大的指数
		pp = p;    //记录当前位置
		p = p->next;    //继续往后找
	}
	if (p == NULL || compare(p->data, e) > 0) // 到表尾或比当前指数大的指数
	{
		q = pp;
		return FALSE;
	}
	else // 找到
	{// 没到表尾且p->data.expn=e.expn
		q = p;
		return TRUE;
	}
}

//有序插入
Status OrderInsert(LinkList& L, ElemType e, int(*compare)(ElemType, ElemType)) {
	//按有序判定函数compare()的约定,将值为e的结点插入到有序链表L的适当位置上
	Position s = L->head;Position p = L->head->next;
	while (p != NULL && compare(p->data, e) < 0) {
		p = p->next;
		s = s->next;
	}
	Link pp = (Link)malloc(sizeof(LNode));
	if (pp == NULL)return ERROR;//警告C6011
	pp->data = e;
	s->next = pp;
	pp->next = p;
	return OK;
}

//遍历链表
Status ListTraverse(LinkList L, void (*visit)(Link)) {
	//依次对L的每个元素调用函数visit()。一旦visit()失败,则操作失败。
	Link p = L->head;
	for (int i = 1;i <= L->len;i++) {
		p = p->next;
		visit(p);
	}
	printf("\n");
	return OK;
}

头文件polynomial.h

#pragma once

#include "LinkList.h"

//请注意前提,课本中的一元多项式项数为非递减排列

//-----基本操作的算法描述(部分)-----
int cmp(term a, term b) {
	//依a的指数值<(或=)(或>)b的指数值,分别返回-1、0和+1
	if (a.expn < b.expn)
		return -1;
	else if (a.expn > b.expn)
		return 1;
	else
		return 0;
}

void CreatPolyn(polynomial& P, int m) {
	//输入m项的系数和指数,建立表示一元多项式的有序链表P
	InitList(P);
	Link h = GetHead(P);
	ElemType e;e.coef = 0.0;e.expn = -1;
	SetCurElem(h, e);//设置头结点的数据元素
	Link q = NULL;Link s = NULL;
	for (int i = 1;i <= m;++i) {//依次输入m个非零项
		scanf_s("%lf%d", &e.coef, &e.expn);
		char ch = getchar();//吸收多余的回车或空格
		if (!LocateElem(P, e, q, cmp))//当前链表不存在该指数项
		{
			if (MakeNode(s, e))InsFirst(q, s);//生成结点并插入链表
			P->len++;
		}
	}
}

void DestroyPolyn(polynomial& P) {
	//销毁一元多项式P
	DestroyList(P);
}

void PrintPolyn(polynomial P) {
	//打印输出一元多项式P
	Link q = P->head->next;
	while (q) {
		printf("%f %d/", q->data.coef, q->data.expn);
		q = q->next;
	}
	printf("\n");
}

int PolynLength(polynomial P) {
	//返回一元多项式的项数
	return ListLength(P);
}

void AddPolyn(polynomial& Pa, polynomial& Pb) {
	//多项式加法:Pa=Pa+Pb,利用两个多项式的结点构成“和多项式”。
	//并销毁一元多项式Pb。
	Link ha = GetHead(Pa);Link hb = GetHead(Pb);//ha和hb分别指向Pa和Pb的头结点
	Link qa = NextPos(Pa, ha);Link qb = NextPos(Pb, hb);//qa和qb分别指向Pa和Pb中当前结点
	while (qa && qb) {//qa和qb均非空
		term a = GetCurElem(qa);term b = GetCurElem(qb);
		switch (cmp(a, b)) {
		case -1://多项式PA中当前结点的指数很小
			ha = qa;
			qa = NextPos(Pa, qa);
			break;
		case 0://两者的指数值相等
			a.coef = a.coef + b.coef;
			if (a.coef != 0.0) {//修改多项式PA中当前结点的系数值
				SetCurElem(qa, a);
				ha = qa;
			}
			else{//删除多项式PA中当前结点
				DelFirst(ha, qa);
				FreeNode(qa);
				Pa->len--;
				//所有的删除与插入操作都有点缺陷,因为没有判断是否应该修改尾指针。
			}
			DelFirst(hb, qb);
			FreeNode(qb);
			Pb->len--;
			qb = NextPos(Pb, hb);
			qa = NextPos(Pb, ha);
			break;
		case 1://多项式PB中当前结点的指数值小
			DelFirst(hb, qb);Pb->len--;
			InsFirst(ha, qb);Pa->len++;
			qb = NextPos(Pb, hb);
			ha = NextPos(Pa, ha);
			break;
		}
	}
	if (!ListEmpty(Pb))Append_add(Pa, qb);//链接Pb中剩余结点
	FreeNode(hb);//释放Pb的头结点
}

void SubtractPolyn(polynomial& Pa, polynomial& Pb) {
	//多项式减法:Pa=Pa-Pb,利用两个多项式的结点构成“差多项式”。
	//并销毁一元多项式Pb。
	//在本代码中唯一的区别是case 0中的+号改成-号。
	Link ha = GetHead(Pa);Link hb = GetHead(Pb);//ha和hb分别指向Pa和Pb的头结点
	Link qa = NextPos(Pa, ha);Link qb = NextPos(Pb, hb);//qa和qb分别指向Pa和Pb中当前结点
	while (qa && qb) {//qa和qb均非空
		term a = GetCurElem(qa);term b = GetCurElem(qb);
		switch (cmp(a, b)) {
		case -1://多项式PA中当前结点的指数很小
			ha = qa;
			qa = NextPos(Pa, qa);
			break;
		case 0://两者的指数值相等
			a.coef = a.coef - b.coef;
			if (a.coef != 0.0) {//修改多项式PA中当前结点的系数值
				SetCurElem(qa, a);
				ha = qa;
			}
			else {//删除多项式PA中当前结点
				DelFirst(ha, qa);
				FreeNode(qa);
				Pa->len--;
				//所有的删除与插入操作都有点缺陷,因为没有判断是否应该修改尾指针。
			}
			DelFirst(hb, qb);
			FreeNode(qb);
			Pb->len--;
			qb = NextPos(Pb, hb);
			qa = NextPos(Pb, ha);
			break;
		case 1://多项式PB中当前结点的指数值小
			DelFirst(hb, qb);Pb->len--;
			InsFirst(ha, qb);Pa->len++;
			qb = NextPos(Pb, hb);
			ha = NextPos(Pa, ha);
			break;
		}
	}
	if (!ListEmpty(Pb))//链接Pb中剩余结点
		Append_sub(Pa, qb);
	//这里要系数变为相反数,所以仿照Append又写了个,为了区分,两个函数后缀不同
	//有点为这点醋包的饺子的意思
	FreeNode(hb);//释放Pb的头结点
}

void MutiplyPolyn(polynomial& Pa, polynomial& Pb,polynomial& Pc) {
	//完成多项式相乘计算,即:Pa = Pa X Pb,并销毁一元多项式Pb
	//实在不知道怎么像加法一样仅调用两个变量
	//最终效果是保留Pa,Pb,Pc
	Link hb = GetHead(Pb);
	Link qb = NextPos(Pb, hb);
	Link ha, qa;
	while (qb) {
		polynomial Pd;//过渡变量
		InitList(Pd);Link hd = GetHead(Pd);
		ha = GetHead(Pa);
		qa = NextPos(Pa, ha);
		while (qa) {//Pb的一项与整个Pa相乘
			ElemType e;Link p = NULL;
			e.coef = qa->data.coef * qb->data.coef;
			e.expn = qa->data.expn + qb->data.expn;
			MakeNode(p, e);
			InsFirst(hd, p);
			Pd->len++;
			ha = qa;qa = NextPos(Pa, ha);
			hd = p;
		}
		AddPolyn(Pc, Pd);
		hb = qb;qb = NextPos(Pb, hb);
	}
}

测试函数(主函数) 

#include "Polynomial.h"

int main()
{
	polynomial p1, p2;
	CreatPolyn(p1, 7);
	CreatPolyn(p2, 6);
	printf("打印一元多项式P1:");
	PrintPolyn(p1);
	printf("打印一元多项式P2:");
	PrintPolyn(p2);
	AddPolyn(p1, p2);
	printf("打印一元多项式P1:");
	PrintPolyn(p1);
	DestroyPolyn(p1);

	CreatPolyn(p1, 5);
	CreatPolyn(p2, 4);
	printf("打印一元多项式P1:");
	PrintPolyn(p1);
	printf("打印一元多项式P2:");
	PrintPolyn(p2);
	SubtractPolyn(p1, p2);
	printf("打印一元多项式P1:");
	PrintPolyn(p1);
	DestroyPolyn(p1);

	polynomial p3;
	CreatPolyn(p1, 5);
	CreatPolyn(p2, 4);
	InitList(p3);
	printf("打印一元多项式P1:");
	PrintPolyn(p1);
	printf("打印一元多项式P2:");
	PrintPolyn(p2);
	MutiplyPolyn(p1, p2, p3);
	printf("打印一元多项式P3:");
	PrintPolyn(p3);
	DestroyList(p1);
	DestroyList(p2);
	DestroyList(p3);
	return 0;
}

测试结果

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

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

相关文章

java中ArrayList类常用API

前言&#xff1a;在学习java的ArrayList类的时候&#xff0c;有很多的API需要了解&#xff0c;下面我将举出其中在新手学习时使用频率较大的几个API。 先大体看一下有哪几个&#xff1a;&#xff08;如图&#xff09; 目录 1.add&#xff08;&#xff09; 解释&#xff1a; …

CSS太极动态图

CSS太极动态图 1. 案例效果 我们今天学习用HTML和CSS实现动态的太极&#xff0c;看一下效果。 2. 分析思路 太极图是由两个旋转的圆组成&#xff0c;一个是黑圆&#xff0c;一个是白圆。实现现原理是使用CSS的动画和渐变背景属性。 首先&#xff0c;为所有元素设置默认值为0…

非精线搜索步长规则Armijo规则Goldstein规则Wolfe规则

文章目录 非精确线搜索步长规则Armijo规则Goldstein规则Wolfe规则C示例代码参考链接 非精确线搜索步长规则 在数值优化中&#xff0c;线搜索是一种寻找合适步长的策略&#xff0c;以确保在目标函数上获得足够的下降。如最速下降法&#xff0c;拟牛顿法这些常用的优化算法等&am…

异步解耦之RabbitMQ(三)_RabbitMQ队列

异步解耦之RabbitMQ(一) 异步解耦之RabbitMQ(二)_RabbitMQ架构及交换机 RabbitMQ提供了许多功能和选项&#xff0c;包括队列和消息的 TTL&#xff08;Time-To-Live&#xff0c;生存时间&#xff09;。在本篇博客中&#xff0c;我们将深入探讨 RabbitMQ 队列和消息的 TTL&…

Laykefu客服系统 任意文件上传

【产品介绍】 Laykefu 是一款基于workermangatawayworkerthinkphp5搭建的全功能webim客服系统&#xff0c;旨在帮助企业有效管理和提供优质的客户服务 【漏洞介绍】 Laykefu客服系统/admin/users/upavatar.html接口处存在文件上传漏洞 【资产测绘Query】 fofa语法&#xf…

IS-IS weight影响路由加表

拓扑图 配置 nexthop weight影响路由加入路由表 weight默认为255&#xff0c;取值1~255&#xff0c;值越小越优先 sysname R1 # isis 1is-level level-1cost-style widenetwork-entity 49.1234.0000.0000.0001.00log-peer-change topology # interface GigabitEthernet0/0/0…

freeRTOS总结(十四)任务通知

1、任务通知 任务通知&#xff1a; 用来通知任务的&#xff0c;任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值 使用队列、信号量、事件标志组时都需另外创建一个结构体&#xff0c;通过中间的结构体进行间接通信&#xff01; 使用任务通知时&#xff0c;任务结…

C#上位机与三菱PLC的通信02--MC协议介绍

1、协议介绍 三菱 PLC MC 协议是一种用于三菱 PLC 与上位机之间进行数据通信的协议&#xff0c;也称为 Mitsubishi Communication Protocol。该协议支持串口、以太网等多种通讯方式&#xff0c;可实现实时数据的采集和交换。三菱PLC的MC协议是一种数据通信协议&#xff0c;它用…

跟着pink老师前端入门教程-day21

5.4 常见flex布局思路 5.5 背景线性渐变 语法&#xff1a; background: linear-gradient( 起始方向 , 颜色 1, 颜色 2, ...); background: -webkit-linear-gradient(left, red , blue); background: -webkit-linear-gradient(left top, red , blue); 背景渐变必须添加浏览…

【Mybatis】从0学习Mybatis(1)

前言 本篇文章是从0学习Mybatis的第一篇文章&#xff0c;由于篇幅太长CSDN会限流&#xff0c;因此我打算分开三期来写&#xff0c;这是第一期&#xff01; 1.怎么理解MyBatis是一个框架&#xff1f; 温馨提示&#xff1a;接下来的你不一定能看懂&#xff01; MyBatis是一个J…

1Panel面板如何安装并结合内网穿透实现远程访问本地管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

照片去除水印的方法有哪些?这些方法快收藏保存起来

当你踏破铁鞋无觅处&#xff0c;在茫茫网海中寻得心仪的头像或壁纸美图&#xff0c;却发现那完美的画面上赫然带着平台水印&#xff0c;是不是感觉如鲠在喉&#xff1f;但又不知道照片去除水印的方法有哪些而束手无策&#xff1f;别担心&#xff0c;今天我就为你带来几招去水印…

Instagram SEO如何优化?10个技巧

Instagram SEO 是优化 Instagram 内容以使其在平台搜索结果中被发现的做法。如果你希望你可以更快的让你的Ins获得流量&#xff0c;做好SEO就成功了一半。Instagram 搜索结果包括相关内容、帐户、音频、主题标签和地点&#xff0c;下面为你总结10个策略技巧&#xff01; 一、In…

Windows 安装 MySQL 最新最简教程

Windows 安装 MySQL 最新最简教程 官网地址 https://dev.mysql.com/downloads/mysql/下载 MySQL zip 文件 配置 MySQL1、解压文件 2、进入 bin 目录 搜索栏输入 cmd 回车进入命令行 C:\Users\zhong\Desktop\MySQL\mysql-8.3.0-winx64\mysql-8.3.0-winx64\bin 注意这里是你自己…

windows下ngnix自启动(借助工具winSw)

文章目录 前言一、winsw工具二、使用步骤下载 windsw-x86.exe同级目录创建一个xml文件以管理员权限打开cmd 运行设置自启动 总结 前言 在windows下安装nginx后&#xff0c;不想每次都手动启动。本文记录下windows下ngnix自启动&#xff08;借助工具winSw&#xff09;的操作流程…

Pandas数据处理技能大全:索引标签修改函数全攻略【第65篇—python:索引标签】

文章目录 Pandas数据处理技能大全&#xff1a;索引标签修改函数全攻略1. rename函数参数说明&#xff1a;代码实例&#xff1a; 2. set_index函数参数说明&#xff1a;代码实例&#xff1a; 3. reset_index函数参数说明&#xff1a;代码实例&#xff1a; 4. reindex函数参数说明…

Spring Web Body 转化常见错误

在 Spring 中&#xff0c;对于 Body 的处理很多是借助第三方编解码器来完成的。例如常见的 JSON 解析&#xff0c;Spring 都是借助于 Jackson、Gson 等常见工具来完成。所以在 Body 处理中&#xff0c;我们遇到的很多错误都是第三方工具使用中的一些问题。 真正对于 Spring 而…

学习Spring的第十六天

AOP底层两种生成Proxy的方式 我来解释这两种方式 1 目标类有接口 , 调用JDK的动态代理实现 2 目标类没有接口 , 用Cglib实现 , 即生成目标类的子类 , 来实现动态代理 , 所以要求目标类不能时final修饰的 . (若有接口 , 也可用Cglib方式实现 , 需要手动配置<aop: config pr…

Java Map 集合的几种常用遍历方式

Java Map 集合的几种常用遍历方式 package com.zhong.mapdemo.map;import java.util.HashMap; import java.util.Map; import java.util.Set;/*** ClassName : MapFor* Description : Map 的遍历* Author : zhx* Date: 2024-02-07 13:43*/ public class MapFor {public static …

腾讯云游戏联机服务器配置价格表,4核16G/8核32G/4核32G/16核64G

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…