[C] Verkette Liste?!

01/29/2014 11:50 Belur#1
Hey,

ich schreibe demnächst eine Klausur und wollte nochmal verkettete Listen wiederholen.

Da das alles nicht geklappt hat irgendwie, hab ichs zum testen grad mal auf absolute Minimum gekürtzt.

Ich wollte eine 5 in die Liste schreiben und das einfach nur ausgeben, also:
PHP Code:
struct knoten{
int data;
struct knoten *next
}

void main(){
struct knoten *new = malloc(sizeof(struct knoten));
new->
data=5;
printf("%d", new->data);

Soo. Ich sehe im Debugger auch, dass er eine 5 reinschreibt.
Allerdings, klappt die Ausgabe garnicht.
Er gibt immer 0.00000 aus ...

Vllt kann mir jemand sagen, was ich da falsch mache.


Grüße
01/29/2014 11:54 ​Tension#2
Du versuchst ja auch einen Integer als Float auszugeben.
ersetze einfach das %f durch %d.
01/29/2014 12:06 Belur#3
Ja blöder Fehler, danke das klappt schonmal.
Jetzt wollte ich das langsam erweitern:

PHP Code:
void einfuegen(struct knoten *tempint data){
    if(
temp!=NULL){
    
struct knoten *new = malloc(sizeof(struct knoten));
    new->
data data;
    new->
next temp->next;
    
temp->next= new;
    
temp=new;
    }else{
    
struct knoten *new = malloc(sizeof(struct knoten));
    new->
data data;
    new->
next NULL;
    
temp=new;
    
start = new;
    }


}
int main(){
    
struct knoten *temp;
    
temp=NULL;

einfuegen(&temp5);
printf("%d"temp->data);

Allerdings passiert einfach garnichts...

Ich hab mir das so gedacht, dass ich überprüfe ob temp NULL ist oder nicht.
In diesem Fall ja jetzt Ja, also ist die Liste leer.

Dann füge ich data etc ein und setzt start und temp eben aufs erste Element.
Dann müsste ich temp eigentlich ausgeben können(?!), was ja jetzt nicht klappt


Im Debugger sehe ich auch, dass temp die richtige Adresse von "new" übernimmt. Aber sobald ich wieder in die main springe zum printf(), wird temp auf einmal wieder "0x0"
01/29/2014 14:00 +Yazzn#4
void main() entspricht nicht dem C Standard.
new ist in C++ reserviert, verwende new_node.

Sowas in der Art ist da schon um einiges schöner:
Code:
typedef struct node_t
{
	int data;
	struct node_t *next;
} node;

node *add_node(node *current, int data)
{
	node *new_node = (node *)malloc(sizeof(node));
	new_node->data = data;
	new_node->next = NULL;
	if (current)
	{
		current->next = new_node;
	}
	return new_node;
}

int main()
{
	node *head = add_node(NULL, 1);
	node *current = head;
	current = add_node(current, 2);
	current = add_node(current, 3);
	current = add_node(current, 4);
	
	for (node *i = head; i; i = i->next)
	{
		printf("%d\n", i->data);
	}
}
Aufgebaut auf diesem Post: [Only registered and activated users can see links. Click Here To Register...]
01/29/2014 14:44 Belur#5
Danke schonmal, sieht echt ziemlich gut aus, wobei ich mir nicht vorstellen kann, dass die for-Schleife so funktioniert in C :o

Hatte das jetzt nochmal anders versucht:

PHP Code:
void einfuegen(struct daten*anfangstruct daten*neu){

        
struct daten *temp anfang;
        while(
laenge(temp)>0){
            
temp temp->next;
        }

        
temp->nextneu;
}

int main(void) {

    
    
struct daten anfang;
    
anfang.zahl 1;
    
anfang.next NULL;
    
struct daten *temp;
    
int i;
    for(
210i++) {
            
temp malloc(sizeof(struct daten));
            
temp->zahl i;
            
temp->next NULL;

            
einfuegen(&anfangtemp);
        }
   
ausgabe(&anfang);
    return 
0;

Wider Erwartens läuft das so schon, obwohl ich mir das nicht so ganz erklären kann.
Ich hätte jetzt erstmal damit gerechnet, dass nur das erste eingefügt wird.
Mich wunderts, dass ich nicht für jedes Element, dass ich einfüge, einen neuen struct erstellen muss wieder.

Hatte ja einmal dieses
"struct daten *temp" aber in der While-Schleife und einfuegen methode muss ich selbst für ein neues Element, nicht wieder einen neuen struct erstellen irgendwie. Also das

"struct daten *temp" war ja einmalig.

Kann mirs nicht so ganz erklären wie das läuft ;/