2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Связанные списки в Си
Сообщение22.09.2017, 17:33 
Аватара пользователя
После каждого прохода цикла должно выводится имя, оценка и если запись не одна то следующее имя оценка и т.д., но после ввода данных выводится лишь последнее имя и последняя оценка даже если до этого уже были введены данные. Ошибка или в неправильных указателях или цикле вывода на экран. Найти ее не получается уже битый час. Может кто увидит в чем проблема.
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct gradeNode {
    char lastName[20];
    float grade;
    struct gradeNode *nextPtr;
};
 
typedef struct gradeNode GRADENODE;
typedef GRADENODE *GRADENODEPTR;
 
int main ()
{
    char s[20]; /* массив для фамилий */
    float gr; /* оценка */
    int c = 1;
    GRADENODEPTR startPtr = NULL; /* указатель на начало списка */
    GRADENODEPTR newPtr = NULL; /* указатель на новый узел */
    GRADENODEPTR currentPtr = NULL; /* указатель на текущий узел */
    GRADENODEPTR previousPtr = NULL; /* указатель на предыдущий узел */
 
    while (c != -1)
    {
        printf ("Vvedite imya: ");
        scanf ("%s", s);
        printf ("Vvedite ocenky: ");
        scanf ("%f", &gr);
        newPtr = malloc (sizeof(GRADENODE));
            if (newPtr != NULL)
            {
                strcpy (newPtr->lastName, s);
                newPtr->grade = gr;
                newPtr->nextPtr = NULL;
 
            }
            else
                printf("oshibka");
            previousPtr = NULL;
            currentPtr = startPtr;
            while (currentPtr != NULL && s[0] > currentPtr->lastName[0])
            {
                previousPtr = currentPtr;
                currentPtr = currentPtr->nextPtr;
            }
 
            if (previousPtr == NULL)
            {
                newPtr->nextPtr = startPtr;
                startPtr = newPtr;
            }
            else
            {
                previousPtr->nextPtr = newPtr;
                newPtr->nextPtr = currentPtr;
            }
            while (startPtr != NULL)
            {
                printf("%s  %.2f -> ", startPtr->lastName, startPtr->grade);
                startPtr = startPtr->nextPtr;
            }
            printf("NULL\n");
            newPtr = NULL;
            previousPtr = NULL;
            currentPtr = NULL;
            printf("\nVvedite -1 esli hotite zakonchit");
            scanf ("%d", &c);
    }
    return 0;
}

 
 
 
 Re: Связанные списки в Си
Сообщение22.09.2017, 17:45 
startPtr нужно один раз присвоить, при добавлении самого первого элемента в список, а потом не менять, дабы он всегда указывал на первый элемент списка.
У вас же этот указатель меняется там, где не должен:
Используется синтаксис C
while (startPtr != NULL)
{
    printf("%s  %.2f -> ", startPtr->lastName, startPtr->grade);
    startPtr = startPtr->nextPtr;
}

 
 
 
 Re: Связанные списки в Си
Сообщение22.09.2017, 19:14 
Аватара пользователя
Спасибо, точно.

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group