Joseph annule la tête de suppression de liste liée à un problème et ajoute la méthode de queue

1. Description du problème

       Il y a 15 personnes dans un cercle, numérotées de 1 à 15. Commencez à compter à partir de la première personne et ceux qui se présentent à n sortent du cercle. Écrivez le programme en langage C, entrez la valeur de n (n> 1) et indiquez le numéro de la dernière personne à gauche dans le cercle.

2. Description de l'algorithme

void main ()

{

Créer une liste chaînée L

Insérez les 15 nombres 1-15 dans la fin de L un par un

Entrez n

Tant que (plus d'un élément dans la liste chaînée L)

{

pour (i = 1; i <n; i ++)

{

Prenez le premier élément de L et placez-le à la fin de L;

Supprimer le premier élément de L

}

Sortir le premier élément de L

Supprimer le premier élément de L

}

Sortir le premier élément de L, qui est le restant

}

Trois, réalisez

#include<list>
#include<iostream>
using namespace std;
void print(list<int> &L)
{
	if(L.size()==0)
	{
		cout<<"No data\n";
		return;
	}
		
	list<int>::iterator it;
	for(it=L.begin();it!=L.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
}

int main( )
{
	list<int> L;
	
	int i,n;
	for(i=1;i<16;i++)
	{
		L.push_back(i);
	}
	
	//cin>>n;
	n=3;
	while(L.size()>1)
	{
		for(i=1;i<n;i++)
		{
			L.push_back(L.front());
			L.erase(L.begin());
		}		
		cout<<L.front()<<" ";
		L.erase(L.begin());
		
	}
	cout<<endl;
	cout<<"最后剩余的是:"; 
	cout<<L.front()<<" "<<endl;
	
	return 0;
}


 

Quatrièmement, l'analyse de l'efficacité

Il s'agit d'un double cycle, en supposant qu'il y a m personnes au début

Dans le premier cycle de la couche externe, la queue est insérée n-1 fois et la tête est supprimée n fois.

Dans la deuxième boucle de la couche externe, la queue est insérée n-1 fois et la tête est supprimée n fois.

...

Dans le m-1ème cycle de la couche externe, la queue est insérée n-1 fois et la tête est supprimée n fois.

En résumé, la nécessité d'insérer l'opération de queue: (m-1) * (n-1) fois; la nécessité de supprimer les opérations: (m-1) * n fois

Par conséquent, la complexité temporelle de l'algorithme est: O (m * n)

Si la personne chargée de la proposition rend délibérément les choses difficiles et donne un n plus grand, elle doit être comptée n fois à chaque fois, et elle peut continuer à tourner en rond.

Par conséquent, le nombre de cycles internes n peut être optimisé à x.

if (n% L.size () == 0) // Si n est un multiple de la longueur de la table, il faut supprimer la fin de la table
            x = L.size ();
else // Sinon, il s'agit de trouver le reste
            x = n% L. Taille();

 

#include<list>
#include<iostream>
using namespace std;
void print(list<int> &L)
{
	if(L.size()==0)
	{
		cout<<"No data\n";
		return;
	}
		
	list<int>::iterator it;
	for(it=L.begin();it!=L.end();it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
}

int main( )
{
	list<int> L;
	
	int i,n;
	for(i=1;i<16;i++)
	{
		L.push_back(i);
	}
	
	//cin>>n;
	n=3;
	while(L.size()>1)
	{
		int x;
		if(n%L.size()==0)
			x=L.size();
		else
			x=n%L.size();
		for(i=1;i<x;i++)
		{
			L.push_back(L.front());
			L.erase(L.begin());
		}		
		cout<<L.front()<<" ";
		L.erase(L.begin());
		
	}
	cout<<endl;
	cout<<"最后剩余的是:"; 
	cout<<L.front()<<" "<<endl;
	
	return 0;
}


Elle peut également être optimisée: c'est-à-dire que toute la liste chaînée composée des n-1 premières données est retirée et insérée à la fin de la liste.

Pour le moment, l'utilisation du modèle de liste ne fonctionnera pas et ses fonctions membres ne sont pas facilement disponibles.

C'est aussi la raison pour laquelle nous devons apprendre les principes de base, quand vous ne le faites pas, vous avez la capacité de créer.

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43917370/article/details/108688579
conseillé
Classement