Сделать на базе структуры линейный список С - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Приветствую! Начинающий программист, поставлена задача и имеется ее решение в виде простой структуры: Выполнить задание с использованием динамической структуры данных типа

линейный список

. В файле содержится следующая информация (список) о студентах: -Ф.И.О.; -год рождения; -оценки на экзаменах по 4 предметам. ------------------------------------- ИВАНОВ А.И. 1972 5 4 3 3 СИДОРОВ И.А. 1976 5 5 5 5 И тд. Составить программу, которая должна выполнять считывание информации о студентах, выборку и обработку информации, запись обработанной информации в файл вывода. Информация должна содержать количество и список студентов, имеющих: Средний балл не ниже 4,5 и год рождения не старше 1975. Имеется код решения этой задачи с использованием структуры и массива. Помогите, пожалуйста, сделать линейный список из этого! Я с указателями и списками совсем запутался, ничего не получается.
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{
    struct LIST {
        char fio[11];
        char Ns[5];
        unsigned year;
        int ocn[4];
        float sr;
    };
    LIST Student[30];
    float socen = 4.5;
    int i = 0, j, N, k = 0;
    FILE*f_in, *f_out;
    f_in = fopen("in.txt", "r");
    f_out = fopen("out.txt", "w");
    for (i = 0; i < 10; i++)
    {
        fscanf(f_in, "%s %s %i %i %i %i %i\n",
            &Student[i].fio,
            &Student[i].Ns,
            &Student[i].year,
            &Student[i].ocn[1],
            &Student[i].ocn[2],
            &Student[i].ocn[3],
            &Student[i].ocn[4]);
    }
    for (i = 0; i < 10; i++)
    {
        fprintf(f_out, "%s %s %i %i %i %i %i\n",
            Student[i].fio,
            Student[i].Ns,
            Student[i].year,
            Student[i].ocn[1],
            Student[i].ocn[2],
            Student[i].ocn[3],
            Student[i].ocn[4]);
    }
    N = 10;
    for (j = 0; j < N; j++)
    {
        Student[j].sr = float(Student[j].ocn[1] + Student[j].ocn[2] + Student[j].ocn[3] + Student[j].ocn[4]) / 4;
    }
    fprintf(f_out, "Список студентов средний балл которых не ниже");
    fprintf(f_out, "%6.2f\n", socen);
    fprintf(f_out, "и год рождения не старше 1975 ");
    for (j = 0; j<N; j++) {
        if ((Student[j].sr >= socen) && (Student[j].year >= 1975))
        {       k += 1;
        fprintf(f_out, "\n Студент %s %s %i года рождения имеет средний балл %5.2f", Student[j].fio, Student[j].Ns, Student[j].year, Student[j].sr);
        }
    }
    fprintf(f_out, "\n Всего таких студентов в списке - %i", k);
    getch();
    return 0;
}
Помогите, пожалуйста, товарищи!!! Мозги кипят, я не понимаю как сделать список!!! Помогите, не бросайте, сил уже нет, 3 недели бьюсь. Хотя бы какую-то структуру кода напишите что б я дописал сам! Намекните, что делать.

Решение задачи: «Сделать на базе структуры линейный список С»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
typedef struct list
{
    int data;
    struct list *next;
} List;
 
 
void Insert(List **head, const int x)
{
    List *cur = *head;
    if (*head)
        Insert(&(*head)->next, x);
    else
    {
        *head = malloc(sizeof(List));
        (*head)->data = x;
        (*head)->next = cur;
    }
}
 
void Print(const List *head)
{
    while (head)
    {
        printf("%d\n", head->data);
        head = head->next;
    }
}
 
void Free(List *head)
{
    if (head)
        Free(head->next);
    free(head);
}
 
int main(void)
{
    List *head = NULL;
    Insert(&head, 2);
    Insert(&head, 4);
    Insert(&head, 3);
    Insert(&head, 1);
    Insert(&head, 5);
    Print(head);
    Free(head);
    return 0;
}

Объяснение кода листинга программы

В данном коде реализован линейный список, а точнее его часть - добавление элемента в начало списка и вывод списка на экран. Код выделяет память под новый элемент в куче, заполняет его данными и добавляет в начало списка. После чего выводит список на экран. В конце списка освобождается, начиная с первого элемента.

  1. Типизация структуры списка: структура list определена внутри файла и имеет два поля: data (тип int) и next (тип List*)
  2. Создание пустого списка: переменная head инициализируется как NULL (указатель на пустую память)
  3. Вставка элемента в начало списка: функция Insert вызывается с указателем на голову списка и значением нового элемента
  4. Печать списка: функция Print вызывается с указателем на голову списка и выводит значение поля data каждого элемента списка
  5. Освобождение памяти: функция Free вызывается с указателем на голову списка и освобождает память, начиная с первого элемента списка (включая все его потомки)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.455 из 5
Похожие ответы