Spécialisation des problèmes de conception d'algorithmes de structure de données


Selon des informations fiables, les questions de conception d'algorithmes portent principalement sur:

Chapitres 2, 3, 7, 8



Sont respectivement

  • Chapitre 2 Table linéaire

  • Chapitre 3 Piles et files d'attente

  • Chapitre 7 Recherche

  • Chapitre 8 Tri


principale

Créez une liste liée unique en l'insérant avant et après l'insertion, et fusionnez-la dans une liste chaînée ordonnée

Problèmes de conception d'algorithme d'exercices après l'école sur table linéaire 1, 7

Pousser et faire sauter la pile de chaînes

Équipe de la chaîne

Trouver par moitié

Tri à bulles

Tri rapide

Tri de tas


Créez une liste liée unique en l'insérant avant et après l'insertion, et fusionnez-la dans une liste chaînée ordonnée

Description du code:

void CreateList_H(LinkList& L, int n)
{
	L = new Lnode;
	L->next = NULL;
	for (int i = 0; i < n; ++i) {
		p = new Lnode;
		cin >> p->data;
		p->next = L->next;
		L->next = p;
	}
}


La complexité temporelle de l'algorithme est O (n).

void CreateList_R(LinkList& L, int n) {
	L = new Lnode;
	L->next = NULL;
	r = L;
	for (i = 0; i < n; ++i) {
		p = new Lnode;
		cin >> p->data;
		p->next = null;
		r->next = p;
		r = p;
	}
}

La complexité temporelle de l'algorithme est O (n).


void MergeList(LinkList& La, LinkList& Lb, LinkList& Lc)
{
    
    
	pa = La->next;  pb = Lb->next;
	
	Lc = pc = La;  //用La的头结点作为Lc的头结点
	while (pa && pb)
	{
    
    
		if (pa->data < pb->data) {
    
     pc->next = pa; pc = pa; pa = pa->next; }
		//取较小者La中的元素,将pa链接在pc的后面,pa指针后移
		else if (pa->data > pb->data) {
    
     pc->next = pb; pc = pb; pb = pb->next; }
		//取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移
		else //相等时取La中的元素,删除Lb中的元素
		{
    
    
			pc->next = pa; pc = pa; pa = pa->next;
			q = pb->next; delete pb; pb = q;
		}
	}
	pc->next = pa ? pa : pb;    //插入剩余段
	delete Lb;            //释放Lb的头结点
}

Problèmes de conception d'algorithme d'exercices après l'école sur table linéaire 1, 7

2. Problèmes de conception de l'algorithme P53 (1) (7)

(1) Combinez deux listes chaînées ordonnées croissantes en une liste chaînée ordonnée croissante. Il est nécessaire que la liste liée de résultat utilise toujours l'espace de stockage des deux listes liées d'origine et n'occupe pas d'autre espace de stockage. Les données en double ne sont pas autorisées dans le tableau.

le même que ci-dessus! ! !


(7) Concevez un algorithme pour inverser la direction de liaison de tous les nœuds de la liste chaînée "in situ", c'est-à-dire que seul l'espace de stockage de la table d'origine est requis. En d'autres termes, la complexité spatiale de l'algorithme est de 0 (1).

//利用的是前插法
void Do(LinkList& L) {
    
    

	//1->2->3->4
	r = L->next;
	L->next = NULL;
	while (r) {
    
    
		p = r->next;
		r->next = L->next;
		L->next = r;
		r = p;
	}
}

Pousser et faire sauter la pile de chaînes

void Push(LinkStack& L, SElemType e) {
    
    
	p = new StackNode;
	p->data = e;
	p->next = L;
	L = p;
}
void pop(LinkStack& L, SElemType e) {
    
    
	if (L == NULL)e = NULL;
	else
	{
    
    
		p = L;
		e = L->data;
		L = L->next;
		delete p;
	}
}

Trouver par moitié

int search_bin(SStable ST,keyType key){
    
    
low =1;
hight = ST.length;
while(low<=high
{
    
    
	mid = (low + high)/2;
	if(key == ST.R[mid].key)
		return mid;
	else if (key<ST.R[mid].key)
		high = mid-1
	else low = mid +1

}
return 0;


Tri à bulles

void BubbleSort(Sqlist &L)
{
    
    
	m = L.length - 1 ;
	flag = 1;
	while ((m>0)&&(flag==1))
	{
    
    
		flage = 0;
		for (j=1;j<=m;j++){
    
    
			if(L.r[j].key>L.r[j+1].key)
			{
    
    
				flag = 1;
				t = L.r[j];
				L.r[j]=L.r[j+1];
				L.r[j+1] = t;
			}
			--m;
		}
	
	}
}



En supposant que la file d'attente est représentée par une liste liée circulaire avec le nœud principal, et qu'un seul pointeur est défini pour pointer vers le nœud d'élément final de la file d'attente (remarque: aucun pointeur de tête n'est défini), essayez d'écrire la file d'attente vide correspondante, jugez si la file d'attente est vide, entrez et retirez la file d'attente Et d'autres algorithmes

Insérez la description de l'image iciInsérez la description de l'image ici
Insérez la description de l'image ici


Il existe une fameuse «fonction Ackermann (Ackermann)» en mathématiques, qui est définie comme suit:

Insérez la description de l'image ici
(1) Ecrire l'algorithme récursif de Ack (m, n)

int Ack(int m, int n)
//Ack函数的递归算法
{
    
    
If(m==0)
   return n+1;
else if (m!=0 && n==0)
   return Ack(m-1, 1);
Else
   return Ack(m-1,Ack(m,m-1));
}

(2) Ecrire un algorithme non récursif pour calculer Ack (m, n)

int Ack(int m, int n)
//Ack函数的递归算法
{
    
    
    for(j=0;j<n;j++) 
    akm[0][j] = j+1;//得到Ack(0,n)的值
    for(i=0;i<m;i++)
    {
    
    
        akm[i][0] = akm[i-1][1];
        for(j=1;j<n;j++)
        akm[i][j] = akm[i-1][akm[i][j-1]];
    }
    return akm[m][n];
}

Je suppose que tu aimes

Origine blog.csdn.net/Touale/article/details/112971662
conseillé
Classement