You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Tuesday, January 17th 2012, 3:09pm

Array aus verketteten listen

Hallo C Coder!

Ich habe hier eine Aufgabe die mich fast zum Wahnsinntreibt und zwar soll eine Adajanzliste in c Geschrieben werden dabei werden untereinander verbundene Knoten in einem Array von verkettetn listen gespeichert. Jeder Knoten
i stellt in diesem Array ein Element dar. in jedem Element wird die Liste alle seiner Nachbarn gespeichert.

Ich habe dazu gar keine idee wie kann ich denn so etwas realiseiren habe schon gegoogelt aber für mich nichts hilfreiches gefunden wäre toll wenn mir jemand einen Lösungsansatz oder ein beipspiel zeigen könnte

ich habe mir überlegt ein Element müsste ungefähr so aussehn

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
struct element
{
	int nummer;
	struct element* vorgänger;
	struct element* nachfolger;
}
 
allerdings ist das falsch da ein Element ja bereits eine liste iste ist oder ?
 
Danke im Vorraus

2

Tuesday, January 17th 2012, 4:29pm

Hilft dir das: http://www.tilman.de/uni/ws03/alp/adjazenz.php

Ansonsten ist dein Ansatz nicht schlecht, du hast einaml den Elmentinhalt i, die Vorgänger und Nachfolger und damit die erste Ebene der List.
Nun brauchst du innerhalb jedes Elements noch eine Liste in der steht auf welche Elemente das Element "Zeigt".

Mfg Rushh0ur

3

Tuesday, January 17th 2012, 5:38pm

Hallo Rushh0ur!

Danke für deine Antwort !

Nein das Hilft mir leider wenig die Idee die dahinter steht hab ich schon verstanden den link hab auch schon beim googlen gefunden.

Ich habe ehr mit dem

Nun brauchst du innerhalb jedes Elements noch eine Liste in der steht auf welche Elemente das Element "Zeigt".
auch wenn es vielleicht einfach ist und die Frage eventuell doof aber ich kann mir da echt nichts daruf zam reimen bzw ich find dafür einfach keinen ansatz!

4

Tuesday, January 17th 2012, 9:39pm

Du hast schon vollkommen richtig angefangen, nur wahrscheinlich gleich zu weit gedacht.
Bau doch erstmal eine verkettete Liste und teste die ausgiebig, dann hast du alles an der Hand, um auch ein Array von verketteten Listen zu haben.

Tipp: wenn du einen Startknoten (du hast es element genannt) nimmst, der immer leer ist, macht das die Implementierung einfacher, weil viele Fallunterscheidungen wegfallen.
Tipp: wenn du in element von int nummer nach zB void *data änderst, hast du mit entsprechenden Casts eine typunabhängige Version -> dann kannst du auch eine verlinkte Liste von verlinkten Listen haben ;)

5

Tuesday, January 31st 2012, 2:28pm

Sorry wenn ich diesen Thread nochmal pushe!

Ich hatte die letzen Tage keine zeit deshalb konnte ich mich nicht mehr mit beschäftigen hab jetzt zumindest einen Ansatz.

Also die Aufgabe ist es ein Array aus verkettetn listen zu erstellen:

Das Array besteht dann aus zwei listen eine mit vollen elementen und eine mit lerren elementen also sprich jedes Array element ist eine liste wenn es leer ist zeigt es auf das nächste leere Arrayelement
wenn nicht zeigt es auf das nächste besetzte Arrayelement wenn ein neues Listenelement angefordert wird muss dies aus einen leeren Arrayplatz geschehen. das heißt die Liste der Leeren Elemente wird
verkürzt wenn es neues Element angefordert wird bzw wird sie um eines erweitert wenn ein element wieder freigegeben wird.

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
struct LE
{
	float value; 
	struct LE* next;
	LE(): value(0.0f), next(0) {}
};
 
 
 
 
class List
{
 
 
 
private:
 
  	LE* first;
 
	  LE* last;
 
	  LE* leArray;
 
 
	  unsigned leArraySize;
 
	   LE* firstEmpty;  /*Zeiger auf das erste leere Element*/
 
 
 
	   LE* newLE( )  /*forder neues element an heißt es sucht leeres element und gibt zeiger auf dieses zurück */
	   {
 
		   LE* neu;   /*neuer zeiger*/
 
		   if( firstEmpty->next !=  NULL )  /*wenn firstEmpty->next nicht null ist sind noch weiter leere elemente enthalten */
			{
				neu = firstEmpty;           	/*das erste leere element wird in den Zeiger neu geschoben*/
				firstEmpty=firstEmpty->next; /*das nächste element auf das das erste leere element zeigt wird neues firstEmpty*/
 
				return neu;       	/*leeres element wird zurück gegeben*/
		   }else
		   {
 
				return NULL;  /* wenn firstEmpty Null kein leeres element vorhanden return null*/
 
		   }
 
	   }
 
 
 
 
 
 
public: 
 
	LE* arr ;
 
	List (unsigned size )  /*Konstruktor erstellt array mit list elementen "LE"*/
	{
			arr = new LE[size];  /*reserviere Speicher für array */
 
			for (int i = 0; i<size; i++) /*Durchlaufe Array und initialsiere jedes  mit einem LE */
			{
				arr[i]= /*wie kann ich initialsieieren*/ 0 ; 
 
			}
 
			firstEmpty = arr[0]; // firstEmpty zeiger auf erstes arrayelement setzen 
 
	}
 
 
 
 
	List(const List& source);
	List(List&& source);
 
 
 
	~List();
	int append(float value);
	void deleteLE(LE* old);
 
 
	List& operator=(const List& source);
	List& operator =(List&& source);
 
 
	LE* getFirstEmpty()
	{
		return List::firstEmpty;	
 
	}
 
	 void setArraysize(int size)
	 {
		 List::leArraySize = size;
 
	 }
);


So von mir stammt die Funktion newLE() und der Konstruktor list der rest war vorgegeben allerdings habe ich jetzt ein paar fragen :

1. Wieso sagt er hier :

C/C++ Quellcode

1
if( firstEmpty->next !=  NULL )


bezeichenr NULL nicht definiert ?? Benutze Visual studio falls das euch was hilft.

als nächstes wie kann ich mein array nun mit LE element initialsieren

wenn ich das ganze so mache

C/C++ Quellcode

1
2
3
4
5
or (int i = 0; i<size; i++)
			{
				arr[i]= LE*neu   ;
 
			}


Wird mir geast der typname ist nicht zulässig warum ? es ist doch ein array vom typ LE also darf ich doch da auch solche elemente reinschreiben oder ?

Als nächstes ist die Frage ist es richtig wenn ich die private funktionen gleich oben deklarier wenn ich sie versuche nach der klasse zu deklarieren sagt er mir das es eine ungültige doppeldekleration ist außerdem versteh ich nicht ganz was ich mit den ganzen zeigen machen soll bzw warum diese private sind ? so komme ich doch ohne set und getter nicht mehr ran ?

Wäre cool wenn mal jemand drüber schaut und ein paar verbesserungsvorschläge und tipps gibt :)

Danke im vorraus

PS: Sorry für den langen post

6

Tuesday, January 31st 2012, 8:50pm

Ähm, in deinem ersten Beitrag schreibst du Lösung in C und in deinem letzten gehst du das in C++ an.
Welche Sprache soll das denn werden?

MfG bcc-fan

7

Tuesday, January 31st 2012, 9:37pm

oh sorry!

Da hab ich gar nicht drauf geachtet ja im ersten habe ich c verwendet aber jetzt versuche ich diese Aufgabe gerade in c++

sorry lag vermutlich daran das der beitrag schon ein paar tage her war ... aber c++ soll jetzt beibehalten werden .

8

Wednesday, February 1st 2012, 1:37am

NULL = 0
Wenn das nächste Element nicht (!=) NULL ist dann exestiert es (zumindest sollte es, wenn korekt gehandhabt, werde jedoch aber aus dem folgend nicht schlau, Sinn?)
Die funktion newLE stammt von dir und du fragst was du da gemacht hast? Oo

Die ganzen Variablen sind Privat damit keiner auf die Idee kommt diese in irgendwelcher Weiße zu ändern und diese nicht ins Nirvana geschickt werden.
Innerhalb der Klasse hast du jedoch vollen zugriff auf diese.

Deine Variable arr ist eine einfache List von LE structuren.
Die Reservierung dieser ist mittels new Korrekt.
Um diese nun zu initialisieren am besten mit memset den Speicherbereich 0en.

Source code

1
firstEmpty = arr[0];

Damit erhälst du direkt das 0 Objekt, du brauchst aber die Addresse dieser (???), dann noch nen & davor: &arry[0] oder einfach nur arr -> pointer aufs erste (0) element.

Mfg Rushh0ur

Similar threads

Social bookmarks