Сделать на базе структуры линейный список С - 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;
- }
Объяснение кода листинга программы
В данном коде реализован линейный список, а точнее его часть - добавление элемента в начало списка и вывод списка на экран. Код выделяет память под новый элемент в куче, заполняет его данными и добавляет в начало списка. После чего выводит список на экран. В конце списка освобождается, начиная с первого элемента.
- Типизация структуры списка: структура
list
определена внутри файла и имеет два поля: data (тип int) и next (тип List*) - Создание пустого списка: переменная head инициализируется как NULL (указатель на пустую память)
- Вставка элемента в начало списка: функция Insert вызывается с указателем на голову списка и значением нового элемента
- Печать списка: функция Print вызывается с указателем на голову списка и выводит значение поля data каждого элемента списка
- Освобождение памяти: функция Free вызывается с указателем на голову списка и освобождает память, начиная с первого элемента списка (включая все его потомки)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д