【头歌】循环单链表的基本操作

news2025/1/12 21:00:33

循环单链表的基本操作

第1关:循环单链表的插入操作

任务描述

本关任务:编写循环单链表的插入操作函数。

相关知识

对于单链表,每个结点只存储了其后继结点的地址。尾结点之后不再有任何结点,那么它的next域设置有两种方式:

  1. 将尾结点的next域用一个特殊值NULL(空指针,不指向任何结点,只起标志作用)表示,这样的单链表为非循环单链表,通常所说的单链表都是指这种类型的单链表。

  1. 将尾结点的next域指向头结点,这样可以通过尾结点移动到头结点,从而构成一个查找环,将这样的单链表为循环单链表

循环单链表的特点是表中尾结点的next域指向头结点,整个链表形成一个环。在循环链表中,从任一结点出发都可以找到表中其他结点,循环单链表逻辑示意图如下:

在循环单链表L中,p所指结点为尾结点的条件是:p->next==L。

循环单链表结点类型定义与单链表一致:

typedef  struct  LNode         // 结点类型定义 
{       
    ElemType  data;           //数据域
    struct  LNode  *next;     //指针域
}LNode,*LinkList;             // LinkList为结构指针类型

ElemType类型可根据实际问题需要灵活定义,须针对ElemType类型数据编写输入、输出、比较等函数,本实训任务关卡涉及的ElemType均为int型 :

typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

下面讨论进行循环单链表的基本操作。

循环单链表的初始化操作

创建一个空的循环单链表,它只有头结点,由L指向它。该结点的next域指向该头结点,data域未设定任何值。

void InitList( LinkList &L)
{   
    // 构造一个空的循环单链表L    
    L=(LinkList)malloc(sizeof(LNode)); 
    // 申请分配头结点,并使L指向此头结点    
    L->next=L;                         
    // 头结点的指针域为L
    }

查找循环单链表中第i个数据元素值的操作

算法思想:

  • 用p从头开始遍历循环单链表L中的结点(初值指向第一个数据结点),用计数器j累计遍历过的结点,其初值为1。

  • 当p不为L且j<i时循环,p后移一个结点,j增1。

  • 当循环结束时,若p指向头结点则表示查找失败返回0,否则p所指结点即为要找的结点,查找成功,算法返回1。

int GetElem(LinkList L,int i,ElemType &e)
{  int j=1;
   SLinkNode *p=L->next;       //p指向首结点,计数器j置为1
   if (i<=0) return 0;         //参数i错误返回0
   while (p!=L && j<i)         //找第i个结点p
   {
        j++;
        p=p->next;
   }
   if (p==L) return 0;          //未找到返回0
   else
   {
        e=p->data;
        return 1;              //找到后返回1
   }
}    
循环单链表的遍历操作

循环单链表的遍历操作

在循环单链表中,用p指针扫描所有结点时,方式有两种:

  • 以p!=L作为循环条件,当p==L时循环结束,此时p回过来指向头结点,所以p应该初始化指向第一个数据结点而不是头结点,否则循环内的语句不会执行。

  • 扫描指针p的初始化为p=L,循环的条件应该为p->next!=L,当p->next==L时循环结束,此时p指向尾结点。

void ListTraverse(LinkList L,void(*vi)(ElemType))
{  LinkNode *p=L->next;
   while (p!=L)
   {
       vi( p->data );
        p=p->next;
   }
   printf("\n");
}

在执行遍历函数时,用函数指针vi来实现对output()函数的调用。

循环单链表的插入操作

算法思想:

  • 在循环单链表L中查找第i个结点p及其前驱结点pre。

  • 若没有这样的结点p返回0。

  • 否则创建一个以e为值的新结点s,将结点s插入在pre结点之后,返回1。

编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,完成单链表的初始化操作,遍历操作及插入操作三个子函数的定义,具体要求如下:

  • int ListInsert(LinkList &L,int i,ElemType e) ;//在循环单链表L中第i个位置之前插入新的数据元素

测试说明

平台会对你编写的代码进行测试:

测试输入:

5

12 47 5 8 69

1

99

预期输出: 插入成功,插入后单链表如下: 99 12 47 5 8 69

测试输入:

5

12 47 5 8 69

7

99

预期输出:

插入位置不合法,插入失败!

输入说明 第一行输入单链表的数据元素的个数M; 第二行输入单链表M个整数; 第三行输入要插入元素的位置; 第四行输入要插入的数据元素的值。
输出说明 第一行输出插入是否成功的提示信息; 如果插入成功,第二行输出插入元素后的单链表所有元素;如果插入失败,则不输出第二行。

开始你的任务吧,祝你成功!

代码示例

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);
/* 循环单链表类型定义 */
typedef struct LNnode
{	
	ElemType data;
	struct LNnode *next;
}LNnode,*LinkList;

void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,ElemType e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));

int main()               //main() function 
{	
     LinkList A;
     ElemType e;
     InitList(A);
      int n,i;
     // cout<<"Please input the list number ";
     cin>>n;
     for(i=1;i<=n;i++)
        { 
		   cin>>e;
         ListInsert(A, i, e);
       }
	//cout<<"请输入插入的位置:"<<endl;
	cin>>i;
	//cout<<"请输入插入的值:"<<endl;
	input(e);
	if(  ListInsert(A,i,e) )
    {
      cout<<"插入成功,插入后循环单链表如下:"<<endl;
      ListTraverse(A,output) ;
    }
    else
    	cout<<"插入位置不合法,插入失败!"<<endl;
    return  0;  
 }


/*****ElemType类型元素的基本操作*****/
void input(ElemType &s)
{
cin>>s;
}
void output(ElemType s)
 {
cout<<s<<" ";
}
int equals(ElemType a,ElemType b)
{
	if(a==b)
		return  1;
	else
		return  0;
}

/*****循环单链表的基本操作*****/
void InitList(LinkList &L)
{ 
	// 构造一个空的循环单链表L
	L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
	if(!L) // 存储分配失败
		return ;
	L->next=L; // 指针域为L	
}
int ListInsert(LinkList &L,int i,int e) 
{
	// 在带头结点的循环单链表L的第i个元素之前插入元素e  
	/********** Begin **********/ 
 LNnode *q=L,*p=q->next,*s;
    
    int j=1;
     if (i<=0) return 0;	//参数i错误返回0
    while (p!=L&&j<i)
   {	
		j++;
		q=p;
		p=p->next;
   }
  
   if (p==L && i>=j+1) return 0;
   else{
  	s=(LNnode *)malloc(sizeof(LNnode));
    s->data=e;
    s->next=q->next;
    q->next=s;
    return 1; 
}
   
	/********** End **********/
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{ 
	//依次对循环单链表L的每个数据元素调用函数vi()
	LNnode *p=L->next;
   while (p!=L)
   {	
		vi(p->data);
		p=p->next;
   }
   printf("\n");	
}

第2关:循环单链表的删除操作

任务描述

本关任务:编写循环单链表的删除操作函数。

相关知识

循环单链表的删除算法思想:

  • 在循环单链表L中查找第i-1个结点,若不存在这样的结点返回0。

  • 否则让p指第i-1个结点,q指向后继结点,当q为NULL时返回0,否则将q所指结点删除并释放其空间,返回1。

链表上实现的插入和删除运算,无须移动结点,仅需修改指针。

编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,完成单链表的删除操作函数的定义,具体要求如下:

  • int ListDelete(LinkList L,int i,ElemType &e);// 在循环单链表L中删除第i个元素,并由e返回其值

测试说明

平台会对你编写的代码进行测试:

测试输入:

5

12 47 5 8 69

1 预期输出:

删除成功,删除后单链表如下:

47 5 8 69

删除元素的值:12

测试输入: 5

12 47 5 8 69

6

预期输出:

删除位置不合法,删除失败!

输入说明 第一行输入循环单链表的长度M; 第二行输入循环单链表的M个整数; 第三行输入要删除元素的位置;
输出说明 第一行输出删除是否成功的提示信息; 如果删除成功,第二行输出删除元素后的循环单链表;第三行输出删除的数据元素;如果删除位置不合法,不输出第二行和第三行。

开始你的任务吧,祝你成功!

代码示例

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

/* 循环单链表类型定义 */
typedef struct LNnode
{	
	ElemType data;
	struct LNnode *next;
}LNnode,*LinkList;

void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,ElemType e) ;
int ListDelete(LinkList L,int i,ElemType &e);
void ListTraverse(LinkList L,void(*vi)(ElemType));

int main()               //main() function 
{	
	LinkList A;
	ElemType e;
	InitList(A);
	int n,i;
	// cout<<"Please input the list number ";
	cin>>n;
	for(i=1;i<=n;i++)
	{ 
		cin>>e;
		ListInsert(A, i, e);
	}
	//cout<<"请输入删除的位置:"<<endl;
	cin>>i;	
	if(  ListDelete(A,i,e) )
	{
		cout<<"删除成功,删除后循环单链表如下:"<<endl;
		ListTraverse(A,output) ;
		cout<<"删除元素的值:";
	   output(e);
   	   cout<<endl;
	}
	else
		cout<<"删除位置不合法,删除失败!"<<endl;
}



/*****ElemType类型元素的基本操作*****/
void input(ElemType &s)
{
	cin>>s;
}
void output(ElemType s)
{
	cout<<s<<" ";
}
int equals(ElemType a,ElemType b)
{
	if(a==b)
		return  1;
	else
		return  0;
}

/*****循环单链表的基本操作*****/
void InitList(LinkList &L)
{ 
	// 构造一个空的循环单链表L
	L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
	if(!L) // 存储分配失败
		return ;
	L->next=L; // 指针域为L	
}
int ListInsert(LinkList &L,int i,ElemType e) 
{
	// 在带头结点的循环单链表L的第i个元素之前插入元素e  
   int j=1;
   LNnode *pre=L,*p=pre->next,*s;
   if (i<=0) return 0;	//参数i错误返回0
   while (p!=L && j<i)	//查找第i个结点p和其前驱结点pre
   {	
	j++;
	pre=p;
	p=p->next;	//pre、p同步后移一个结点
   }
   if (p==L && i>=j+1) return 0;//参数i>n+1时错误返回0
   else				//成功查找到第i个结点的前驱结点pre
   {	
	s=(LNnode *)malloc(sizeof(LNnode));
	s->data=e;		//创建新结点用于存放元素x
	s->next=pre->next;	//将s结点插入到pre结点之后
	pre->next=s;
	return 1;		//插入运算成功,返回1
   }
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{ 
	//依次对循环单链表L的每个数据元素调用函数vi()
	LNnode *p=L->next;
   while (p!=L)
   {	
		vi(p->data);
		p=p->next;
   }
   printf("\n");	
}

int  ListDelete(LinkList L,int i,ElemType &e) // 不改变L
{ 
	// 在带头结点的循环单链表L中,删除第i个元素,并由e返回其值
	/********** Begin **********/ 
   LNnode *q=L,*p=q->next;
   int j=1;
   if (i<=0) return 0;
   while (p!=L&&j<i)
   {	
        j++;
        q=p;
		p=p->next;
   }
   if (p==L) return 0;
   else{
	e=p->data;
   q->next=p->next;
   
   return 1;
}

  
}

第3关:将两个循环单链表合并成一个循环单链表

任务描述

本关任务:设有两个带头结点的循环单链表LA=(a1,a2,…,an),LB=(b1,b2,…,bm),编写一个算法,将LA、LB这两个循环单链表合并为一个循环单链表LA=(a1,…,an,b1,…bm),其头指针为LA。

相关知识

算法思想: 先找到两个链表的尾,并分别由指针p、q指向它们,然后将第一个链表的尾结点与第二个表的第一个结点链接起来,并修改第二个表的尾结点,使它的链域指向第一个表的头结点。

算法说明: 1)循环链表中没有NULL指针。涉及遍历操作时,其终止条件就不再是像非循环链表那样判别p或p->next是否为空,而是判别它们是否等于某一指定指针,如头指针或尾指针等。 2)在单链表中,从一已知结点出发,只能访问到该结点及其后续结点,无法找到该结点之前的其它结点。而在单循环链表中,从任一结点出发都可访问到表中所有结点,这一优点使某些运算在单循环链表上易于实现。

采用上面的方法,需要遍历链表,找到表尾,其执行时间是O(n)。若在尾指针表示的单循环链表上实现,则只需要修改指针,无需遍历,其执行时间是O(1)。

编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,完成单链表按照序号i查找数据元素值操作函数的定义,具体要求如下:

  • LinkList merge_1(LinkList LA,LinkList LB); //将两个采用头指针的循环单链表的首尾连接起来

测试说明

平台会对你编写的代码进行测试:

测试输入:

10

12 47 5 8 6 92 45 63 75 38

8

24 75 86 9 45 63 12 34

预期输出: 12 47 5 8 6 92 45 63 75 38 24 75 86 9 45 63 12 34

输入说明 第一行输入循环单链表LA的长度M; 第二行输入循环单链表LA的M个整数; 第三行输入循环单链表LB的长度N; 第四行输入循环单链表LB的N个整数;
输出说明 输出合并后的循环单链表的所有元素。

开始你的任务吧,祝你成功!

代码示例

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);
/* 循环单链表类型定义 */
typedef struct LNnode
{	
	ElemType data;
	struct LNnode *next;
}LNnode,*LinkList;

void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));
LinkList   merge_1(LinkList LA,LinkList LB);
int main()               //main() function 
{	
  LinkList A,B;
  ElemType e;
  InitList(A);
  InitList(B);
  int n,m,i;
  cin>>n;
  for(i=1;i<=n;i++)
  { 
    cin>>e;
    ListInsert(A, i, e);
  }
  cin>>m;
  for(i=1;i<=m;i++)
  { 
    cin>>e;
    ListInsert(B, i, e);
  }
  A=merge_1(A,B);
  ListTraverse(A,output) ;   
  return  0;  
 }


/*****ElemType类型元素的基本操作*****/
void input(ElemType &s)
{
	cin>>s;
}
void output(ElemType s)
{
	cout<<s<<" ";
}
int equals(ElemType a,ElemType b)
{
	if(a==b)
		return  1;
	else
		return  0;
}

