16. november 2003 - 16:15
Der er
6 kommentarer og 1 løsning
Fejl i dobbelthætet liste i C
Newbie spørgsmål... Jeg forsøger at lave en dobbelthægtet liste i Borland C; det compilerer godt nok men fungerer ikke. Jeg har kigget på de andre eksempler her på sitet, men kan ikke lige finde ud af, hvorfor nedenstående ikke virker. Det ser ud til at linien "pNavHistory = pNav;" ikke fungerer efter hensigten - den bliver NULL. Men hvorfor? // // egp.h (udsnit) // struct NavHistoryStruct { byte bFormat; struct NavHistoryStruct *pPrevious; struct NavHistoryStruct *pNext; }; typedef struct NavHistoryStruct * PNavHistory; extern PNavHistory pNavHistory = NULL; //////////////////////////////////////// // // egp.c (udsnit) // void NavHistoryPush(short sFormat) { PNavHistory pNav; if(!(pNavHistory)) { pNav = malloc(sizeof(PNavHistory)); pNav->pNext = NULL; } else if(pNavHistory->pNext == NULL) { pNav = malloc(sizeof(PNavHistory)); pNav->pNext = NULL; } else pNav = (pNavHistory->pNext); pNav->bFormat = sFormat; pNav->pPrevious = pNavHistory; pNavHistory = pNav; bNavCallback = FALSE; NavUpdButtons(); } void NavHistoryNext() { if(!(pNavHistory->pNext)) return; pNavHistory = (pNavHistory->pNext); NavUpdButtons(); } void NavHistoryPrevious() { if(!(pNavHistory->pPrevious)) return; pNavHistory = (pNavHistory->pPrevious); NavUpdButtons(); }
Annonceindlæg fra DE-CIX
16. november 2003 - 17:07
#1
Jeg kan ihvertfald se en ting der kunne være galt. Jeg er ret sikker på at: pNav = malloc(sizeof(PNavHistory)); skal være: pNav = malloc(sizeof(NavHistoryStruct));
16. november 2003 - 17:10
#2
Jeg forstå heller ikke logikken i NavHistoryPush. Den kan da ikke opdatere en linked liste !?
16. november 2003 - 18:07
#3
Hvis jeg ændrer til malloc(sizeof(struct NavHistoryStruct)) kan jeg godt oversætte, men det hjælper ikke på problemet. pNavHistory bliver stadig NULL. Formålet med NavHistoryPush er at oprette en nyt element i listen, hvis vi er ved det sidste element, ellers skal det aktuelle element opdateres. Måske er det ikke lige dét, den gør... :o/
16. november 2003 - 21:03
#4
Det tror jeg ikke. Når man skal indsætte i en dobbelt linked liste så skal man opdatere både prev og next.
16. november 2003 - 21:09
#5
Muligvis vil det forvirre mere end forklare men jeg lavede det her eksmepel for en måneds tid siden: #include <stdio.h> #include <stdlib.h> struct node { char *name; int val; struct node *next; }; void add(struct node **first, char *name, int val) { struct node *extra,*last; extra = (struct node *)malloc(sizeof(struct node)); extra->name = name; extra->val = val; extra->next = NULL; if(*first==NULL) { *first = extra; } else { last = *first; while(last->next!=NULL) last=last->next; last->next = extra; } } void print(struct node *first) { struct node *curr; printf("----------------\n"); curr = first; while(curr!=NULL) { printf("%s %d\n",curr->name,curr->val); curr = curr->next; } printf("----------------\n"); } void sort(struct node **first) { struct node *p1,*p2,*pp1,*pp2,*temp; p1 = *first; pp1 = NULL; while(p1!=NULL) { pp2 = p1; p2 = p1->next; while(p2!=NULL) { if(p2->val < p1->val) { /* swap pointers */ temp = p2; p2 = p1; p1 = temp; /* update next pointers */ if(p2->next!=p1) { temp = p2->next; p2->next = p1->next; p1->next = temp; pp2->next = p2; } else { p2->next = p1->next; p1->next = p2; } if(pp1==NULL) { *first = p1; } else { pp1->next = p1; } } pp2 = p2; p2 = p2->next; } pp1 = p1; p1 = p1->next; } } int main() { struct node *first = NULL; add(&first, "a", 111); add(&first, "bb", 22); add(&first, "ccc", 3); printf("usorteret:\n"); print(first); sort(&first); printf("sorteret:\n"); print(first); add(&first, "d", 4); add(&first, "e", 5); printf("usorteret:\n"); print(first); sort(&first); printf("sorteret:\n"); print(first); return 0; }
16. november 2003 - 22:38
#6
Tak for indsatsen, arne_v; det ser ud til at det egentlige problem var, at den globale variabel pNavHistory var defineret extern i stedet for static...?
17. november 2003 - 11:13
#7
Sådan her skal NavHistoryPush() se ud (ud over at pNavHistory skal være defineret som static) for at det virker: VOID NavHistoryPush(SHORT sFormat) { PNavHistory pNav; if(!(pNavHistory)) { pNav = (struct PNavHistory *)malloc(sizeof(PNavHistory)); pNav->pNext = NULL; } else if(pNavHistory->pNext == NULL) { pNav = (struct PNavHistory *)malloc(sizeof(PNavHistory)); pNav->pNext = NULL; pNavHistory->pNext = pNav; } else pNav = (pNavHistory->pNext); pNav->bFormat = sFormat; pNav->pPrevious = pNavHistory; pNavHistory = pNav; NavUpdButtons(); }
Kurser inden for grundlæggende programmering