Dynamische Arrays, LinkedLists - C++

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Dynamische Arrays, LinkedLists - C++

Beitrag von AndyX »

Moin,

ich hab da heute mal mich an die Arbeit gemacht und sowas geschrieben. Nur irgendwie hagelt es Buildfehler :freak: :|

Vllt könnt ihr ja mal schauen:

Code: Alles auswählen

#include <iostream>
using namespace std;

class DynamicArray
{
private:
    int *data;
	int s_size;
	int index;
	int s_grow;
public:
    DynamicArray(int size,int grow)
    {
        data=new int[size];
        index=-1;
		s_size=size;
		s_grow=grow;
    };
	~DynamicArray()
	{
		delete[] data;
	};
	void grow()
	{
		int *temp=data;
		s_size+=s_grow;
		data=new int[s_size];
		int i;
		for(i=0; i<index; i++)
			data[i] = tmp[i];
		delete tmp;
	};
    void push(int val)
    {
		if((index++)==size)
			grow();
		index++;
		data[index]=val;
    };
    void fragTop()
    {
		index=index-1;
    };
    int pop()
    {
        return data[index];
    };
	bool isEmpty()
    {
	    return index==-1;
	};
	void flush()
	{
		delete[] data;
		index=-1;
		data=new int[s_grow];
	};
	int size()
	{
		return s_size++;
	};
	int getElement(int indx)
	{
		return data[indx];
	};
	void setElement(int indx,int val)
	{
		if(nr>s_size)
			grow();
		data[indx]=val;
		index=indx;
	};
	void remove(int indx)
	{
		int tmp[s_size];
		int i;
		for(i=0;i<indx;i++)
			tmp[i]=data[i];
		for(i=indx+1;i<=s_size;i++)
			tmp[i-1]=data[i];
		
		s_size--;
		index--;
		delete[] data;
		s_size+=s_grow;
		data = new int[s_size];

		for(i=0; i<=s_size; i++)
			data[i] = tmp[i];
	};
};

class LinkedList
{
private:
	class ListElement
	{
	public:
		int ll_val;
		ListElement *ll_PtN;
	};
	ListElement *ll_SP;
public:
	int getPtr()
	{
		return ll_SP;
	};
	int getVal()
	{
		return ll_SP->ll_Val;
	};
	void putNew(int val)
	{
		ListElement *ll_nEP=new ListElement;
		ll_nEP->ll_val=val;
		ll_nEP->ll_PtN=ll_SP;
		ll_SP=ll_nEP;
                return ll_SP;
	};
	void listSelect(ListElement *ll_EP)
	{
		ll_SP=ll_EP;
	};
	bool isEmpty()
	{	
		return ll_SP==0;
	};
};
greetz,
AndyX :(
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Ja stimmt, es sind ja auch einige Fehler drin (warum benutzt du auch Zeiger?) :roll: . Du hast doch bestimmt einen Debugger der dir sagt was nicht stimmt, oder?
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

return index==-1;
Wo hast du sowas denn her? Vergleiche im IF werden mit doppeltem Gleichheitszeichen gesetzt, Zuweisungen mit einem. :(

Lern erstmal die Grundlagen von C++ bevor du dich mit soetwas wie LinkedLists befassen willst.
warum benutzt du auch Zeiger?
Ich will die LinkedList sehen, die ohne Zeiger auskommt. 8)
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

@Sunny: Die Funktion soll ja zurückliefern, ob der index -1 is (also obs leer ist)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

@AndyX:
Wollte nur mal anmerken das beides schon ein Bestandteil
von C++ ist.

LinkedList:

Code: Alles auswählen

#include <iostream>
#include <list>
#include <stdlib.h>

using namespace std;

int main() {
   // LinkedList fuer Integer anlegen
   list<int> Liste;

   // Elemente anhaengen
   for(int i=0; i<15; i++) Liste.push_back(i);

   // Iterator erstellen
   list<int>::iterator it;

   // Liste von Anfang zum Ende durchgehen
   for(it=Liste.begin(); it != Liste.end(); it++)
      cout << *it << endl;
  
   system("PAUSE");	
   return 0;
}
Und ein dynamisches Array (vector):

Code: Alles auswählen

#include <iostream>
#include <vector>
#include <string>
#include <stdlib.h>

using namespace std;

struct Player {
  int    count;
  string name;
};

string Users[8] = { "Danilo", "Hans" , "MVXA"   , "AndyX",
                    "Batze" , "Sunny", "Team100", "Falko" };

int main() {
   // Dynamisches Array fuer Objekt anlegen (z.B. Struktur, kann aber auch alles andere sein)
   vector<Player> Array;

   // Array erweitern
   for(int i=0; i<8; i++) {
      Player temp;
      temp.count = i;
      temp.name  = Users[i];
      Array.push_back(temp);
   }

   // Array ausgeben
   for(int i=0; i<8; i++)
      cout << Array[i].count << " " << Array[i].name << endl;

   system("PAUSE");	
   return 0;
}
Das hat natürlich nichts mit Deinem Code zu tun, aber ich
mache diese Anmerkung nicht ohne Grund:
Deine beiden Klassen sind unflexibel, da Du einen fest definierten
Datentyp nimmst (int). Was ist wenn Du dann mal eine Liste
oder ein dyn.Array mit Strings oder Objekten/Strukturen
machen willst?

In der STL (Standard Template Library) von C++ ist das schon
alles flexibel dabei. Wenn Du es selbst machen möchtest, solltest
Du Dir mal Template-Klassen und -Funktionen anschauen.
Damit kannst Du dann auch eigene Klassen/Funktionen mit
jedem Datentyp aufrufen.

Eine Schnellübersicht für list und vector usw. ist da: http://www.cppreference.com/
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

:oops: Sowas gibts ja schon :oops: :freak: Das mit unflexibel stimmt, aber es sollte nur mal so zum ausprobieren sein :)
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

