С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 02.10.2020
Сообщений: 88

Обработка динамических структур

06.07.2021, 09:35. Показов 4978. Ответов 5

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, в чем ошибка? Выводит только последний пункт списка.


Задание:

Реализовать заданную структуру данных. Для каждой структуры данных реализовать операции создания и удаления всего списка, а также добавления и удаления узлов.
Все манипуляции со списками необходимо выполнять через манипуляции с указателями, то есть если необходимо переставить местами два узла в списке, то следует соответствующим образом перевести указатели.
Описать структуру Worker, содержащую следующие поля: фамилия и инициалы работника; название занимаемой должности; год поступления на работу.
Написать программу, выполняющую следующие действия:
- упорядочить записи в алфавитном порядке;
- вывести информацию о работниках, чей стаж работы превышает значение, введенное с клавиатуры;
- если таких работников нет, вывести соответствующее сообщение.


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include"math.h"
#include "conio.h"
#include "stdio.h"
#include "locale.h"
#include "windows.h"
#include "string.h"
#include "time.h"
#include <tchar.h>
 
 
int n;
#pragma warning(disable : 4996)
 
 
typedef struct Node
{
char type[20];//F
    char pe[10];//IO
    char name[20];//название 
    int year; //год 
    struct Worker* next;
} Worker;
struct Node* head;
void vivod(Worker* h) {
    Worker* tmp = (Worker*)malloc (sizeof(Worker));
    tmp = h;
    for (int i = 0; i < n; i++)
    {
        printf("%s %s %s %d\n", tmp->type, tmp->pe, tmp->name, tmp->year);
        tmp = tmp->next;
    }
    getch();
}
Worker* Add(char* type, char* pe, char* name, int year)
{
    Worker* tmp = (Worker*)malloc(sizeof(Worker));
    strcpy(tmp->type, type);
    strcpy(tmp->pe, pe);
    strcpy(tmp->name, name);
    tmp->year = year;
    n++;
    return tmp;
}
Worker* copy(Worker* t1, Worker* t2) {
    Worker* p = (Worker*)malloc(sizeof(Worker));
    p = t1;
    p->next = t2;
    return p;
 }
void vivod_god(Worker* h) {
    int e;
    int k = 0;
    printf("year:\t");
    scanf("%d", &e);
    Worker* tmp =(Worker*) malloc(sizeof(Worker));
    tmp = h;
    while (tmp->next != 0) {
        if (e == tmp->year) {
            printf("%s %s %s %d\n", tmp->type, tmp->pe, tmp->name, tmp->year);
            k++;
        }
        tmp = tmp->next;
    }
    if (k == 0) printf("Таких годов нет");
    system("pause");
}
void form(FILE* f) {
    char type[20];
    char pe[10];
    char name[20];
    int year;
    while (!feof(f)) {
        if (!feof(f)) {
            fscanf(f, "%s %s %s %d", &type, &pe, &name, &year);
            head = Add(type, pe, name, year);
        }
    }
}
void dobavlen(Worker* h) {
    char type[20];
    char pe[10];
    char name[20];
    int year;
    printf("Введите данные\n");
    printf("Фамилия:"); scanf("%s", &type);
    printf("Инициалы:"); scanf("%s", &pe);
    printf("Название должности:"); scanf("%s", &name);
    printf("Год:"); scanf("%d", &year);
    head= Add(type, pe, name, year);
}
void main() {
    setlocale(LC_ALL, "Russian");
        head = NULL;
        int g;
        FILE* f;
        f = fopen("fole.txt", "r");
        do {
            printf("Выберите действие, колторое вы хотите совершить с данными:\n");
            printf("1-Вывести\n");
            printf("2-Вывести года больше заданного\n");
            printf("3-Добавление\n");
            printf("0-Вывод\n");
 
            scanf("%d", &g);
            switch (g)
            {
            case 1: {form(f); vivod(head); break; }
            case 2: {vivod_god(head); break; }
            case 3: dobavlen(head); break;
            }
    
            
        } while (g != 0);
}





Текст в файле:

Сорина ВА Секретарь 2009
Афонасьев Р.Л. Директор 2004
Болина Р.Ж. Бухгалтер 2018
Суриков Д.Р. Менеджер 2016
Ципко Г.З. Менеджер 2021
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.07.2021, 09:35
Ответы с готовыми решениями:

Создание и обработка структур(ошибка)
Требуется составить программу обработки данных. tab(i,1) – табельный номер i- го сотрудника, tab(i,2) – фамилия, имя, отчество...

Обработка структур. Таблица (ошибка)
При компиляции данного кода возникает ошибка: Program received signal SIGSEGV, Segmentation fault. In ungetwc ()...

обработка динамических структур
Помогите пожалуйста, я написал программу по заданию: Тема:Обработка динамических структур данных Задание: Обработка данных по...

5
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,023
06.07.2021, 10:36
Цитата Сообщение от julity Посмотреть сообщение
int n;
неинициализированная переменная.
Также смотри предупреждения компилятора - там много интересного написано

