逻辑算法大赛辅导--单循环链表的倒置与显示、与约瑟夫问题
单循环链表的倒置与显示、与约瑟夫问题
本内容使原来写过的一个单循环链表相关问题的实现:
生成一个带结点的单循环链表,并将它显示出来,再把它倒置。通过人机对话输入结点的数目,模和开始的元素,然后进行约瑟夫运算,求出输出序列。实现将一个链表转成一个顺序存储线性表。
关于一个单循环链表的实现:可以通过不断地加入结点来达到。而它的显示也是可以通过不断地找下一个结点来实现。
关于表的倒置:可以通过让每一个结点指向其前继来完成。
操作运算与目的
1、加入结点的操作 AddNode(完成一个单循环链表的建立),并在主函数中不断调用来建立链表。
2、显示完整链表的操作Display。
3、显示约瑟夫运算后的结果DisplayYsf。
4、把一个链表转换成一个顺序存储的链表Convert。
2、 物理存储结构:
定义
1.结点定义
struct Node //结点结构体
{
int data; //结点中的数据
Node * Next; //下一个结点的指针
};
2. 表定义
class LoopLink //一个表的类
{
Node * Header; //表的头指针
public:
LoopLink(){Header=NULL;} //表的初始化
void AddNode(int e); //加入结点
void Display(void); //显示
void Rev(void); //倒置
void DisplayYsf(int e,int m); //显示约瑟夫问题答案
};
3、算法、设计
a)加入结点(AddNode):
1、如果表中无结点,建立一个新的结点并让头指针指向它。
2、如果有结点,找到那个后继指向头结点的结点,建立一个新的结点, 其后继为头结点,前驱是刚刚找到的那个结点。
b)显示结点(Display):
1、用一个临时指针从头结点开始一个个结点地访问并显示数据。
2、如果找到了后继为头结点的结点就结束。
c)表的倒置(Rev):
1、用t,p,temp分指向开始的三个连续的结点。
2、把p的后继改成t,三个指针向后走一个结点,temp主要是存储p原来的后继。
3、当p指向的是头结点时,t指向的一定的表尾,存储这个地址。
4、当t回到了头结点,把表尾地址给头指针。倒置完成。
d)把一个链式表转换成一个顺序存储的表(Convert)
1、用一个临时指针从头结点开始一个个结点访地问并把数据一个个放到一个一维数组里去。
2、如果找到了后继为头结点的结点就结束
e)实现约瑟夫问题:(Convert)
1、找到元素与给定的值匹配的结点。
2、开始约瑟夫循环,直到最后一个自己指向自己的结点。
3、每一次循环找到一个相应的点,将其删除。
4、把最后一个结点删除。
运行测试结果
1、首先程序会问链表长
Now You must create a Link:
Please input the number of Link Node:
2、然后会让你依次输入每一个元素如Input the [0] number of Node:
3、程序会自动显示一次刚刚输入的表:如 1 2 3 4 5
4、接着,它会把表倒置并显示出来:如 5 4 3 2 1 并把它转换成顺序表显示一次。
5、然后,开始约瑟夫问题:先输入一个开始的元素,
Please input the data whose Node will be start point:
再输入模 Please input the mod number:
最后程序会自动显示出答案。
链表逆转
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct node{
char data;
struct node *next;
}node;
node *head;
void creatlist()
{
node *p,*q,*r;
int a,b;
printf("please input some numbers/n");
scanf("%c",&b);
if(b!=Ɔ')
{
p=(node*)malloc(sizeof(node));
p->data=b;
head->next=p;
r=p;
a=getchar();
while(a!=Ɔ')
{
p=(node*)malloc(sizeof(node));
p->data=a;
r->next=p;
r=r->next;
a=getchar();
}
r->next=head;
}
else printf("NULL");
getch();
}
void invert()
{
node *p,*q,*r;
p=head->next;q=NULL;
while(p!=NULL)
{
r=q;
q=p;
p=p->next;
q->next=r;
}
head->next=q;
p=head;
p=p->next;
while(p!=head)
{printf("%c",p->data);
p=p->next;
}
}
void main()
{
clrscr();
creatlist();
printf("start inverting/n");
invert();
printf("stop inverting/n");
getch();
}
约瑟夫圈:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<dos.h>
typedef struct Data
{int no;
int password;
};
typedef struct list
{struct Data data;
struct list *next;
};
int num,m,i,j,l;
list *head,*tail,*p,*q,*pt,*pr,*pir;
void Input()
{
printf("Enter the total num =");
scanf("%d",&num);
printf("\nEnter the limt m=");
scanf("%d",&m);
if(num==0||m==0)
{ printf("Sorry ,there is no record in the queue!");
exit(0);
}
p=head=tail= (list *)malloc(sizeof(list));
p->data.no=1;
p->data.password=random(50)+1;
tail->next=head;
printf("\nNo-------------password");
printf("\n1\t\t%d",p->data.password);
for(i=2;i<=num;i++)
{
p=(list *)malloc(sizeof(list));
p->data.no=i;
p->data.password=random(50)+2;
printf("\n%d\t\t",i);
printf("%d",p->data.password);
delay(200);
p->next=head;
tail->next=p;
tail=p;
}
printf("\n\n");
}
void Process()
{ pr=tail->next;
j=1;
gotoxy(37,5);
printf("Out order NO------------its password\n");
while(num!=0)
{ l++;
while(j!=m-1)
{j++;pr=pr->next;}
pt=pr->next;
pr->next=pt->next;
pr=pr->next;
gotoxy(36,5+l);
printf("\t%d\t\t\t%d\n",pt->data.no,pt->data.password);
delay(100);
num--;
j=1;
m=pt->data.password;
if(m>=num) m=m-(m/num)*num;
free(pt);
}
}
void main()
{
clrscr();
Input();
Process();
}
约瑟夫(顺序表):
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<dos.h>
void main()
{
struct Queue{
int *b;
int i;
};
int i,j,n,m,k;
struct Queue Q;
printf("please input n,m,k\n");
scanf("%d,%d,%d",&n,&m,&k);
Q.b=(int *)malloc(n*sizeof(int));
Q.i=0;
for(i=0;i<=n-1;i++) printf("%d ",Q.b[Q.i+i]=i+1/n);
putchar('\n');
Q.i=k-2;
for (i=1;i<=n-1;i++)
{
for (j=1;j<=m;j++)
{
while (!Q.b[Q.i+1])
{
Q.i++;
if (Q.i==n) Q.i=0;
if (Q.i==n-1 && !Q.b[n-1] && !Q.b[0]) Q.i=0;
}
Q.i++;
if (Q.i==n) Q.i=0;
}
printf("%d ",Q.b[Q.i]/n);
Q.b[Q.i]=0;
}
while (!Q.b[Q.i])
{
Q.i++;
if(Q.i==n) Q.i=0;
}
clrscr();
printf("%d ",Q.b[Q.i]);
delay(500);
}
相关推荐
os-虚拟内存管理(请求分页存储管理方式)
文章目录1.1 虚拟存储器的定义1.2 虚拟存储器的特征1.3 虚拟内存技术的实现1.4 请求分页管理方式1.4.1 页表机制1.4.2 缺页中断机构1.4.3 地址变换机构1.5 页面置换算法1.6 页面分配策略1.6.1 驻留集大小1.6.2 调入页面的时机1.6.3 从何处调入页面 1.1 虚拟存储器的定义 基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其余部分留在外存,就可...
【工业自动化】欧姆龙PLC产品线与编程软件应用:从选型架构到调试排错的全流程技术指南
内容概要:本文《欧姆龙PLC与编程软件完全手册》系统介绍了欧姆龙PLC的产品架构、软件体系、通信协议、选型策略及编程调试技巧。重点区分了两大技术平台:基于CX-Programmer的传统C系列(CP/CJ/CS)与基于Sysmac Studio的新一代Sysmac平台(NJ/NX/NY),强调二者在软件生态、寻址方式和通信架构上的根本差异。手册详细对比了各系列PLC的性能参数,并提供与西门子产品的功能对标,帮助用户快速定位。深入讲解了编程操作中的关键问题,如任务结构设计、间接寻址、FB封装陷阱、在线调试五件套等,特别指出“FB使能关闭时状态不初始化”等易出错点。最后汇总了选型路径与现场避坑清单,极具实战指导价值。; 适合人群:具备一定工业自动化基础,从事PLC编程、设备调试、系统集成的研发工程师和技术人员,尤其是从西门子平台转向欧姆龙或参与新项目选型的1-5年经验从业者。; 使用场景及目标:① 新项目选型时判断应选用C系列还是Sysmac平台;② 编程调试过程中掌握高效操作技巧与常见问题排查方法;③ 实现跨平台迁移、系统升级或接手他人项目时规避架构与逻辑陷阱;④ 提升对欧姆龙PLC任务机制、间接寻址、FB设计等高级功能的理解与应用能力。; 阅读建议:本手册理论结合实践,建议按“先架构后操作”的顺序阅读,重点章节需结合实际工程反复演练。特别是FB设计规范、任务切换处理、强制操作收尾流程等内容,应在仿真环境中验证后再应用于现场。注意版本匹配问题,操作前确认所用软件与控制器固件版本兼容。
CISP-CSE注册云安全工程师备考资源包
CISP-CSE注册云安全工程师备考资源包
科技中介服务机构如何通过AI技术降低技术评估与匹配服务的操作门槛?.docx
科技中介服务机构如何通过AI技术降低技术评估与匹配服务的操作门槛?
国央企创新负责人如何借助平台实现创新资源的高效配置与项目落地?.docx
国央企创新负责人如何借助平台实现创新资源的高效配置与项目落地?


其他