AndyX hat geschrieben:@Sunny: Die Funktion soll ja zurückliefern, ob der index -1 is (also obs leer ist)
Oh, so sieht's also aus. Dann sorry für die voreiligen Schlussfolgerung, dann ist es so natürlich nicht falsch. :oops:
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Ich progg das nochmal neu :| Das DynamicArray is einfach nur ein wilder Mix aus Array und Stack... ^__^
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Hier nochmal, diesmal mit Kommentaren :D

Code: Alles auswählen

#include <iostream> //Wichtig!
#include <time.h> //Wichtig für Delay-Function D;
using namespace std; //Noch wichtiger!

class XArray //Neue Klasse 'XArray' erstellen
{
private: //Privatsache D;
    int *xa_data; //Data-Array mit Inhalt
	int xa_size; //Größe des Arrays
public: //Public... :)
    XArray(int size) //Konstruktur
    {
        xa_data=new int[size]; //Neues Data-Array anlegen...
		xa_size=size; //...und Größe speichern
    };
	~XArray() //Destruktor
	{
		delete[] xa_data; //Data-Array löschen
	};
	void grow(int xa_grow) //XArray erweitern
	{
		int *temp_data = xa_data; //Data-Array im Temp-Array zwischenspeichern
		xa_size += xa_grow; //Größe aktualisieren
		xa_data = new int[xa_size]; //Neues Data-Array anlegen...
		for(int loop = 0; loop < xa_size; loop++) //In einer Schleife...
			xa_data[loop] = temp_data[loop]; //...alles vom Temp-Array wieder ins Data-Array...
		delete temp_data; //Temp-Array wieder löschen
	};
	void flush() //XArray leeren
	{
		delete[] xa_data; //Data-Array löschen
		xa_data = new int[xa_size]; //Neues Data-Array anlegen...
	};
	int get(int index) //Bei Index...
	{
		return xa_data[index]; //...den Inhalt zurückgeben
	};
	void set(int index,int val) //Bei Index...
	{
		if(index > xa_size) //Wenn´s das nicht gibt...
			return; //Zurück :|
		xa_data[index] = val; //...einen Inhalt setzen
	};
};

void delay(int sec) //Meine Delay-Funktion D;
{
	int start = time(NULL);
	while (start + sec > time(NULL))
		;
};

void main() //Main
{
	//Verschiedenes machen...
	XArray Array1(10);
	Array1.set(5,21489);
	cout << Array1.get(5) << endl;
	Array1.flush();
	cout << Array1.get(5) << endl << endl;

	//Nochmehr machen...
	XArray Array2(25);
	Array2.set(4,4325890);
	Array2.set(16,34892892);
	cout << Array2.get(16) << endl;

	delay(5);	

	return;
};
Ich glaub kaum, dass es wer braucht... :roll:

BTW: Geht das irgendwie dass man da Floats, Doubles, Strings oder anderes reingeben kann, ohne dass man alles zig mal neu schreiben muss?

greetz
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

@AndyX:
Was stört Dich denn an dem fertigen dyn.Array (vector) aus der STL?

Dein Testcode erstellt ein dyn.Array mit der Größe 10. Mit der
STL sieht das so aus:

Code: Alles auswählen

vector<int> Array(10);
Der Zugriff funktioniert dann direkt, nicht wie bei Dir über 2
Methoden 'set' und 'get':

Code: Alles auswählen

Array[5] = 1024;
Willst Du das Array dann vergrößern oder verkleinern hilft resize:

Code: Alles auswählen

Array.resize(50);
Um einen Vector mit 10 Elementen zu erstellen und diese
alle mit 0 zu initialisieren nimmst Du:

Code: Alles auswählen

vector<int> Array(10,0);
Auch bei resize kannst Du angeben mit was neue Elemente
initialisiert werden:

Code: Alles auswählen

Array.resize(50,1);
Hier bekommen alle neuen Elemente den Wert 1.

Hier mal ein kleines Beispiel was den Umgang zeigt:
1. Vector mit 10 Elementen anlegen, alle initialisiert mit 0
2. Vector füllen mit 0..9
3. Vector auf 15 Elemente erweitern, neue Elemente mit 12 initialisieren
4. Vector von Anfang bis Ende durchmischen
5. Vector wieder sortieren

Code: Alles auswählen

#include <iostream>
#include <vector>
#include <algorithm>
#include <stdlib.h>

using namespace std;

vector<int> v(10,0); // Vector mit 10 Elementen, alle initialisiert mit 0

void ausgeben(void) {
  for(int i=0; i<v.size(); i++)
     cout << v[i] << " : ";
  cout << endl << "----------" << endl;
}

int main() {
   ausgeben(); // alles mit 0 initialisiert

   for(int i=0; i<10; i++) v[i] = i;

   ausgeben(); // 0 bis 9
   
   v.resize(15,12);

   ausgeben(); // 0 bis 9 und 5 mal 12

   random_shuffle(v.begin(),v.end());

   ausgeben(); // durcheinander gemischt

   sort(v.begin(),v.end());

   ausgeben(); // wieder sortiert

   system("PAUSE");	
   return 0;
}
Das beste deutsche Buch zur STL dürfte Die C++-Standardbibliothek
von Kuhlins und Schader sein. Kann ich nur empfehlen!
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten