WinFuture-Forum.de: Problem Bei Einfach Verkettetnn Listen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Problem Bei Einfach Verkettetnn Listen in C


#1 Mitglied ist offline   oli37 

  • Gruppe: aktive Mitglieder
  • Beiträge: 127
  • Beigetreten: 05. Januar 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Österreich

geschrieben 13. Dezember 2009 - 16:48

Hi

ich habe hier zur Übung eine einfach Verkettete Liste hier gebastelt.

Leider kriege ich 3x folgenden Fehler zurück (CodeLite):
7: multiple definition of `startzeiger'

Ich steh momentan total auf der Leitung...

Hier der Code


Kette.c
/Main, startet die Module
//(c) Oli37

#include "Kette.h"

void main()
{
	struct ELEMENT * ptr = NULL;
	int wert;
	char namen[50];
	char del[50];
	
	while(wert !=999)								//Hier nur zu Testzwecken: Bei Eingabe von 999 hört die Schleife auf 
	{
		printf("Geben Sie einen Namen ein: ");
		scanf("%s", namen);
		
		printf("Geben Sie einen Wert ein: ");
		scanf("%i", &wert);
		
		einfuegen_vorne(namen, wert);
	}
	
	ausgabe();
	
	printf("Welchen Namen moechten Sie loeschen: ");
	scanf("%s", del);
	
	loeschen(del);
	
	ausgabe();
	
}


Kette.h
//Header der Dateien
//(c) Oli37


#ifndef verkettet
#define verkettet 1

#include <stdio.h>
#include <string.h>

struct ELEMENT
{
	struct ELEMENT* nextElement;
	int wert;
	char name[50];
};



int einfuegen_vorne(char*, int);
//void einfuegen_sortiert();	//Noch nicht implementiert
int loeschen(char*);
void ausgabe(void);

struct ELEMENT* startzeiger = NULL;

#endif


Einfuegen_Vorne.c
//Fügt ein Element am Anfang der Kette ein
//(c) Oli37

#include "Kette.h"

int einfuegen_vorne(char* namen, int wert)
{
	struct ELEMENT* ptr;
	
	if((ptr = (struct ELEMENT*) malloc(sizeof(struct ELEMENT*))) == NULL)
		{
			printf("Fehler beim Hinzufuegen\n");
			return 1;
		}
		
		else
		{
			ptr->wert = wert;
			strcpy(ptr->name, namen);
			ptr->nextElement = startzeiger;
			startzeiger = ptr;
			return 0;
		}
	
}


Loeschen.c

//Loescht ein Element aus der Kette
//(c) Oli37

#include "Kette.h"

int loeschen(char * name)
{
	struct ELEMENT* ptr = startzeiger, *vorgaenger;
	
	while(ptr != NULL && strcmp(ptr->name, name))	//Solange bis name mit ptr->name gleich sind 
	{
		vorgaenger = ptr;							//vorgaenger wird auf ptr gesetzt und jedes mal wieder ersetzt(wenn Bedingung nicht erfüllt)
		ptr=ptr->nextElement;						//Weitergehen
	}
	
	if(ptr == NULL)									//Abbrechen
	{
		return 1;
	}
	
	else
	{
		if(ptr == startzeiger)
		{
			startzeiger = ptr->nextElement;
		}
		
		else											//Überspringe dieses Element 
		{
			vorgaenger->nextElement = ptr->nextElement;	//Vorgaenger zeigt nun girekt auf das nächte Element
		}
		
		free(ptr);
		return 0;
	}
}


Ausgabe.c

//Gibt die gesamte Kette aus
//(c) Oli37

#include "Kette.h"

void ausgabe(void)
{
	struct ELEMENT* ptr = startzeiger;								//ptr auf startzeiger setzen 
	
	while(ptr != NULL)
	{
		printf("Name: %s \t Wert: &i\n", ptr->name, ptr->wert);
		ptr = ptr->nextElement;										//weiter mit nächtem Element
	}
}


Bitte um Hilfe
Posting Bullshit since 2006.
0

Anzeige



#2 Mitglied ist offline   aeris 

  • Gruppe: aktive Mitglieder
  • Beiträge: 129
  • Beigetreten: 06. September 08
  • Reputation: 12
  • Geschlecht:unbekannt

geschrieben 13. Dezember 2009 - 17:53

Kette.h
static struct ELEMENT* startzeiger = NULL;


Wichtig hierbei das static damit das Objekt nur einmal initialisiert wird.
0

#3 Mitglied ist offline   oli37 

  • Gruppe: aktive Mitglieder
  • Beiträge: 127
  • Beigetreten: 05. Januar 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Österreich

geschrieben 13. Dezember 2009 - 18:14

Allerdings ist nur die Fehlermeldung weg. Bei Ausgabe zB ist jetzt

struct ELEMENT* ptr = startzeiger; //ptr is jetzt NULL

while(ptr != NULL) //hier tut sich nix mehr
{
printf("Name: %s \t Wert: &i\n", ptr->name, ptr->wert);
ptr = ptr->nextElement;
}

Der Startzeiger soll über alle Module hinweg änderbar sein.

Dieser Beitrag wurde von oli37 bearbeitet: 13. Dezember 2009 - 18:25

Posting Bullshit since 2006.
0

#4 Mitglied ist offline   Der Kenner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 574
  • Beigetreten: 30. Januar 05
  • Reputation: 0

geschrieben 13. Dezember 2009 - 19:24

Was mir aufgefallen ist beim Drüberschaun: Bei einfuegen_vorne muss es heißen "malloc(sizeof(struct ELEMENT))..." und nicht "malloc(sizeof(struct ELEMENT*)...". Sonst reservierst du nur genug Speicher für nen Zeiger.

Zweitens solltest du strncpy statt strcpy verwenden. Ansonsten schaffst du damit ein solides Fundament für Exploits.

Und bei "#define SOMEHEADER_H 1" solltest du die 1 weglassen. Das sieht sonst zu stark nach symbolischer Konstante aus.

Dieser Beitrag wurde von Der Kenner bearbeitet: 13. Dezember 2009 - 19:26

0

#5 Mitglied ist offline   aeris 

  • Gruppe: aktive Mitglieder
  • Beiträge: 129
  • Beigetreten: 06. September 08
  • Reputation: 12
  • Geschlecht:unbekannt

geschrieben 13. Dezember 2009 - 19:48

Beitrag anzeigenZitat (oli37: 13.12.2009, 18:14)

Allerdings ist nur die Fehlermeldung weg. Bei Ausgabe zB ist jetzt

struct ELEMENT* ptr = startzeiger; //ptr is jetzt NULL

while(ptr != NULL) //hier tut sich nix mehr
{
printf("Name: %s \t Wert: &i\n", ptr->name, ptr->wert);
ptr = ptr->nextElement;
}

Der Startzeiger soll über alle Module hinweg änderbar sein.


Ooops, sieht so aus als ob static anders arbeitet als erwartet, hier wird wohl fuer jedes Modul eine eigene Instanz verwendet.

Workaround:
Loesche struct ELEMENT* startzeiger; aus der Header Datei und definiere sie oberhalb von Main() mit struct ELEMENT* startzeiger;

Dann schreib in jede andere .c Datei:
extern struct ELEMENT* startzeiger;
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0