Добавлено через 6 минут
Цитата Сообщение от julity Посмотреть сообщение
while (!feof(f)) {
        if (!feof(f)) {
это тоже неверно. Флаг проверяется после чтения, а не до

Добавлено через 7 минут
Цитата Сообщение от julity Посмотреть сообщение
Worker* tmp = (Worker*)malloc (sizeof(Worker));
а тут утечка памяти. И непонятно, зачем тут память вообще выделяется
0
124 / 44 / 15
Регистрация: 01.11.2020
Сообщений: 122
06.07.2021, 13:09
Лучший ответ Сообщение было отмечено julity как решение

Решение

Исправил некоторые ошибки .
int main вместо void main.
были неверные спецификаторы типа в printf , fscanf, scanf.
не было проверки на открытие файла ,

Функции vivod_god и copy убрал. Не понял что они делают .

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
int n;
 
 
typedef struct Node
{
    char type[20];//F
    char pe[10];//IO
    char name[20];//название
    int year; //год
    struct Node* next;
} Worker;
 
 
void vivod(Worker* h) {
 
   while (h != NULL)
    {
        printf("%s %s %s %d\n", h->type, h->pe, h->name, h->year);
        h = h->next;
    }
    getchar();
}
Worker* createWorker(char* type, char* pe, char* name, int year)
{
    Worker* tmp = (Worker*)malloc(sizeof(Worker));
    strcpy(tmp->type, type);
    strcpy(tmp->pe, pe);
    strcpy(tmp->name, name);
    tmp->year = year;
    tmp->next = NULL;
    n++;
    return tmp;
}
 
void form(FILE* f,Worker** head) {
    char type[20];
    char pe[10];
    char name[20];
    int year;
    while (4 ==  fscanf(f, "%s %s %s %d", type, pe, name, &year))
       {
        Worker * worker= createWorker(type, pe, name, year);
 
        if(*head==NULL)
             *head=worker;
               else
           {
                worker->next = *head;
                *head = worker;
        }
    }
}
void dobavlen(Worker** head) {
    char type[20];
    char pe[10];
    char name[20];
    int year;
    printf("Введите данные\n");
    printf("Фамилия:");
    scanf("%s", type);
    printf("Инициалы:");
    scanf("%s", pe);
    printf("Название должности:");
    scanf("%s", name);
    printf("Год:");
    scanf("%d", &year);
 
    Worker * worker= createWorker(type, pe, name, year);
    if(*head==NULL)
         *head=worker;
           else
       {
            worker->next = *head;
            *head = worker;
    }
}
 
 
int main() {
    setlocale(LC_ALL, "Russian");
   Worker* head = NULL;
    int g = 0;
    FILE* f = NULL;
    f = fopen("/home/evg/QtProjects/c_proj1/fole.txt", "r");
    if(! f)
    {
        printf("Не удалось открыть файл.\n");
        return -1;
    }
 
    form(f, &head);
 
    do {
        printf("Выберите действие, колторое вы хотите совершить с данными:\n");
        printf("1-Вывести\n");
        printf("2-Вывести года больше заданного\n");
        printf("3-Добавление\n");
        printf("0-Выход\n");
 
        scanf("%d", &g);
        switch (g)
        {
        case 1: { vivod(head); break; }
        //case 2: {vivod_god(head); break; }
        case 3: dobavlen(&head); break;
        }
 
 
    } while (g != 0);
}
Добавлено через 10 минут
Цитата Сообщение от Алексей1153 Посмотреть сообщение
int n;
неинициализированная переменная.
глобальная, не страшно.
1
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,023
06.07.2021, 13:14
stepForward, а мне страшно

а ещё вопрос, зачем эта переменная глобальная, да ещё с таким именем.

Кстати, вот тут я бы сделал так
Цитата Сообщение от stepForward Посмотреть сообщение
typedef struct Worker
{
    char type[20];//F
    char pe[10];//IO
    char name[20];//название
    int year; //год
    struct Worker* next;
} Worker;
1
124 / 44 / 15
Регистрация: 01.11.2020
Сообщений: 122
06.07.2021, 13:20
страшно это хорошо. согласен . стараюсь всегда присваивать начальные значения.
0
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
06.07.2021, 14:41
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это тоже неверно. Флаг проверяется после чтения, а не до
А еще двойная проверка: Все что выполняется в теле if выполняется только если для while условие истинное. В тело if мы не заходим если только не заходим в тело while, так что if можно вообще убрать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.07.2021, 14:41
Помогаю со студенческими работами здесь

Формирование, сортировка и обработка динамических структур данных.
Требуется решить задачу формирования, сортировки и обработки динамических структур данных. Требуется создать динамический массив...

Обработка линейных динамических структур, Двоичные файлы
Эта программа принимает значение о товаре(название, фирму, дату и цену) и выводит всё это по цене, которую ты ввел. А как можно сделать...

Поиск инфы обработка текстовой информации,формирование и обработка динамических массивов
Изучить работу с виртуальной памятью, проекциями файлов. обработку текстовой информации,работа с кучей. формирование и обработка...

Структуры.Обработка массивов структур.Создать массив структур из 10-ти элементов
Создать массив структур из 10-ти элементов: &lt;Номер договора&gt;&lt;Фамилия клиента&gt;&lt;стоимость товара&gt;&lt;выплаченная сумма&gt; ...

Массив Динамических Структур
Нужно объявить динамический массив этой структуры ABC*T_uzel= new T_uzel(*NE*NE)]; Элементы этого массива будут присваиваться разными...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru