Verkettete Listen in C++

=fire=

Erfahrenes Mitglied
Hallo,

ich versuche gerade eine einfach Verkettete Liste in C++ zu erstellen. Leider gibt er mir nur 1 aus und dann wird das Ausführen abgebrochen. Irgendwas stimmt da mit dem Speicher nicht.

Kann mir jemand einen Tipp geben?

Code:
`#include <iostream>
using namespace std;

struct zahl {
    int          nummer;
    struct zahl  *next;
};

int main() {
    int n, z;
    cout << "Wieviel Zeichen soll die Kette haben?" << endl;
    cin >> n;
    cout << "Wieviele Zahlen werden gezogen?" << endl;
    cin >> z;
    int i;
    zahl *anfang = new zahl;
    zahl *aktuell = new zahl;
    zahl *var = new zahl;
    (*var).nummer=1;
    anfang = var;
    for(i=2;i<n;i++) {
        zahl *var = new zahl;
        (*var).nummer = i;
        (*aktuell).next = var;
        aktuell = var;
    }
    for(i=1;i<n;i++) {
        cout << anfang->nummer << endl;
        anfang = anfang->next;
    }

    return 0;
}

Danke, Gruß Fire
 
C++:
#include <iostream>

struct Zahl {
    int number;
    Zahl *next;
    
    Zahl() : number(0), next(NULL) {}
};

int main() {
    int n;
    std::cout << "Wieviele Zeichen soll die Kette haben?" << std::endl;
    std::cin >> n;
    
    Zahl *first, *current;
    
    current = new Zahl();
    current->number = 1;
    first = current;
    
    for( int i = 1; i < n; i++ ) {
        Zahl *next = new Zahl();
        next->number = i+1;
        current = current->next = next;
    }
    
    std::cout << "Ausgeben:" << std::endl;
    
    current = first;
    for( int i = 0; i < n; i++ ) {
        std::cout << "  " << current->number << std::endl;
        current = current->next;
    }
    
    return 0;
}
 
Hallo,

habe meinen Code noch mal etwas angepasst. Leider immer noch ohne Erfolg.

Code:
#include <iostream>
using namespace std;

struct zahl {
    int          nummer;
    zahl  *next;
};

int main() {
    int n;
    cout << "Wieviel Zeichen soll die Kette haben?" << endl;
    cin >> n;
    int i;
    zahl *anfang, *aktuell, *var;
    var = new zahl;
    aktuell = new zahl;
    var->nummer=1;
    anfang = var;
    for(i=2;i<n;i++) {
        zahl *var = new zahl;
        var->nummer = i;
        aktuell->next = var;
        aktuell = var;
    }
    cout << "Ausgeben:" << endl;
    for(i=1;i<n;i++) {
        cout << anfang->nummer << endl;
        anfang = anfang->next;
    }

    return 0;
}
 
Es gibt [code=cpp]-Tags für C++-Quellcode

C++:
#include <iostream>
using namespace std;

struct zahl {
    int          nummer;
    zahl  *next;
};

int main() {
    int n;
    cout << "Wieviel Zeichen soll die Kette haben?" << endl;
    cin >> n;
    int i;
    
    // Du brauchst maximal zwei pointer hier.
    // streiche var
    zahl *anfang, *aktuell /*, *var  */;
    
    // Fällt weg, weil var gestrichen
    // var = new zahl;
    
    aktuell = new zahl;
    
    // aktuell statt var
    // var->nummer=1;
    // anfang = var;
    aktuell->nummer=1;
    anfang = aktuell;
    
    // wenn du 5 eingibst, geht diese schleife nur 3 mal druch.
    // du meinst wohl <=
    // for(i=2;i<n;i++) {
    for(i=2;i<=n;i++) {
        // hier hast du dein altes var verschleiert
        zahl *var = new zahl;
        var->nummer = i;
        aktuell->next = var;
        aktuell = var;
    }
    
    cout << "Ausgeben:" << endl;
    // Hier ebenfalls <=
    // for(i=1;i<n;i++) {
    for(i=1;i<=n;i++) {
        cout << anfang->nummer << endl;
        anfang = anfang->next;
    }

    return 0;
}
 
Hallo,

aber ich brauche doch insesamt 3 Pointer.
1. um den anfang zu merken
2. das vorherige merken
3. das aktuelle wo ich dann akutell->next auf das alte setzen muss..?

Meine Frage ist eingentlich nur warum er erst 1 ausgibt und dann ein Fehler kommt.. Muss ja irgendein Speicherfehler sein?

C++:
#include <iostream>
using namespace std;

struct zahl {
    int          nummer;
    zahl  *next;
};

int main() {
	int n;
	cout << "Wieviel Zeichen soll die Kette haben?" << endl;
	cin >> n;
	int i;

	zahl *anfang, *aktuell;

	aktuell = new zahl;
	anfang = new zahl;

	aktuell->nummer=1;
	anfang = aktuell;
	for(i=2;i<=n;i++) {
		zahl *var = new zahl;
		var->nummer = i;
		var->next = aktuell;
		aktuell = var;
	}
	cout << "Ausgeben:" << endl;
	for(i=1;i<=n;i++) {
		cout << anfang->nummer << endl;
		anfang = anfang->next;
	}

	return 0;
}
 
Zuletzt bearbeitet von einem Moderator:
C++:
        var->next = aktuell;
        aktuell = var;
Das ist doch murx. Gucks dir mal ganz genau an, dann kommste auf die Idee, dass "var" ja das nächste Element nach "akutell" ist, und nicht "aktuell" das nächste nach "var".

C++:
    anfang = new zahl;
Die Zeile ist zwar nicht katastrophal, aber trotzdem unschön. Den Speicher den du hier für anfang reservierst, der verschwindet ja im Zugriffsnirvana, weil du zwei Zeilen weiter den Pointer einfach auf 'nen anderen Speicherbereich (nämlich den von aktuell) zeigen lässt.
 
Hallo,

okay.. war verkehrt herum zugewiesen ;-).
Nun zu Mergesort. Versuche das gerade zu verstehen. Geht das memcpy auch in C++?

C++:
#include <iostream>
#include <cstring>
using namespace std;

int print(int *ptr, int n) {
    int i;
    for(i=0; i<n; i++) {
        cout << ptr[i] << " ";
    }
    cout << endl;
    return 1;
}

void merge(int *v, int l, int m, int r, int *tmp) 
{
    cout << "Aufruf" << "links: "<< l << "mitte: " << m << "rechts: "  << r << endl;
    int i = l;
    int j = m + 1;
    
    int k = 0;
    
    // choose bigger from the left and right
    while ((i <= m) && (j <= r)) {
        cout << v[i] << "und " << v[j] << endl;
        if (v[i] < v[j])
            tmp[k++] = v[i++];
        else
            tmp[k++] = v[j++];
    }
    // copy remaining items
    while (i <= m)
        tmp[k++] = v[i++];
    
    while (j <= r)
        tmp[k++] = v[j++];
    print(tmp,10);
    // efficient way to copy arrays (C-idiom to learn)
    memcpy(v+1, tmp, sizeof(tmp) * sizeof(int));
}


int merge_sort(int *v, int l, int r, int *tmp) {
    if(l<r) {
        int m = (l+r) /2;
        merge_sort(v, l, m, tmp);
        merge_sort(v, m+1, r, tmp);
        merge(v, l, m, r, tmp);
    }
    return 1;
}


int main() {
    int v[] = {12,22,11,1,6,7,9,8,10,16};
    int n = 10;
    print(v,n);
    int *tmp = new int[n];
    merge_sort(v, 0, n, tmp);
    print(v, n);
    return 1;
}
 
Zurück