2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Связанные списки в Си
Сообщение22.09.2017, 17:33 
Аватара пользователя


11/04/16
191
Москва
После каждого прохода цикла должно выводится имя, оценка и если запись не одна то следующее имя оценка и т.д., но после ввода данных выводится лишь последнее имя и последняя оценка даже если до этого уже были введены данные. Ошибка или в неправильных указателях или цикле вывода на экран. Найти ее не получается уже битый час. Может кто увидит в чем проблема.
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Заслуженный участник


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

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


11/04/16
191
Москва
Спасибо, точно.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group