Сделать на базе структуры линейный список С - 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 вызывается с указателем на голову списка и освобождает память, начиная с первого элемента списка (включая все его потомки)