Lineare Liste



  • Hallo,
    ich versuche schon den ganzen Tag eine lineare Liste zu machen, aber leider funktioniert es nicht, denn es gibt einen Laufzeitfehler... Ich schätze ich greife auf nicht reservierten Speicher zu.

    Ja, ich habe auch Google bemüht und C von A bis Z usw... gefunden, aber irgendwie bringt mich das alles nicht weiter...

    Hat nicht jemand für mich ein kleines Beispiel wo man Einträge in eine Liste hinzufügen und alle Einträge ausgeben kann? Zum Schluss sollte der Speicher auch wieder korrekt gelöscht werden...

    Das würde mir wirklich wahnsinnig helfen!

    Vielen Dank im Voraus,
    ListenPhobiker



  • Hi ListenPhobiker...

    muss die Liste selber programmiert sein, oder darfst du auch die STL
    benutzen damit wäre das ganze ziemlich simpel.

    Würde dann ungefähr so aussehen:

    #include <list>
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main (){
    
    	list<string> mylist;			  //STL-List für strings
    	list<string>::iterator it;		//Iterator um über die Liste zu laufen
    
    	//Einträge einfügen
    	mylist.push_back("Eintrag 1");
    	mylist.push_back("Eintrag 2");
    	mylist.push_back("Eintrag 3");
    	mylist.push_back("Eintrag 4");
    
    	//Einträge ausgeben
    	for (it=mylist.begin();it!=mylist.end();it++){
    		cout<<*it<<endl;
    	}
    }
    

    mfg smilingman



  • smilingman schrieb:

    Hi ListenPhobiker...

    muss die Liste selber programmiert sein, oder darfst du auch die STL
    benutzen damit wäre das ganze ziemlich simpel.

    Würde dann ungefähr so aussehen:

    #include <list>
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main (){
    
    	list<string> mylist;			  //STL-List für strings
    	list<string>::iterator it;		//Iterator um über die Liste zu laufen
    
    	//Einträge einfügen
    	mylist.push_back("Eintrag 1");
    	mylist.push_back("Eintrag 2");
    	mylist.push_back("Eintrag 3");
    	mylist.push_back("Eintrag 4");
    
    	//Einträge ausgeben
    	for (it=mylist.begin();it!=mylist.end();it++){
    		cout<<*it<<endl;
    	}
    }
    

    mfg smilingman

    Hi,
    sowas wie "erlaubt" oder "nicht erlaubt" gibt es nicht, da es sich hierbei nicht um eine Hausaufgabe handelt. Es ist mir einfach wichtig dies mit C-Funktionen zu realisieren um eine DLL-Schnittstelle zu haben.

    Vielen Dank,
    ListenPhobiker



  • Soll das ganze reines C sein, oder wäre C++ auch OK?



  • Also folgendes Problem:
    Um die DLL-Schnittstelle auch mit anderen Compilern kompatibel zu mache ist es sehr wichtig das ganze möglichst in C zu halten da z.B. std::string bei einem anderen Compiler anders implementiert sein könnte, was das zueinander inkompatibel macht.
    Daher wäre es mir lieb die Liste in C zu halten. Das heißt: Klassen sind kein Problem, aber Dinge wie: std::string, std::list, etc. wollte ich vermeiden.

    Vielen Dank im Voraus,
    ListenPhobiker



  • Ok...

    würde mir an deiner Stelle eine abstrakte Liste bauen.
    Also eine Klasse Liste die Elemente einer abstrakten Klasse
    ListenElement aufnehmen kann. Dann kannst du von der abstrakten
    Klasse ListenElement eine oder mehrere Klassen ableiten und
    diese alle in die Liste packen.

    Kann dir jetzt Leider keine komplette Liste programmieren
    und hier rein stellen, würde zu lange dauern...

    würde dann aber ungefähr so aussehen:

    //List.h
    
    #pragma once
    #include <stdio.h>
    #include "ListElement.h"
    
    class List
    {
    private:
    	ListElement* root;
    	ListElement* last;
    public:
    	List(void);
    	~List(void);
    
    	void push_back(ListElement* element);
    
    	void browse();
    };
    
    //List.cpp
    
    #include "List.h"
    
    List::List(void){
    	root = NULL;
    	last = NULL;
    }
    
    List::~List(void){
    }
    void List::push_back(ListElement* element){
    	if (root == NULL){
    		root = element;
    		last = element;
    	}else{
    		element->prev = last;
    		last->next = element;
    		last = element;
    	}
    }
    void List::browse(){
    	ListElement* element = root;
    	while (element != NULL){
    		element->browse();
    		element = element->next;
    	}
    }
    
    //ListElement.h
    
    #pragma once
    #include <stdio.h>
    
    class ListElement
    {
    protected:
    	ListElement* next;
    	ListElement* prev;
    public:
    	ListElement(void);
    	~ListElement(void);
    
    	virtual void browse()=0;
    
    	friend class List;
    };
    
    //ListElement.cpp
    
    #include "ListElement.h"
    
    ListElement::ListElement(void){
    	next = NULL;
    	prev = NULL;
    }
    
    ListElement::~ListElement(void){
    }
    
    //MyElement.h
    
    #pragma once
    #include <stdio.h>
    #include "listelement.h"
    
    class MyElement : public ListElement
    {
    private:
    	int value;
    public:
    	MyElement(int value);
    	~MyElement(void);
    	void browse();
    };
    
    //MyElement.cpp
    
    #include "MyElement.h"
    
    MyElement::MyElement(int value){
    	this->value = value;
    }
    MyElement::~MyElement(void){
    }
    void MyElement::browse(){
    	printf("Value: %i \n",value);
    }
    
    //main.cpp
    
    #include "List.h"
    #include "MyElement.h"
    #include "ListElement.h"
    
    int main (){
    
    	//Liste erstellen
    	List list;				
    
    	//Pointer auf das Abstrakte ListElement
    	ListElement* element;
    
    	//Liste füllen
    	element = new MyElement(1);
    	list.push_back(element);
    	element = new MyElement(2);
    	list.push_back(element);
    	element = new MyElement(3);
    	list.push_back(element);
    
    	//Einträge ausgeben
    	list.browse();
    }
    

    So würde ich das machen somit kann man alles was von ListElement
    abgeleitet ist in diese Liste packen.

    Muss mal schauen ob ich nicht irgendwo noch ne komplette Liste
    rumfliegen habe. Die müsstest du dann nur noch an deine bedürfnisse
    anpassen. Falls ich was brauchbares finde meld ich mich noch mal.

    mfg smilingman



  • Vielen vielen vielen Dank 🙂 Dein Code reicht mir völligst aus. Ich denke ich schaffs ab jetzt alleine 👍 👍 👍

    Danke!!!

    Viele Grüße,
    ListenPhobiker



  • @smilingman: Sehr Nett.. soviel engagement für ein fremden *fg* 😃



  • ListenPhobiker schrieb:

    ...Um die DLL-Schnittstelle auch mit anderen Compilern kompatibel zu mache ist es sehr wichtig das ganze möglichst in C zu halten da z.B. std::string bei einem anderen Compiler anders implementiert sein könnte, was das zueinander inkompatibel macht.
    Daher wäre es mir lieb die Liste in C zu halten. Das heißt: Klassen sind kein Problem,...

    Also du willst über DLL und Compilergrenzen hinweg arbeiten? Dann kannst du nicht nur wie du erwähnt hast die STL, sondern auch Klassen vergessen (Diese sind nicht binärkompatibel und auch kein C-Sprachelement). Das einzige was geht sind POD.

    cu André


Log in to reply