2009-06-15 16 views
1

Je crée une liste chaînée (de structs) en C, mais je veux être capable d'appeler une fonction et de lui ajouter 4-5 stucs à la liste. Le problème est qu'en C toutes les variables créées dans les fonctions sont laissées sur la pile/tas, je n'ai aucune idée de comment je suis censé accomplir cela.Problèmes avec une liste chaînée en C

Voici un exemple de code:

struct listItem 
{ 
    int value; 
    listItem *left; 
    listItem *right; 
} 

void addItems(listItem *l) 
{ 
    listItem one, two, three; 
    l->left = &one; 
    one.left = &two; 
    two.left = &three; 
} 

int main (char *a []) 
{ 
    listItem l; 
    addItems(l); 
} 

Il est évident que cela ne fonctionnera pas. Comment pourrais-je accomplir cela? Est-ce possible? Merci

EDIT: Wow merci à tous pour l'aide. C'était plus rapide et plus utile que je n'aurais pu l'imaginer!

Répondre

5

Vous devez allouer votre "un", "deux", "trois" avec malloc() au lieu de les créer sur la pile. Une fois que vous avez terminé avec eux, vous devrez parcourir la liste à nouveau et appelez free() sur la mémoire afin que votre programme ne fuit pas.

Essayez cette addItem à la place ...

void addItem(listItem *l, int value) 
{ 
    listItem* item = malloc (sizeof (listItem)); 
    item->value = value; 
    item->next = 0; 
    item->prev = l; // Probably not what you want, but you were only singly linking in the example 

    l->next = item; 
} 
3

Dans ce code:

void addItems(listItem *l) 
{ 
    listItem one, two, three; 
    l->left = &one; 
    one.left = &two; 
    two.left = &three; 
} 

Toutes les variables sont laissées sur la pile, et non le tas. Probablement que vous voulez les affecter sur le tas, de sorte que vous pouvez vous référer un pointeur à ceux qui ne sera pas invalide une fois que le cadre de pile est laissé:

void addItems(listItem *l) 
{ 
    listItem *one=calloc(1, sizeof(*one)), 
    two=calloc(1, sizeof(*two)), 
    three=calloc(1, sizeof(*three)); 
    l->left = one; 
    one.left = two; 
    two.left = three; 
} 
2

addItems() doit allouer de la mémoire:

void addItems(listItem *l) 
{ 
    listItem* one = (listItem*)malloc(sizeof(listItem)); 
    listItem* two = (listItem*)malloc(sizeof(listItem)); 
    listItem* three = (listItem*)malloc(sizeof(listItem)); 
    l->left = 0; 
    l->right = one; 
    one->left = l; 
    one->right = two; 
    two->left = one; 
    two->right = three; 
    three->left = two; 
    three->right = 0; 
} 

int main() 
{ 
    listItem l; 
    addItems(&l); 
} 

Je suppose que vous êtes en train de créer une liste double liée, donc je suis libre de régler les pointeurs gauche/droite en conséquence. Si je me trompe dans mes hypothèses, veuillez l'ajuster pour qu'il corresponde à vos besoins.

Cheers

Questions connexes