【循环单链表经典题目----约瑟夫问题】

约瑟夫问题

文章目录

  • 约瑟夫问题
    • 题目
    • 源码
    • 要点
      • 如何定义一个单链表结点类型?
      • 循环单链表怎么建立?
      • malloc()函数和free()函数是什么意思?
      • 如何删除一个结点?

题目

信奥2037:约瑟夫问题

源码

//c++万能头 
#include
using namespace std;

//循环单链表的问题

//定义一个结点类型 
struct Node{
	int data;//数据域
	Node *next;//指针域 
}; 

//建立循环单链表
Node *Create(int n)
{
	Node *head,*p,*q;
	
	head=(Node*)malloc(sizeof(Node)); 
	p=(Node*)malloc(sizeof(Node));
	
	head->data=1;//头结点数据域赋值1 
	head->next=NULL;//指针域空
	 
	p=head;//p指向头结点 
	
	for(int i=2;i<=n;i++)
	{
		q=(Node*)malloc(sizeof(Node));
		q->data=i;
		p->next=q;
		p=q;
	}
	
	p->next=head;//形成了一个循环单链表 
	return head; 
 } 
 
 //主函数 
int main()
{
	int n,m;
	cin>>n>>m;
	int res[n];//存退圈者的序号 
	int i=0;
	Node *head,*p,*q;
	head=Create(n);
	p=head;
	while(inext;
		 }
		 
		 q=p->next;//q存要删除的结点 
		 res[i]=q->data;
		 
		 p->next=q->next;//删除 
		 free(q);//释放删除结点的存储空间 
		 
		 p=p->next;//保证每次都是从1开始
		  
		 i++;
	}
	
	for(int j=0;j

要点

  1. 如何定义一个单链表结点类型?

    -定义一个结点类型:包括数据域and指针域

  2. 循环单链表怎么建立?

    建立循环单链表(此处要根据具体需求具体建立)

  3. malloc()函数和free()函数是什么意思?

    malloc():动态申请一片连续的存储空间,执行结束返回空间的第一个元素,并且返回的是一个指针,所以需要强制转化为自己所定义的数据元素类型指针。

    free():因为malloc()申请的空间在堆区,系统不会自动释放,所以需要自己手动书写free释放空间

  4. 如何删除一个结点?

    常用方法就是先找到该结点的前驱结点,然后通过修改结点的后继关系,删除结点

你可能感兴趣的:(链表,数据结构,c++)