[Structure de données] Déterminer le nœud avec la plus grande valeur dans une liste simple liée de longueur n en parcourant un voyage (implémenté en langage C)

Cette question est la page 51 du manuel, la question 6 de la question de l'algorithme

Table des matières

1. Définir la structure

2. Créer une liste liée individuellement avec insertion de queue

3. Parcourez la liste à liaison simple, recherchez la position du nœud avec la plus grande valeur et affichez les données enregistrées par le nœud.

4. Concevoir et réaliser cette traversée et sortie du plus grand nœud

Cinq, code complet

Six, lancez le test


1. Définir la structure

typedef struct LNode
{
    int data;
    struct LNode* next;
} LNode;

2. Créer une liste liée individuellement avec insertion de queue

LNode* CreateAtTail(int a[], int n)
{
    int i;
    LNode* first, * s, * r;
    first = (LNode*)malloc(sizeof(LNode));
    first->next = NULL;
    r = first;
    for (i = 0; i < 5; i++)
    {
        s = (LNode*)malloc(sizeof(LNode));
        s->data = a[i];
        r->next = s;
        r = s;
    }
    r->next = NULL;
    return first;
}

3. Parcourez la liste à liaison simple, recherchez la position du nœud avec la plus grande valeur et affichez les données enregistrées par le nœud.

void COMList(LNode* first)
{
    LNode *p;
    int max = 0;
    int count = 1;
    int i = 0;
    int biaoji = 1;
    p = first->next;
    max = p->data;
    while (p != NULL)
    {
        i++;
        if (p->data > max)
        {
            max = p->data;
            count = count + i - biaoji;
            biaoji = i;
        }  
        p = p->next;
    }
    printf("单链表中值最大的节点为第 %d 个值为 %d ", count, max);
}

 C'est aussi pourquoi p=p->next est placé sous la phrase conditionnelle if. S'il est placé au-dessus, p devient NULL à la fin de la comparaison. A ce moment, lors de la comparaison de p->data avec max, il n'y a pas Ce nœud, comment comparer.

Et mon code compare en fait le premier élément. En fait, cette étape est inutile, car elle ne sera certainement pas plus grande que le max initial, c'est-à-dire le premier élément lui-même. (Mais je ne sais pas comment le changer maintenant)

Oui!

J'ai compris

Le code est le suivant, qui consiste à changer la condition de la boucle (si vous ne la modifiez pas ici, si vous ne modifiez que if, p->next réapparaîtra le pointeur vide ci-dessus), la condition de la phrase conditionnelle if est modifié et la valeur de max est modifiée . Tout le monde peut comprendre.

Si vous ne savez pas, laissez un message et demandez-moi ~

void COMList(LNode* first)
{
    LNode *p;
    int max = 0;
    int count = 1;
    int i = 1;
    int biaoji = 1;
    p = first->next;
    max = p->data;
    while (p->next != NULL)
    {
        i++;
        if (p->next->data > max)
        {
            max = p->next->data;
            count = count + i - biaoji;
            biaoji = i;
        }
        
        p = p->next;
    }
    printf("单链表中值最大的节点为第 %d 个值为 %d ", count, max);
}

 

L'une des choses les plus difficiles à comprendre ici est l'opération de comptage :

Une erreur courante consiste à compter directement ++, le résultat d'un tel calcul est définitivement faux, comme la saisie de cinq nombres (ici, je teste que la longueur de la liste chaînée est de 5, qui sont tous des entiers), 1 3 2 5 4 , ici, La phrase conditionnelle if séparera 2, de sorte que le compte sera réduit de 1, et ainsi de suite. Dans une situation similaire, regardez la longueur et les données du tableau, et ajoutez 2, 3... et ainsi de suite.

La bonne solution est d'utiliser i pour enregistrer le nombre par rapport à, puis d'utiliser la variable biaoji pour enregistrer la position du biaoji lorsque p-> les données étaient supérieures à max la dernière fois, puis d'ajouter i-biaoji au décompte, pour exemple , Dans le dernier exemple, 1 3 2 5 4, la position de 3 est 2, et la position de 5 est 4. De cette façon, 4-2=2, count+2 est suffisant, et un ne sera pas ajouté , et la position sera mal calculée.

Pour donner un autre exemple, par exemple, 1 2 2 2 5, lors de la première entrée, la position du premier 2 est 2, le deuxième 2 et le troisième 2 ne peuvent pas entrer, et lorsqu'il atteint 5, la position est 5, avec une différence de 5 -2=3, donc compter + 3 suffit, et il n'y aura pas moins d'addition.

Si vous ne comprenez pas, donnons un autre exemple, 1 2 3 4 5, 1 ne peut pas entrer, le premier à entrer est 2, la position est 2, 3 entre, la position est 3, comptez + 3-2 , comptez simplement +1.

4. Concevoir et réaliser cette traversée et sortie du plus grand nœud

int main()
{
    LNode* first;
    int a[5];
    int i = 0;
    int count = 0;
    printf("请输入5个数,进行初始化链表:\n");
    for (i = 0; i < 5; i++)
    {
        scanf_s("%d", &a[i]);
    }
    first = CreateAtTail(a, 5);
    COMList(first);
    return 0;
}

Cinq, code complet

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

typedef struct LNode
{
    int data;
    struct LNode* next;
} LNode;


void COMList(LNode* first)
{
    LNode *p;
    int max = 0;
    int count = 1;
    int i = 0;
    int biaoji = 1;
    p = first->next;
    max = p->data;
    while (p != NULL)
    {
        i++;
        if (p->data > max)
        {
            max = p->data;
            count = count + i - biaoji;
            biaoji = i;
        }
        
        p = p->next;
    }
    printf("单链表中值最大的节点为第 %d 个值为 %d ", count, max);
}
LNode* CreateAtTail(int a[], int n)
{
    int i;
    LNode* first, * s, * r;
    first = (LNode*)malloc(sizeof(LNode));
    first->next = NULL;
    r = first;
    for (i = 0; i < 5; i++)
    {
        s = (LNode*)malloc(sizeof(LNode));
        s->data = a[i];
        r->next = s;
        r = s;
    }
    r->next = NULL;
    return first;
}
int main()
{
    LNode* first;
    int a[5];
    int i = 0;
    int count = 0;
    printf("请输入5个数,进行初始化链表:\n");
    for (i = 0; i < 5; i++)
    {
        scanf_s("%d", &a[i]);
    }
    first = CreateAtTail(a, 5);
    COMList(first);
    return 0;
}

Six, lancez le test

 

 

 S'il vous plaît corrigez-moi s'il y a une erreur ~

Si vous ne comprenez pas, laissez un commentaire et demandez-moi ~

Tout le monde va essayer ce code!

Je suppose que tu aimes

Origine blog.csdn.net/m0_57549888/article/details/124434196
conseillé
Classement