/*****循环单链表的基本操作*****/
void InitList(LinkList &L)
{ 
	// 构造一个空的循环单链表L
	L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
	if(!L) // 存储分配失败
		return ;
	L->next=L; // 指针域为L	
}
int ListInsert(LinkList &L,int i,ElemType e) 
{
	// 在带头结点的循环单链表L的第i个元素之前插入元素e  
	int j=1;
   LNnode *pre=L,*p=pre->next,*s;
   if (i<=0) return 0;	//参数i错误返回0
   while (p!=L && j<i)	//查找第i个结点p和其前驱结点pre
   {	
	j++;
	pre=p;
	p=p->next;	//pre、p同步后移一个结点
   }
   if (p==L && i>=j+1) return 0;//参数i>n+1时错误返回0
   else				//成功查找到第i个结点的前驱结点pre
   {	
	s=(LNnode *)malloc(sizeof(LNnode));
	s->data=e;		//创建新结点用于存放元素x
	s->next=pre->next;	//将s结点插入到pre结点之后
	pre->next=s;
	return 1;		//插入运算成功,返回1
   }
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{ 
	//依次对循环单链表L的每个数据元素调用函数vi()
	LNnode *p=L->next;
   while (p!=L)
   {	
		vi(p->data);
		p=p->next;
   }
   printf("\n");	
}

LinkList   merge_1(LinkList LA,LinkList LB)
{  
  //将两个采用头指针的循环单链表的首尾连接起来
  	LNnode *Ta,*Tb;
    Ta = LA;
    Tb = LB;

    // 找尾
    while(Ta->next != LA)  Ta = Ta->next;
    while(Tb->next != LB)  Tb = Tb->next;
    // 合并
    Ta->next = LB->next; // Ta尾连接到Tb的头的后一个节点
    free(LB);
    Tb->next = LA;
    return LA;
}

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

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

相关文章

Python爬虫网页解析神器Xpath详细讲解

1、XPath介绍 XPath 是一门在 XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的&#xff0c;但同样适用于 HTML 文档的搜索。 2、安装lxml lxml是Python的第三方解析库&#xff0c;支持HTML和XML解析&#xff0c;而且效率极高&#xff0c;弥补了Python自带的xml标准库在…

Mybatis-Plus id生成策略控制

目录 id生成策略控制 不同的表应用不同的id生成策略 名称 TableId AUTO策略 除了AUTO这个策略以外&#xff0c;还有如下几种生成策略: 分布式ID是什么? INPUT策略 ASSIGN_ID策略 ASSIGN_UUID策略 雪花算法 ID生成策略对比 id生成策略控制 不同的表应用不同的id生成…

计算机组成原理 | 第六章:计算机的运算方法 | 进制转换 | 定点运算 | 浮点数运算

文章目录&#x1f4da;进位计数制&#x1f407;任意进制转十进制&#x1f407;十进制整数转换为n进制整数&#x1f407;十进制小数转换为n进制小数&#x1f407;二/八/十六进制的互换&#x1f4da;带符号的二进制数表示⭐️&#x1f407;原码表示法&#x1f407;补码表示法&…

“买卖股票的最佳时机” 系列——我来教你稳赚不亏~

目录 前言 一、买卖股票的最佳时机 ——>指定次数交易&#xff08;1次&#xff09; 1.1、dp定义 1.2、递推公式 1.3、遍历顺序 1.4、初始化 1.5、解题代码 二、买卖股票的最佳时机II ——>交易到结束 2.1、分析 2.2、解题代码 三、买股票的最佳时机III ——>…

【keepass】密码管理软件keepass的安全风险分析,如何在使用keepass的过程中避免泄露数据库信息和密码?

一、安全风险分析 1.1 不正规的来源 如果你使用非官方渠道获得keepass软件或某些插件&#xff0c;那么你的密码管理从一开始就没有安全性可言。因为这玩意是开源的啊&#xff0c;如果对方“很懂”&#xff0c;只要往里面植入一些代码&#xff0c;让你的数据库文件和密钥在后台…

react 项目 中 使用 Dllplugin 打包优化

webpack在build包的时候&#xff0c;有时候会遇到打包时间很长的问题&#xff0c;这里提供了一个解决方案&#xff0c;让打包如丝般顺滑~ 在用 Webpack 打包的时候&#xff0c;对于一些不经常更新的第三方库&#xff0c;比如 react&#xff0c;lodash&#xff0c;vue 我们希望…

C语言基础知识(37)

数组一维数组的定义&#xff1a;类型说明符 数组名【常量表达式】&#xff1b;先定义后引用&#xff1b;一维数组初始化时可以只对一部分元素初始化&#xff0c;在对全部数组元素初始化的时候可以部规定长度&#xff1b;但是若被定义的数组长度与提供的初始值不一样时&#xff…

【MySQL】MySQL索引夺命连环问「持续更新中」

文章目录1. 使用MySQL索引的原因2. 索引的三种常见底层数据结构以及优缺点3. 索引的常见类型以及它是如何发挥作用的&#xff1f;4. MyISAM 和 InnoDB 实现 B 树索引方式的区别是什么&#xff1f;5. InnoDB 为什么设计 B 树索引&#xff1f;6. 什么是覆盖索引和索引下推&#x…

【JavaSE专栏7】Java 常量、变量及其作用域

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

Python论文绘图利器seaborn.lineplot

Python论文绘图利器seaborn.lineplot 提示&#xff1a;前言 Python论文绘图利器seaborn.lineplot 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录Python论文绘图利器seaborn.lineplot前言一、导入包二、加载数据三…

嵌入式桌面管理系统Matchbox

简介 Matchbox&#xff08;中文译名&#xff1b;火柴盒&#xff09;是X Window System的免费和开源Window Manager&#xff0c;它主要用于嵌入式系统。取名Matchbox&#xff0c;很形象的表明它只适用于屏幕只有火柴盒大小的设备。 buildroot 移植MatchBox session managermat…

高斯秩变换 RankGauss 可能是比标准化/归一化更有效的连续值特征变换方法

文章目录 一、前言二、关键原理三、总结CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 高斯秩变换是 Kaggle 竞赛大佬 Michael Jahrer(Grandmaster) 提出的一种新颖的特征变换方法,他称之为 RankGauss。类似归一化(MinMax)和标准化(Standardization)的作用,…

帆软报表 V8 get_geo_json 任意文件读取漏洞

帆软报表 V8 get_geo_json 任意文件读取漏洞 CNVD-2018-04757 1.漏洞介绍 FineReport报表软件是一款纯Java编写的&#xff0c;集数据展示(报表)和数据录入(表单)功能于一身的企业级web报表工具。 FineReport v8.0版本存在任意文件读取漏洞&#xff0c;攻击者可利用漏洞读取网…

车载以太网 - 测试用例设计 - 头部信息检测 - 10

前面的篇幅已经把ISO 13400中DoIP软件协议规范部分进行详细的介绍说明,如果在文章中有哪些介绍的不充分或者不够详细,欢迎评论区留言讨论;接下来的文章主要介绍DoIP协议相关的测试用例设计,这也是一个测试工程师必备的重要技能之一,能否保证测试执行完成后,软件质量是达到…

超级详解洛谷P4011 孤岛营救问题(bfs超难题)(保证看懂)

题目 说明 1944 年&#xff0c;特种兵麦克接到国防部的命令&#xff0c;要求立即赶赴太平洋上的一个孤岛&#xff0c;营救被敌军俘虏的大兵瑞恩。瑞恩被关押在一个迷宫里&#xff0c;迷宫地形复杂&#xff0c;但幸好麦克得到了迷宫的地形图。迷宫的外形是一个长方形&#xff…

阿里“云开发“小程序(uniCould)

博主ps&#xff1a; 网上资料少的可怜&#xff0c;哎&#xff0c;腾讯云涨价了&#xff0c;论服务器&#xff0c;我肯定选的阿里&#xff0c;再着你们对比下unicould的报价就知道了&#xff0c;如果有钱就另当别论了。 所以这片博文&#xff0c;博主试过之后&#xff0c;先抛出…

(day8) 自学Java——拼图小游戏

GUI(图形用户接口)&#xff0c;是指采用图形化的方式显示操作界面。 Java中包含两套完整体系&#xff1a;AWT包&#xff0c;Swing包 一.代码 package com.abc.ui;import javax.swing.*; import javax.swing.border.BevelBorder; import java.awt.event.ActionEvent; import ja…

JavaEE day5 初识CSS 2

选择器 基本选择器&#xff1a;id选择器、类选择器、元素选择器 复合选择器&#xff1a;并列选择器、子孙选择器、孩子选择器 通配符选择器 *{.....} 任意元素&#xff1a;书写一些全局的规则时使用&#xff0c;就等于是一个全局都要遵守的规则 伪类选择器&#xff1a;针…

Lab 3: Midterm Review

Lab3 部分questionQ5&#xff1a;Its Always a Good PrimeQ6&#xff1a;Church numeralsQ5&#xff1a;It’s Always a Good Prime Implement div_by_primes_under, which takes in an integer nand returns an n-divisibility checker. An n-divisibility-checker is a funct…

【蓝桥杯选拔赛真题35】python回文数升级 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python输出N除以3的商 一、题目要求 1、编程实现 2、输入输出