Guten Tag zusammen,
ich habe hier eine kleine Übung doch ich verstehe nicht so ganz wie es gehen soll.
Also hier einmal der Übungstext:
Bis jetzt habe ich meine Header-Datei die sieht so aus:
Vorab oben der Code ist quatsch!
Ich verstehe an dieser Aufgabe folgende 2 Dinge nicht:
Wie soll die Rekursion funktionieren :-( und
Wie soll der Knoten dann eingefügt werden?
Also es steht da ja wenn die bestehende Liste = NULL ist gebe ich den Zeiger (z2) des Listenelements zurück. Sollte z1.wer kleiner sein als z2.wert dann muss es rechts eingefügt werden da die Liste absteigend sortiert werden soll.
Nun der dritte Fall: Wenn der erste Wert z. B. größer ist als der nächste Wert der eingefügt werden soll also in der Liste stehe eine 8 und ich möchte nun eine 1 einfügen, dann steht dort rekusiver Aufruf von z1->next. Da die Liste aber doch absteigend Sortiert sein sollte, würde ich doch nur noch ein größeres Element bekommen?
Danach (sagen wir mal die Rekursion würde irgendwann laufen) verstehe ich auch nicht was ich mit diesem Rückgabewert anfangen soll? Super ich bekomme einen Knoten zurück. Ist das dann der Vorgänger des einzufügenden Knoten? So das man in der insert Prozedur dann nur noch die Pointer umhängen muss?
Danke im voraus
LG
ich habe hier eine kleine Übung doch ich verstehe nicht so ganz wie es gehen soll.
Also hier einmal der Übungstext:
Implementieren Sie in C folgende einfach verkettete sortierte Liste für double-Zahlen, in der die Zahlen absteigend sortiert sind:
Eine Datenstruktur für ein Listenelement
Eine Datenstruktur, sortList, in der neben den benötigten Zeigern auch die aktuelle Anzahl der Listenelemente gespeichert ist.
Ein Unterprogramm insert(), dem einen Zeiger auf sortList und ein Zahlenwert übergeben wird. Erstellt wird ein neues Listenelement und dieses wird mittels recInsert() eingefügt.
Ein Unterprogramm recInsert(), das zwei Zeiger auf Listenelemente übergeben bekommt und einen solchen Zeiger auch zurückgibt. Der erste Zeiger (z1), verweist in die bestehende Liste. Der zweite Zeiger (z2) zeigt auf das einzufügende Listenelement. recInsert() soll folgendermaßen arbeiten:
z1 == NULL -> Erg = z2
z1.wert < z2.wert -> z1 wird der Nachfolger von z2. Rückgabe: z2
z1.wert >= z2.wert -> rekursiver Aufruf mit dem Nachfolger von z1. Das Ergebnis dieses rekursiven Aufrufs wird als neuer Nachfolger von z1 gesetzt. Rückgabe: das geänderte z1.
Bis jetzt habe ich meine Header-Datei die sieht so aus:
C:
typedef struct listenElement {
double wert;
struct listenElement *next;
}node;
typedef struct sortList {
node *anfang;
int anzahl;
}list;
void insert(list *l, double x);
node *recInsert(node *l, node *x);
C:
#include "einfachverketteteliste.h"
#include <stdio.h>
#include <stdlib.h>
void insert(list *l, double x) {
node *new = (node *) malloc(sizeof(node));
if (new == NULL) {
printf("Fehler nicht genug Speicherplatz!\n");
return;
}
new->wert = x;
recInsert(l->anfang, new);
}
node *recInsert(node *z1, node *z2) {
if (z1 == NULL)
return z2;
if (z1->wert < z2->wert)
return z2;
else if (z1->wert >= z2->wert)
return recInsert(z1->next, z2);
}
Vorab oben der Code ist quatsch!
Ich verstehe an dieser Aufgabe folgende 2 Dinge nicht:
Wie soll die Rekursion funktionieren :-( und
Wie soll der Knoten dann eingefügt werden?
Also es steht da ja wenn die bestehende Liste = NULL ist gebe ich den Zeiger (z2) des Listenelements zurück. Sollte z1.wer kleiner sein als z2.wert dann muss es rechts eingefügt werden da die Liste absteigend sortiert werden soll.
Nun der dritte Fall: Wenn der erste Wert z. B. größer ist als der nächste Wert der eingefügt werden soll also in der Liste stehe eine 8 und ich möchte nun eine 1 einfügen, dann steht dort rekusiver Aufruf von z1->next. Da die Liste aber doch absteigend Sortiert sein sollte, würde ich doch nur noch ein größeres Element bekommen?
Danach (sagen wir mal die Rekursion würde irgendwann laufen) verstehe ich auch nicht was ich mit diesem Rückgabewert anfangen soll? Super ich bekomme einen Knoten zurück. Ist das dann der Vorgänger des einzufügenden Knoten? So das man in der insert Prozedur dann nur noch die Pointer umhängen muss?
Danke im voraus
LG