Lowlevel

OffZone => Offtopic => Thema gestartet von: JG am 18. March 2005, 21:15

Titel: Doppelt verkettete Listen in C
Beitrag von: JG 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?
Titel: Doppelt verkettete Listen in C
Beitrag von: joachim_neu 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!)
Titel: Doppelt verkettete Listen in C
Beitrag von: sp 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:
Titel: Doppelt verkettete Listen in C
Beitrag von: lobmann 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.
Titel: Doppelt verkettete Listen in C
Beitrag von: TeeJay 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]
Titel: Doppelt verkettete Listen in C
Beitrag von: JG 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?
Titel: Doppelt verkettete Listen in C
Beitrag von: hannibal am 19. March 2005, 19:35
gcc erzeugt keinen asm-code afaik. das wird direkt in opcodes uebersetzt.
Titel: Doppelt verkettete Listen in C
Beitrag von: Another Stupid Coder 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
Titel: Doppelt verkettete Listen in C
Beitrag von: hannibal 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:
Titel: Doppelt verkettete Listen in C
Beitrag von: Another Stupid Coder 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.
Titel: Doppelt verkettete Listen in C
Beitrag von: hannibal 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)