Структура и вопрос списка ссылок - PullRequest
0 голосов
/ 30 марта 2011

Я только что узнал, как использовать связанные списки в C. Все нормально, если я использую одну структуру, но у меня возникают проблемы, когда я использую две структуры для правильного разделения данных.У меня проблемы с распределением.Я использую Visual C ++ Express 2010, и вот весь код.Кто-нибудь может объяснить мне, что пошло не так?Большое спасибо.И это не домашнее задание.Я просто пытаюсь научиться этому дальше.

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

struct Student 
{
    char name[20];
    int num;

};

struct Node
{
    struct Student data;
    struct Node *next;
};


//void initList(struct Student **);
struct Node *createNode(struct Student );
void append(struct Node **, struct Student);
void traverse(struct Node *);
void destroyList(struct Node *);
int main()
{
    char choice = 'y';
    struct Student dat;
    struct Node *head;
    head = NULL;
    //struct Student *tmp;
    //initList(&head);
    char buff[20];
    while(choice != 'n')
    {
        scanf("%s %d", buff, &dat.num);
        strcpy(dat.name, buff);
        append(&head, dat);


        printf("\n\nWould you like to enter another?");
        fflush(stdin);
        scanf("%c", &choice);
    }

    traverse(head);
    destroyList(head);

    system("PAUSE");
    return 0;
}
/*
void initList(struct Student **list)
{
    *list = NULL;
}
*/
struct Node *createNode(struct Student dat)
{
    struct Node *temp;
    temp = (struct Node *)malloc(sizeof(Node));
    temp->data = dat;

    return temp;
}

void append(struct Node **pos, struct Student d)
{
    struct Node *node;
    node = createNode(d);

    if(*pos == NULL)
    {
        *pos = node;
    }
    else
    {
        struct Node *tmp;
        tmp = *pos;
        while(tmp->next != NULL)
        {
            tmp = tmp->next;
        }
        tmp->next = node;

    }
}

void traverse(struct Node *head)
{
    struct Node *tmp;
    for(tmp = head; tmp != NULL; tmp = tmp->next)
    {
        printf("\n %s %d\n\n", tmp->data.name, tmp->data.num);
    }

}
void destroyList(struct Node *list)
{
    if(list->next == NULL)
    {
        free(list);
    }
    else
    {
        destroyList(list->next);
        free(list);
    }
    printf("\n\nList has been destroyed.\n");
}

1 Ответ

4 голосов
/ 30 марта 2011

В createNode() вы должны установить элемент next в NULL; или даже в append(), если вам от этого легче:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...