Lowlevel
OffZone => Offtopic => Thema gestartet 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?
-
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!)
-
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:
-
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.
-
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]
-
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?
-
gcc erzeugt keinen asm-code afaik. das wird direkt in opcodes uebersetzt.
-
O___O wer erzählt den Scheiß...gcc erzeugt ASM-Code mit "-S" glaub ich oder so bekommst du den Output ist halt GAS
-
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:
-
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.
-
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)