[Prob] Liste struct

ehmkey

Grünschnabel
Hallo!

Ich habe sagen wir mal 5 structs (kreis,rect, line,text, polygon).
Ich rufe in der Console zb kreis auf und speicher es in den struct.
Dann mit rect, kreis, usw.

Ich versteh nicht wie ich das in eine Liste speichern könnte ?!

Muss ich in jedem struct einen pointer mit *next und *last haben, oder muss im struct liste, für jede struct die ich speichern möchte einen pointer haben?

Oder vielleicht einen void pointer im struct liste das ich dann caste oder wie oder was :S

Kann mir da bitte eine Listenexperte helfen

Danke
 
Hallo,

so ganz habe ich Deine Frage zwar nicht verstanden, aber hier ist mal ein Link, der Dir vielleicht hilft, die STL und damit auch Listen zu verstehen:

http://www.namespace-cpp.de/C++/kennen/stl.htm#Container

Haben Deine structs denn unterschiedliche Struktur
Dann würde das so ohne Weiteres meiner Meinung nach eh' nicht gehen, da Du in eine Liste immer nur gleiche Typen einstellen kannst .....

Post doch ggf. mal ein bisschen Code (Aufbau der structs, die Stelle, an der Du die Elemente einfügst etc.), damit man es hier nachvollziehen kann!

Gruß
Klaus
 
Code:
typedef struct line
{
	char *id;
	int x1;
	int y1;
	int x2;
	int y2;
}	lineTyp;


typedef struct rect
{
	char *id;
	int x;
	int y;
	int width;
	int height;
	char *fill;
}	rectTyp;

typedef struct circle
{
	char *id;
	int cx;
	int cy;
	int r;
	char *fill;
}	circleTyp;

typedef struct text
{
	char *id;
	char *text;
	int x;
	int y;
	int font_size;
	char *fill;
}	textTyp;

typedef struct liste
{
	struct liste *next;
	struct liste *last;
	struct line *lines;
	struct rect *rects;
	struct circle *circles;
	struct text *texts;
	struct line *data;
	int head;
}	listenTyp;

struct liste *start=NULL; //Anfang Liste
struct liste *end=NULL;   //Ende Liste
struct liste *temp=NULL;  //Hilfszeiger

void insert_list(struct line *daten, int shape) //wird so aufgerufen insert(&lin,1)
{                                                                              //weiß aber nicht wie ich das     
                                                                                //verallgemeinern kann
    struct liste *pointerEnd;

    if(start == NULL)
    {
      if((start = (struct liste *) malloc(sizeof(listenTyp))) == NULL)
      {
         printf("Kein Speicherplatz vorhanden für anfang\n");
         return;
      }
      // Daten in das erste Element schreiben
      start->next = NULL;
      start->last = NULL;
      start->head = -1;
	  

     // printf("Es geht die ID auszugeben : %s",start->data->id) ;
    }

    else
    {
        temp = start;
        while (temp->next != NULL)
        {
            temp = temp->next;
        }

        if((temp->next = (struct liste *)malloc(sizeof(listenTyp))) == NULL)
        {
            printf("Kein Speicherplatz für das letzte Element\n");
            return;
        }

        temp=temp->next;

        if(shape==1) //Linie
        {
			temp->data = (struct line *) malloc(sizeof(lineTyp));
			temp->data = daten;
			//temp->data->id = data->id;
			temp->next = NULL;

			temp->data->id = (char*) malloc(strlen(daten->id) * sizeof(char));
			strcpy(temp->data->id,daten->id);
			temp->data->x1=daten->x1;
			temp->data->x2=daten->x2;
			temp->data->y1=daten->y1;
			temp->data->y2=daten->y2;
        }

		if(shape==2) //Rechteck
		{
			temp->data = (struct rect*) malloc(sizeof(rectTyp));
			temp->data = daten;
			temp->next = NULL;
		}

		if(shape==3) //Text
		{
			temp->data = (struct text*)malloc(sizeof(textTyp));
			temp->data = daten;
			temp->next = NULL;
		}

		if(shape==4) //Kreis
		{
			temp->data = (struct circle*)malloc(sizeof(circleTyp));
			temp->data = daten;
			temp->next = NULL;
		}
	} 
}
 
Ui, das sieht aber heftig aus ;-)

Musst Du die Liste wirklich von Hand erstellen?
Ich würde Dir wirklich empfehlen,dies über die STL zu lösen. Dort kannst Du den Container "list" problemlos nutzen :
Code:
list<listentyp> my_list; // Liste deklarieren
...
listenTyp my_list_element;       // Listenelement vom Typ 'listentyp' deklarieren
...
// jetzt my_list_element mit allen Daten füllen
...
my_list.push_back( my_list_element );  // Listenelement in die Liste einfügen
...
// Liste per Iterator durchlaufen
my_list::iterator it;
for( it = my_list.begin(); it != my_list.end(); it++ )
{
    if( it->circle->id == ID )
    {
        // tue irgendwas
    }
}
...

Bei Deinem Versuch 'von Hand' kann ich Dir so auf die Schnelle nicht wirklich weiterhelfen, sorry!
Du musst aber drauf achten, dass Du nur Elemente vom listentyp einfügst, wobei die Inhalte wohl nicht wirklich Zeiger sein müssen!

Gruß
Klaus
 

Neue Beiträge

Zurück