Autor Thema: Doppelt verkettete Listen in C  (Gelesen 16010 mal)

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« am: 18. March 2005, 21:15 »
Hallo,
einwas kapier ich in C einfach net! Ich hoffe ihr seid net sauer, weil ich dauernt Fragen hab...
Also, wenn ich eine Struktur

struct xxx{
   char name[20];
   struct angestellt *next;  
   struct angestellt *prev;  
}xxx;

habe, dann mach ich ja einen Zeiger auf den Anfang deer Struktur
struct xxx *anfang
Nur wie mach ich nun ein neues element in die Liste und wie sprech ich ein einzelnes an?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 18. March 2005, 21:54 »
soweit ich das mit meinem schlechten C hinbekomme, musst du die struktur machen, die als typ definieren und damit eine variable erzeugen, und erst DANN hat diese variable die struktur. auf die struktur kannste keinen pointer setzen.

(sorry, wenns falsch ist, aber ich bin kein C-Profi!)
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

sp

  • Gast
Gespeichert
« Antwort #2 am: 18. March 2005, 22:32 »
Ist eigentlich ganz einfach, du musst den Pointer mit einer Adresse besetzten und dann den Struct mit Werten füllen.

Hier ein Beispiel:xxx.next = ( angestellt * ) 0x100;
xxx.next->wert = 12345;


Hoffe ich hab jetzt keinen Syntaxfehler eingebaut... :wink:

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #3 am: 18. March 2005, 23:11 »
Vorsicht Vorsicht !! Nich einfach irgendwelche Adressen setzen ^^.
Also Als erstes element machste erstma nen root Element, die Pointer mit 0 initialisieren..., und dann einfach immer die Elemente durch malloc dran hängen, am besten machst du das inner schleife die 1. immer das vorherige Element merkt und solang die Liste ab der Wurzel unteruscht bis 0 kommt und da dann ein neues Element dranhängt.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #4 am: 19. March 2005, 16:06 »
Hier mal Code von mir den ich immer wieder leicht modifiziert als verlinkte Liste benutze. Ist zwar C++ aber sollte man recht einfach in C umschreiben können bei bedarf.


#ifndef LINKEDLIST_H
#define LINKEDLIST_H

//###############################################################################

typedef struct _listitem
{
_listitem *pPrev;
void *pData;
_listitem *pNext;
}LISTITEM;

//###############################################################################

class CLinkedList
{
private:
LISTITEM *pFirst;
LISTITEM *pLast;

void DeleteAll();

public:
CLinkedList();
~CLinkedList();
void AddItem(LISTITEM *pItem);
void AddFirstItem(LISTITEM *pItem);
void RemoveItem(LISTITEM *pItem);

LISTITEM *GetNextItem() { return(this->pFirst); }

};

//###############################################################################

#endif



#include "stdafx.h"
#include "LinkedList.h"

//###############################################################################

CLinkedList::CLinkedList()
{
this->pFirst = NULL;
this->pLast = NULL;
}

//###############################################################################

CLinkedList::~CLinkedList()
{
if(this->pFirst != NULL)
this->DeleteAll();
}

//###############################################################################

void CLinkedList::AddItem(LISTITEM *pItem)
{
pItem->pNext = NULL;
pItem->pPrev = NULL;

if(this->pFirst == NULL)
{
this->pFirst = pItem;
this->pLast = pItem;
}
else
{
pItem->pPrev = this->pLast;
this->pLast->pNext = pItem;
this->pLast = pItem;
}
}

//###############################################################################

void CLinkedList::AddFirstItem(LISTITEM *pItem)
{
if(this->pFirst == NULL)
{
this->pFirst = pItem;
this->pLast = pItem;
}
else
{
pItem->pNext = this->pFirst;
this->pFirst->pPrev = pItem;
this->pFirst = pItem;
}
}

//###############################################################################

void CLinkedList::DeleteAll()
{
LISTITEM *pItem;

pItem = this->pFirst;

while(pItem != NULL)
{
if(pItem->pNext == NULL)
{
if(pItem->pData != NULL)
delete(pItem->pData);

delete(pItem);

break;
}
else
{
pItem = pItem->pNext;

if(pItem->pPrev->pData != NULL)
delete(pItem->pPrev->pData);

delete(pItem->pPrev);
}
}

this->pFirst = NULL;
this->pLast = NULL;
}

//###############################################################################

void CLinkedList::RemoveItem(LISTITEM *pItem)
{
if(pItem == this->pFirst)
{
this->pFirst = this->pFirst->pNext;

if(this->pFirst != NULL)
this->pFirst->pPrev = NULL;

if(pItem->pData != NULL)
delete(pItem->pData);

delete(pItem);

}
else if(pItem == this->pLast)
{
this->pLast = pItem->pPrev;
this->pLast->pNext = NULL;

if(pItem->pData != NULL)
delete(pItem->pData);

delete(pItem);
}
else
{
pItem->pPrev->pNext = pItem->pNext;
pItem->pNext->pPrev = pItem->pPrev;

if(pItem->pData != NULL)
delete(pItem->pData);

delete(pItem);
}
}

//###############################################################################
[/quote]
----------------------
Redakteur bei LowLevel

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 19. March 2005, 16:43 »
danke und @lobmann: Ich wollte die Liste für malloc verwnden und hab deswegen malloc noch net  :D

Nur noch eine kleine Frage: Wie kann man mit gcc C-code in ASM code umwandeln?

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #6 am: 19. March 2005, 19:35 »
gcc erzeugt keinen asm-code afaik. das wird direkt in opcodes uebersetzt.
\\o
o//
\o/

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 19. March 2005, 20:15 »
O___O wer erzählt den Scheiß...gcc erzeugt ASM-Code mit "-S" glaub ich oder so bekommst du den Output ist halt GAS

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #8 am: 20. March 2005, 19:53 »
Zitat von: Another Stupid Coder
O___O wer erzählt den Scheiß...gcc erzeugt ASM-Code mit "-S" glaub ich oder so bekommst du den Output ist halt GAS


echt? :o
wusste ich nicht :oops:
\\o
o//
\o/

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 20. March 2005, 21:23 »
Arghh...sorry, sollte nicht so agressiv sein...war nur gerade ziemlich grantig und ich hörte diese Meldung schon des Öfteren... Tut mir echt leid, bitte um Entschuldigung.

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #10 am: 21. March 2005, 12:01 »
Zitat von: Another Stupid Coder
Arghh...sorry, sollte nicht so agressiv sein...war nur gerade ziemlich grantig und ich hörte diese Meldung schon des Öfteren... Tut mir echt leid, bitte um Entschuldigung.


habs auch nicht aggressiv aufgefasst, mir wars nur peinlich  8)
\\o
o//
\o/

 

Einloggen