zoukankan      html  css  js  c++  java
  • 循环链表和约瑟夫环

    循环链表的实现

    单链表只有向后结点,当单链表的尾链表不指向NULL,而是指向头结点时候,形成了一个环,成为单循环链表,简称循环链表。当它是空表,向后结点就只想了自己,这也是它与单链表的主要差异,判断node->next是否等于head。

    代码实现分为四部分:

    1. 初始化
    2. 插入
    3. 删除
    4. 定位寻找

    代码实现:

    void ListInit(Node *pNode){
    	int item;
    	Node *temp,*target;
    	cout<<"输入0完成初始化"<<endl;
    	
    	while(1){
    		cin>>item;
    		if(!item)
    			return ;
    		if(!(pNode)){ //当空表的时候,head==NULL 
    			pNode = new Node ;
    			if(!(pNode))
    				exit(0);//未成功申请 
    			pNode->data = item;
    			pNode->next = pNode;
    		}
    		else{
    			//
    			for(target = pNode;target->next!=pNode;target = target->next)
    				;
    			temp = new Node;
    			if(!(temp))
    				exit(0);
    			temp->data = item;
    			temp->next = pNode;
    			target->next = temp;
    		}
    	}
    } 
    void ListInsert(Node *pNode,int i){ //参数是首节点和插入位置 
    	Node *temp;
    	Node *target;
    	int item;
    	cout<<"输入您要插入的值:"<<endl;
    	cin>>item;
    	if(i==1){
    		temp = new Node;
    		if(!temp)
    			exit(0);
    		temp->data = item;
    		for(target=pNode;target->next != pNode;target = target->next)
    		;
    		temp->next = pNode;
    		target->next = temp;
    		pNode = temp;
    	}
    	else{
    		target = pNode;
    		for (int j=1;j<i-1;++j)
    			target = target->next;
    		temp = new Node;
    		if(!temp)
    			exit(0);
    		temp->data = item;
    		temp->next = target->next;
    		target->next = temp;
    	}
    }
    void ListDelete(Node *pNode,int i){
    	Node *target,*temp;
    	if(i==1){
    		for(target=pNode;target->next!=pNode;target=target->next)
    		;
    		temp = pNode;//保存一下要删除的首节点 ,一会便于释放 
    		pNode = pNode->next;
    		target->next = pNode;
    		delete temp; 
    	}
    	else{
    		target = pNode;
    		for(int j=1;j<i-1;++j)
    			target = target->next;
    		temp = target->next;//要释放的node
    		target->next = target->next->next;
    		delete temp; 
    	}
    }
    int ListSearch(Node *pNode,int elem){ //查询并返回结点所在的位置 
    	Node *target;
    	int i=1;
    	for(target = pNode;target->data!=elem && target->next!= pNode;++i)
    		target = target->next;
    	if(target->next == pNode && target->data!=elem)
    		return 0;
    	else return i;
    }
    

    约瑟夫问题

    约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。这类问题用循环列表的思想刚好能解决。

    注意:编写代码的时候,注意报数为m = 1的时候特殊情况

    #include<iostream>
    #include<cstdio>
    using namespace std;
    typedef struct Node{
    	int data;
    	Node *next;
    };
    
    Node *Create(int n){
    	Node *p = NULL, *head;
    	head = new Node;
    	if (!head)
    		exit(0);
    	p = head; // p是当前指针 
    	int item=1;
    	if(n){
    		int i=1;
    		Node *temp;
    		while(i<=n){
    			temp = new Node;
    			if(!temp)
    				exit(0);
    			temp->data = i++;
    			p->next = temp;
    			p = temp; 
    		}
    		p->next = head->next;
    	}
    	delete head;
    	return p->next;
    }
    void Joseph(int n,int m){
    	//n为总人数,m为数到第m个的退出
    	m = n%m;
    	
    	Node *start = Create(n);
    	
    	if(m){//如果取余数后的m!=0,说明 m!=1 
    		while(start->next!=start){
    			Node *temp = new Node;
    			if(!temp)
    				exit(0);
    			for(int i=0;i<m-1;i++) // m = 3%2 = 1
    				start = start->next;
    			temp = start->next;
    			start->next = start->next->next;
    			start = start->next;
    			cout<<temp->data<<" ";
    			delete temp;
    		}
    	}
    	else{
    		for(int i=0;i<n-1;i++){
    			Node *temp = new Node;
    			if(!temp)
    				exit(0);	
    			cout<<start->data<<" ";
    			temp = start;
    			start = start->next;
    			delete temp;
    		}
    	}
    	cout<<endl;
    	cout<<"The last person is:"<<start->data<<endl;
    }
    int main(){
    	Joseph(3,1);
    	Joseph(3,2);
    	return 0;
    }
    
  • 相关阅读:
    Linux安装ElasticSearch,Elasticsearch安装辅助插件,IK分词器安装,使用IK分词器
    springBoot高级:自动配置分析,事件监听,启动流程分析,监控,部署
    dubbo:分布式系统中的相关概念,服务提供者,服务消费者,dubbo高级特性
    Maven高级:分模块开发与设计,聚合,集成,属性,版本管理,多环境开发配置和跳过测试,私服搭建
    springMVC:校验框架:多规则校验,嵌套校验,分组校验;ssm整合技术
    springMVC:异步调用,异步请求跨域访问,拦截器,异常处理,实用技术
    Web全段重点整理
    spring事务:事务控制方式,使用AOP控制事务,七种事务传播行为,声明事务,模板对象,模板对象原理分析
    Java基础技术基础面试【笔记】
    高级知识点:多线程,资源管理【笔记】
  • 原文地址:https://www.cnblogs.com/AsuraDong/p/6986930.html
Copyright © 2011-2022 走看看