Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » problem mit unidirektionaler liste...:/

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.06.2005, 22:27 Uhr
Solour



hi,

ist sicher blos ein kleiner fehler aber ich komme einfach net drauf...

die liste mit der ich arbeite...

C++:
struct pList{
    int pid;
    struct pList* nxt;
};

extern struct pList *procLst;


das einfügen eines elementes

C++:
struct pList* newElem= malloc( sizeof(struct pList) );
newElem->pid= cur_job;
newElem->nxt= procLst;
procLst= newElem;


das anzeigen der liste...

C++:
#ifdef DEBUG2
void printProcLst()
{
    struct pList *pl= procLst;
    fprintf(stderr, "[D*] %d: \n", procLst->pid);
    while((procLst= procLst->nxt)!=NULL)
        fprintf(stderr, "[D*] %d: \n", procLst->pid);
    procLst= pl;
}
#endif


das löschen eines elementes (hier geht was schief)

C++:
tmp= wait(NULL);
#ifdef DEBUG2
    fprintf(stderr, "[D] %d finished\n", tmp);
#endif            
/*    remove this process from list    */
#ifdef DEBUG2
    printProcLst();
    printProcLst();
#endif
if(procLst->pid==tmp)
{
    fprintf(stderr, "simp\n");
    struct pList *xprocLst= procLst;
    procLst= procLst->nxt;
    free(xprocLst);
}
else
{
    fprintf(stderr, "ELSE\n");
    procLst= procLst->nxt;
    struct pList* first= procLst;
    struct pList* prev= procLst;
    fprintf(stderr, "ELSE2\n");
    do{
        if(procLst == NULL)
            smoothExit(EXT_UNKNWON_PROC);
        fprintf(stderr, "ELSE3\n");
        if(procLst->pid == tmp)
        {
            fprintf(stderr, "ELSE4\n");
            prev->nxt= procLst->nxt;
            free(procLst);
            break;
        }else{
            prev= procLst;
            fprintf(stderr, "ELSE5\n");
        }
        fprintf(stderr, "ELSE6\n");
    }while((procLst= procLst->nxt)!=NULL);
    fprintf(stderr, "ELSE7\n");
    procLst= first;
}
#ifdef DEBUG2
    printProcLst();
#endif



hier nochmal die ausgabe,
[D] 4597 finished heißt, das 4597 aus der lsite entfernt werden soll
[D*] 4598:
[D*] 4597:
[D*] 4598:
[D*] 4597:
ist eine 2-malige ausgabe der liste (die ausgabe scheint nix an der liste zu ändern)
ELSE
ELSE2
ELSE3
ELSE4
ELSE7
um zu löschen wird dieser weg verfolgt
12 12 95 eine asynchrone einmischung...(nicht wichtig(ist der prozess 4598 der auch gleich fertig ist...(wc)))
[D*] 4597:
eine einmalige ausgabe der liste (HIER SCHON FALSCH!! das falsche ist entfernt)
darunter kommt dann ne segfault, aber das interesseirt mich schon kaum noch, würde sich schon von selbst lösen denk ich, wenn der obige fehler weg wäre...

Code:
> ls|wc
[D] 4597 finished
[D*] 4598:
[D*] 4597:
[D*] 4598:
[D*] 4597:
ELSE
ELSE2
ELSE3
      12      12      95
ELSE4
ELSE7
[D*] 4597:
[D] 4598 finished
[D*] 4597:
[D*] 4597:
ELSE
ELSE2
[Error] unknwon process
ELSE3
Segmentation Fault



mfg Sven

Dieser Post wurde am 02.06.2005 um 22:28 Uhr von Solour editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.06.2005, 23:58 Uhr
Solour



habs jetzt mit nem array gelöst, aber die lösung wäre trotzdem gut zu wissen..:p
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.06.2005, 09:41 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


normalerweise macht man listen so das man ein head-element hat ("root" und ein laufendes. so kann man vom start aus die teile immer durchgehen. ansonsten würde ich sagen fügst du die neuen elemente immer "davor" ein, und nicht danach.


C++:
struct pList* newElem= malloc( sizeof(struct pList) );
newElem->pid= cur_job;
newElem->nxt= procLst;
procLst= newElem;



wenn du vorher

A

hattest, hast du nachher

B A

und nicht

A B

würde es eher so machen:


C++:
struct pList* newElem= malloc( sizeof(struct pList) );
newElem->pid= cur_job;
newElem->prev = procLst;
procLst->nxt= newElem;
procLst = newElem;


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.06.2005, 17:45 Uhr
Solour



mhh procLst steht für procList und nicht für procLast, ich glaub das hast du falsch verstanden
ansonsten baust du ja auch nur ne doppelt verkette liste auf statt einer einfach verketteten...
und das kann ja nun nicht wirklich ein problem lösen?

bis dann
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.06.2005, 18:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja ne einfache kette wär sowas:


C++:
struct Glied {
  int data;
  Glied *next;
} *wurzel, *current, *temp;

wurzel = new Glied;
wurzel->data = 0;
current = wurzel;

// hinzufügen:
temp = new Glied;
temp->data = 1;
current->next = temp;
current = temp;

// entfernen
current = wurzel;
temp = wurzel;
while ( current = current->next)
{
  if(current->data == 1) // unser gewünschtes element löschen
  {
    if(current->next)
      temp->next = current->next;
    delete current;
    current = temp;
  }
  temp = current;
}



ok ist jetzt nicht optimiert, kann man sicherlich noch etwas optimieren das löschen, aber so im großen und ganzen geht das ...

das temp-obj kann man sich beim löschen sparen wenn man ne doppelt-verkettete hat, also ein pointer auch aufs vorherige feld hat
--
class God : public ChuckNorris { };

Dieser Post wurde am 03.06.2005 um 18:02 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.06.2005, 23:42 Uhr
~Gast
Gast


Hallo Solour

ich bin mal so drüber geflogen.
das hier macht mich stutzig:


C++:
...
else
{
    fprintf(stderr, "ELSE\n");
    procLst= procLst->nxt; // ??????????????????????????
    struct pList* first= procLst;
    struct pList* prev= procLst;
    fprintf(stderr, "ELSE2\n");
...



vielleicht hilft es dir ja.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: