Avatar billede tchami Nybegynder
22. oktober 2003 - 08:08 Der er 6 kommentarer og
1 løsning

ANSI C: Fejl i linked list

I mit forsøg på at lære C er jeg stødt ind i et problem med linked lists.

Når jeg starter mit program initialiserer jeg en linked list ud fra et array af structs, det ser også ud til at virke, men når jeg derefter forsøger at udskrive min liste får jeg en fejlrapport fra win xp der popper op. Det er selvfølgelig ikke meningen, men jeg kan simpelthen ikke se hvorfor.

Koden står herunder og så vidt jeg kan se er det i funktionen show_grade det går galt:

#include<stdio.h>
#include<stdlib.h>

struct node{
    char* name;
    int grade;
    struct node* next;
};

typedef struct node Node;

void makestartlist(Node * node);
void show_grade(Node * node);

main(){   

    int choice;
    char quit;
    Node * nodelist;
   
    //Make default linked list
    makestartlist(nodelist);

    do{
       
    // User-interface
        printf("*********MENU**********\n");
        printf("1. Show grade list\n");
        printf("7. Stop\n");       

        scanf("%d", &choice);

        switch (choice) {
       
        case 1 :
                show_grade(nodelist);
                break;
        case 7 :
                break;
        default :
                printf("Invalid input, would you like to quit (y/n)?");
               
                scanf("%s", &quit);

                if (quit != 'n' && quit != 'N')
                    choice = 7;               

                break;
        }


    } while(choice != 7);

}

void makestartlist(Node *node){

    int i;

    // Declare array of structs
    Node students[10] = {
        {"Lars",0},
        {"Bent",3},
        {"Hans",5},
        {"Lise",6},
        {"Lone",7},
        {"Inger",8},
        {"Bo",9},
        {"Else",10},
        {"Atli",11},
        {"Jens",13}
    };

    for (i=0; i<10 ;i++){
        node = (Node*)malloc(sizeof(Node)); //Allocate memory
        node -> name = students[i].name; //Add name
        node -> grade = students[i].grade; //Add grade
        node = node->next;
    }
}

void show_grade(Node * node){

    printf("Show grade list chosen\n");

    //Print linked list
    while(node != NULL){
        printf("Student: %s, Grade: %d\n", node->name, node->grade);
        node = node->next;
    }

}
Avatar billede arne_v Ekspert
22. oktober 2003 - 08:18 #1
Du får aldrig giver node->next'erne nogen værdi !
Avatar billede arne_v Ekspert
22. oktober 2003 - 08:22 #2
Prøv med:

Node *first=NULL,*parent=NULL;
for (i=0; i<10 ;i++){
        node = (Node*)malloc(sizeof(Node)); //Allocate memory
        if(i==0) first=node;
        node -> name = students[i].name; //Add name
        node -> grade = students[i].grade; //Add grade
        node -> next = NULL;
        if(i>0) parentnode->next = node;
        parent = node;
}
Avatar billede arne_v Ekspert
22. oktober 2003 - 08:24 #3
Hm. Ikke nok. Du skal også lave det om til:

Node *makestartlist() {
  ...
  return first;
}

og:

nodelist = makestartlist();
Avatar billede arne_v Ekspert
22. oktober 2003 - 08:37 #4
Iøvrigt er del vel ikke meget pointe i at lave en linked list udfra et array ?

Skulle data ikke læses fra fil eller lignende hvor antal var ukendt ?
Avatar billede arne_v Ekspert
22. oktober 2003 - 08:37 #5
Og lad os kalde det et svar.
Avatar billede tchami Nybegynder
22. oktober 2003 - 08:42 #6
Weee, det virker :)

Takker endnu endnu endnu engang for din hjælp :)

Smid et svar og pointene er dine.
Avatar billede tchami Nybegynder
22. oktober 2003 - 08:43 #7
Du har helt ret, der er ingen idé i det, men kunne jo lige så godt prøve at finde ud af hvordan de fungerede :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester