[Datenstruktur] Ermitteln Sie den Knoten mit dem größten Wert in einer einfach verknüpften Liste der Länge n, indem Sie eine Reise durchlaufen (implementiert in C-Sprache).

Diese Frage ist Seite 51 des Lehrbuchs, Frage 6 der Algorithmusfrage

Inhaltsverzeichnis

1. Definieren Sie die Struktur

2. Erstellen Sie eine einfach verkettete Liste mit Schwanzeinfügung

3. Durchlaufen Sie die einfach verknüpfte Liste, finden Sie die Position des Knotens mit dem größten Wert heraus und geben Sie die von dem Knoten gespeicherten Daten aus

4. Entwerfen und realisieren Sie diese Traversierung und Ausgabe des größten Knotens

Fünf, vollständiger Code

Sechs, führen Sie den Test durch


1. Definieren Sie die Struktur

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

2. Erstellen Sie eine einfach verkettete Liste mit Schwanzeinfügung

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. Durchlaufen Sie die einfach verknüpfte Liste, finden Sie die Position des Knotens mit dem größten Wert heraus und geben Sie die von dem Knoten gespeicherten Daten aus

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);
}

 Das ist auch der Grund, warum p=p->next unter dem if-Bedingungssatz platziert wird.Wenn es darüber platziert wird, wird p am Ende des Vergleichs NULL.Zu diesem Zeitpunkt, wenn p->data mit max verglichen wird, gibt es no Dieser Knoten, wie man vergleicht.

Und mein Code vergleicht tatsächlich das erste Element.Tatsächlich ist dieser Schritt unnötig, da es definitiv nicht größer als das anfängliche Maximum, also das erste Element selbst, sein wird. (Aber ich weiß jetzt nicht, wie ich das ändern kann)

Ja!

Ich habe es

Der Code ist wie folgt, das heißt, die Schleifenbedingung zu ändern (wenn Sie sie hier nicht ändern, wenn Sie nur if ändern, erscheint p->next wieder der obige leere Zeiger), die Bedingung des if-Bedingungssatzes ist geändert, und der Wert von max wird geändert. Jeder kann verstehen.

Wenn Sie es nicht wissen, hinterlassen Sie eine Nachricht und fragen Sie mich ~

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);
}

 

Eines der schwierigeren Dinge, die hier zu verstehen sind, ist die Zähloperation:

Ein häufiger Fehler besteht darin, direkt zu zählen++, das Ergebnis einer solchen Berechnung ist definitiv falsch, z. B. die Eingabe von fünf Zahlen (hier teste ich, dass die Länge der verknüpften Liste 5 ist, die alle ganze Zahlen sind), 1 3 2 5 4 , hier, Der if-Bedingungssatz trennt 2, so dass die Anzahl um 1 reduziert wird, usw. Sehen Sie sich in einer ähnlichen Situation die Tabellenlänge und die Daten an und fügen Sie 2, 3 ... und so weiter hinzu.

Die richtige Lösung besteht darin, i zu verwenden, um die Zahl im Vergleich zu aufzuzeichnen, und dann die Variable biaoji zu verwenden, um die Position des biaoji aufzuzeichnen, als p->data beim letzten Mal größer als max war, und dann i-biaoji zur Zählung hinzuzufügen, z Beispiel , Im letzten Beispiel, 1 3 2 5 4, ist die Position von 3 2 und die Position von 5 ist 4. Auf diese Weise ist 4-2=2, count+2 ist genug und eins wird nicht hinzugefügt , und die Position wird falsch berechnet.

Um ein weiteres Beispiel zu geben, zum Beispiel 1 2 2 2 5, wenn Sie zum ersten Mal eintreten, ist die Position der ersten 2 2, die zweite 2 und die dritte 2 kann nicht eintreten, und wenn sie 5 erreicht, ist die Position 5, mit einer Differenz von 5 -2=3, also reicht count+3, und es wird nicht weniger hinzugefügt.

Wenn Sie es nicht verstehen, geben wir ein weiteres Beispiel, 1 2 3 4 5, 1 kann nicht eingegeben werden, der erste, der eingegeben wird, ist 2, die Position ist 2, 3 tritt ein, die Position ist 3, Zählen Sie +3-2 , zähle einfach +1 hoch.

4. Entwerfen und realisieren Sie diese Traversierung und Ausgabe des größten Knotens

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;
}

Fünf, vollständiger Code

#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;
}

Sechs, führen Sie den Test durch

 

 

 Bitte korrigieren Sie mich, wenn es einen Fehler gibt ~

Wenn Sie es nicht verstehen, hinterlassen Sie einen Kommentar und fragen Sie mich ~

Jeder geht und probiert diesen Code aus!

Supongo que te gusta

Origin blog.csdn.net/m0_57549888/article/details/124434196
Recomendado
Clasificación