Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 20.04.2022
Сообщений: 21

Сокращение кода

15.12.2022, 12:01. Показов 1323. Ответов 7

Студворк — интернет-сервис помощи студентам
Добрый день. Уважаемое сообщество у меня есть вопрос.
Я бы хотел сократить код в main - убрать "stack = ".
Каким образом это возможно сделать?
Буду благодарен возможным примерам.

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
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
#define MAX_STACK_SIZE 1024
#define SUCCESS 0
#define MEMORY  1
 
int error = SUCCESS;
 
struct stack_i {
    int data;
    int priority;
    struct stack_i *next;
};
 
struct stack_i* s21_push_stack_i(struct stack_i* root, int dat, int prior) {
    if (root == NULL) {
        root = (struct stack_i*) malloc (sizeof(struct stack_i));
        if (root != NULL) {
            root -> data = dat;
            root -> priority = prior;
            root -> next = NULL;
        } else {
            error = MEMORY;
        }
    } else {
        struct stack_i* buffer = (struct stack_i*) malloc (sizeof(struct stack_i));
        if (buffer != NULL) {
            buffer -> data = dat;
            buffer -> priority = prior;
            buffer -> next = NULL;
            buffer -> next = root;
            root = buffer;
        } else {
            error = MEMORY;
        }
    }
    return root;
}
 
void s21_print_stack_i(struct stack_i* root) {
    struct stack_i* buffer = root;
    while (buffer != NULL) {
        printf("data - %d\t", buffer -> data);
        printf("priority - %d\n", buffer -> priority);
        buffer = buffer -> next; 
    }    
}
 
int main(int argc, char* argv[]) {
    struct stack_i* stack;
    stack = s21_push_stack_i(stack, 1, 1);
    stack = s21_push_stack_i(stack, 2, 3);
    stack = s21_push_stack_i(stack, 0, 1);
    s21_print_stack_i(stack);
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2022, 12:01
Ответы с готовыми решениями:

Сокращение кода
Есть задача: Я решил таким способом: #include &lt;fstream&gt; int N,i,x,t,k,j,*G; main() { std::fstream...

Сокращение кода
Я учусь сокращать код на С++, для решения олемпиадных задач. (только пока еще простые задачки) Условие задачи: Сбор черники ...

Сокращение кода
Всем привет! Ребят, возникла мелкая проблема. Написал программку человеку, он начал сдавать ее преподу. Та не приняла, сославшись, что код...

7
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
15.12.2022, 13:42
Подредактировал твоё.
Ничего не проверял - могут быть ошибки.

По хорошему надо ещё сделать освобождение памяти, выделенной под стек - мне лень.
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
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
#define MAX_STACK_SIZE 1024
#define SUCCESS 0
#define MEMORY  1
 
int error = SUCCESS;
 
struct stack_i {
    int data;
    int priority;
    struct stack_i *next;
};
 
 
struct stack_i* head = NULL; /* вершину стека делаем глобальной */
 
/* избавляемся от необходимости передавать и возвращать вершину стека в функциях */
void s21_push_stack_i(int dat, int prior) {
    if (head == NULL) {
        head = (struct stack_i*) malloc (sizeof(struct stack_i));
        if (head != NULL) {
            head -> data = dat;
            head -> priority = prior;
            head -> next = NULL;
        } else {
            error = MEMORY;
        }
    } else {
        struct stack_i* buffer = (struct stack_i*) malloc (sizeof(struct stack_i));
        if (buffer != NULL) {
            buffer -> data = dat;
            buffer -> priority = prior;
            buffer -> next = NULL;
            buffer -> next = head;
            head = buffer;
        } else {
            error = MEMORY;
        }
    }
}
 
void s21_print_stack_i() {
    struct stack_i* buffer = head;
    while (buffer != NULL) {
        printf("data - %d\t", buffer -> data);
        printf("priority - %d\n", buffer -> priority);
        buffer = buffer -> next; 
    }    
}
 
int main(int argc, char* argv[]) {
    s21_push_stack_i(1, 1);
    s21_push_stack_i(2, 3);
    s21_push_stack_i(0, 1);
    s21_print_stack_i();
    return 0;
}
1
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
15.12.2022, 14:29
Лучший ответ Сообщение было отмечено z1run как решение

Решение

Цитата Сообщение от z1run Посмотреть сообщение
Я бы хотел сократить код в main
Тут есть что сократить и помимо main.
Цитата Сообщение от z1run Посмотреть сообщение
C
1
2
buffer -> next = NULL;
buffer -> next = root;
Зачем 2 раза подряд присваивать значение одной переменной? Первая строка лишняя.
Цитата Сообщение от z1run Посмотреть сообщение
if (root == NULL) {
Тебе не нужно проверять пустой ли стек при вставке. Если он NULL, то он так и проставится.
Цитата Сообщение от z1run Посмотреть сообщение
C
1
2
3
4
5
struct stack_i {
 int data;
 int priority;
 struct stack_i *next;
};
Если добавить typedef, то можно не писать каждый раз struct.
C
1
2
3
4
5
typedef struct stack_i {
    int data;
    int priority;
    struct stack_i *next;
} stack_i;
Т.О. если применить эти ремарки, то получаем такую функфию вставки
C
1
2
3
4
5
6
7
8
9
10
11
12
13
stack_i* s21_push_stack_i(stack_i* root, int dat, int prior) {
    stack_i* buffer = (stack_i*) malloc (sizeof(stack_i));
 
    if (buffer) {
        buffer -> data = dat;
        buffer -> priority = prior;
        buffer -> next = root;
        root = buffer;
    } 
    else error = MEMORY;
 
    return buffer;
}
Цитата Сообщение от z1run Посмотреть сообщение
Я бы хотел сократить код в main - убрать "stack = ".
Можешь передавать в функцию &stack, правда ее придется немного переписать. Но с другой стороны "stack =" даже логичнее получается. У тебя ведь указатель стека меняется? Меняется.
2
1 / 1 / 0
Регистрация: 20.04.2022
Сообщений: 21
15.12.2022, 14:55  [ТС]
Цитата Сообщение от assemberist Посмотреть сообщение
У тебя ведь указатель стека меняется? Меняется.
Хмм. А я про это даже не подумал. Привык к С++ и хотел сделать по их примеру. Но если взглянуть со стороны логики то и вправду это лишнее.
Благодарю

Добавлено через 2 минуты
Цитата Сообщение от drfaust Посмотреть сообщение
Подредактировал твоё.
Мне не хотелось бы выделять глобальную переменную. Я больше сторонник ограниченой видимости в пределах блока где объявлен стек(свои соображения). Спасибо за ответ.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
15.12.2022, 15:08
Цитата Сообщение от assemberist Посмотреть сообщение
Можешь передавать в функцию &stack, правда ее придется немного переписать.
По мне так именно так как раз и логичнее делать:
1. Нет необходимости объявлять стек как глобальную.
2. Появляется возможность работать с несколькими однотипными стеками одними и теми же функциями.

Добавлено через 6 минут
Цитата Сообщение от z1run Посмотреть сообщение
Мне не хотелось бы выделять глобальную переменную.
Сложно угадать уровень постящего. Мне показалось, что новичок просто хочет что-то сделать с чужим кодом, потому и взял за основу то, что уже было.
0
1 / 1 / 0
Регистрация: 20.04.2022
Сообщений: 21
15.12.2022, 17:16  [ТС]
Цитата Сообщение от drfaust Посмотреть сообщение
Сложно угадать уровень постящего
Тут скорее хочется в тонкости языка, влезть и понять некоторые моменты на более низком уровне. Я до этого на С++ работал. Когда продвинулся в изучении шаблонов, понял что язык достаточно абстрактен. Начал понимать, что надо изучать внутренние процессы и решил начать с Си. Вот тут и начали возникать вопросы. Плюс интересно посмотреть как мыслят другие.

В качестве примера вот возьмем работу с памятью. Очень много вопросов возникает связанные с передачей данных в блок функции по ссылке или по указателю. Если выделить динамически память для структуры то как лучше ее передать в функцию, как эффективнее сделать без прочего копирования и так далее, как безопаснее.

За себя скажу уверенный джун)

Добавлено через 47 секунд
Цитата Сообщение от assemberist Посмотреть сообщение
Зачем 2 раза подряд присваивать значение одной переменной? Первая строка лишняя
Ну и да местами туплю)
0
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
15.12.2022, 19:27
Цитата Сообщение от z1run Посмотреть сообщение
передачей данных в блок функции по ссылке или по указателю
В си вроде нет ссылок, тут приходится строить логику на указателях.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
16.12.2022, 05:58
Цитата Сообщение от z1run Посмотреть сообщение
В качестве примера вот возьмем работу с памятью. Очень много вопросов возникает связанные с передачей данных в блок функции по ссылке или по указателю. Если выделить динамически память для структуры то как лучше ее передать в функцию, как эффективнее сделать без прочего копирования и так далее, как безопаснее.
В Си нет ссылок. Передача параметров в функции либо по указателю, либо по значению.
Если требуется выделять память под что-то (строка, структура и т.п.), то лучше делать это там, где она и будет потом освобождаться - меньше граблей. Подходов много и разных. В любом случае надо рассматривать проблему в комплексе.

На примере этих стеков - уже есть утечка памяти - всё что выделяется под стек нигде не освобождается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2022, 05:58
Помогаю со студенческими работами здесь

Сокращение кода
Думаю, многие, кто занимался олимпиадным программированием, знакомы с сайтом acmp.ru. И думаю многие знают, что чем короче код, тем круче...

Сокращение кода и времени проверки (задача)
Однажды Вася очень долго просидел на остановке, прежде чем дождался своего автобуса. Чтобы как-то занять время, он решил записывать на...

Запуск Notepad++ и сокращение его кода
Здравствуйте! Хотелось бы написать для самообучения достаточно хороший текстовый редактор. Решил попробовать упростить notepad++ (без...

Решение уравнения методом перебора (сокращение кода)
A*X3 + B*X2 + C*X + D = 0 нужно решить это уравнение методом перебора корни уравнение целые . как можно ещё сжать код? #include...

Сокращение условия в if
Здравствуйте, я пишу игру на C++, но я столкнулся с проблемой: условия в if уж слишком большие. Конечно это не критично, но может быть есть...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru