LINUX.ORG.RU

Односвязные списки в Си

 ,


2

7

Всем привет) Давеча на меня наехал препод по программированию, мол: «почему ты никогда не используешь код который даю я, а все время пишешь свое. Лучше меня ты не напишешь.» В аудитории я промолчал.

Давал он код библиотеки для работы с односвязными списками. Я его полистал и понял что это говно.

Вот оно -> https://github.com/maksspace/unn/tree/master/prepod

Моя критика:

  1. Большинство функции не нужны ибо поля структур открыты
  2. Бессмысленное зануление указателя и проверка на ноль почти в каждой функции
  3. Поле данных в нодах списка, это не void*, а просто структура, по этому придется каждый раз исправлять библиотеку чтобы работать в другими типами данных
  4. Нет возможности использовать кастомный аллокатор памяти

Вот мой вариант: https://github.com/maksspace/slistlib

Дайте критику по обоим вариантам)



Последнее исправление: cetjs2 (всего исправлений: 2)

Ответ на: комментарий от anonymous

балаболка

Туда ли ты пришёл, приятель?

anonymous
()
Ответ на: комментарий от kirk_johnson

Да любые попытки реализовать список на Си для произвольных типов напоминают паралимпиаду, в том числе queue.h

quoob
()

У твоего препода код - говно. Но, похоже, что препод он всё-таки хороший: http://professorrating.ru/professor.php?id=83906. Даже книжку написал по программированию: http://bookre.org/reader?file=1334378

Твоя критика кода препода несостоятельна. Его код говно по причине абсолютно дебильного интерфейса, где список является ещё одновременно и итератором по самому себе. Ну, и обработка ошибок - атас. Так как ты это не увидел, то учиться тебе ещё есть чему. Поэтому советую тебе делать так как препод хочет (т.е. использовать его библиотеку) и так как ты хочешь (твою библиотеку) и сравнивать подходы. Двойная работа? Ты парень способный, у тебя это не займёт много времени, а профит от этого упражнения большой.

3. Поле данных в нодах списка, это не void*, а просто структура, по этому придется каждый раз исправлять библиотеку чтобы работать в другими типами данных

Посмотри на ещё один метод организации списка, который называется intrusive list: https://isis.poly.edu/kulesh/stuff/src/klist/

rupert ★★★★★
()
Ответ на: комментарий от kirk_johnson

Потому что тошнотворное месиво из макросов со всеми сопутствующими прелестями типа многократного вычисления параметров.

На такой задаче С++ рулит. Если по каким-то причинам С++ использовать нельзя, да, придётся страдать.

quoob
()
Ответ на: комментарий от kirk_johnson

За такой полиморфизм ногами бить нужно.

Ты не вкурсе? В ядре используется именно такая реализация списков.
Таки вперёд, иди побей ногами Линуса нашего славного Торвальдса.

alexku
()
Ответ на: комментарий от rupert

У твоего препода код - говно. Но, похоже, что препод он всё-таки хороший

/0

Даже книжку написал по программированию: http://bookre.org/reader?file=1334378

«Глава 2: Интегрированная среда Borland C»

facepalm.jpg

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от quoob

Гм...

TAILQ_INSERT_TAIL(&list, &elem, entry);

разворачивается в

(&elem)->entry.tqe_next = ((void *)0);
(&elem)->entry.tqe_prev = (&list)->tqh_last;
*(&list)->tqh_last = (&elem);
(&list)->tqh_last = &(&elem)->entry.tqe_next; 

Если честно, я не вижу особой проблемы.

kirk_johnson ★☆
()
Ответ на: комментарий от alexku

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

kirk_johnson ★☆
()
Ответ на: комментарий от eao197

Если не лень, глянь на страницу 27, разделы 3.16 и 3.17... :) http://bookre.org/reader?file=1334378&pg=26

В полном офигении полез искать год издания... 2003. Кто сказал «деградация образования»? Я точно слышал, как кто-то это сказал!

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Интегрированная среда Borland C

А чем она так плоха для обучения основам си? Нас тоже именно на ней учили, правда компы у нас были 286(или 386, не помню уже).

pawnhearts ★★★★★
()
Ответ на: комментарий от kirk_johnson
TAILQ_INSERT_TAIL(get_queue_by_id(some_id), &elem, entry);

разворачивается в...

А, ну да, TAILQ_INSERT_TAIL прописными буквами просто кричит «я макрос» и никто так не облажается. Да и к написанию и отладке макросов можно привыкнуть. Человеки к чему только не привыкают :)

quoob
()
Ответ на: комментарий от pawnhearts

Интегрированная среда Borland C

А чем она так плоха для обучения основам си?

Тем, что это давно мертвая IDE для давно мертвой ОС. Даже оставляя в стороне необходимость IDE для «обучения основам Си», есть современные IDE для современных ОС.

Нас тоже именно на ней учили, правда компы у нас были 286(или 386, не помню уже).

А кого-то учили на ридерах перфокарт.

tailgunner ★★★★★
()
Ответ на: комментарий от kirk_johnson

Функция get_queue_by_id внезапно вызвалась три раза. С сайд-эффектами будет совсем весело. Ты же не думаешь, что кто-то в здравом уме реально пишет такой код, закладываясь на то, что вызовов будет именно три и queue.h никогда не зарефакторят?

quoob
()
Ответ на: комментарий от tailgunner

Кто сказал «деградация образования»

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

anonymous
()
Ответ на: комментарий от anonymous

Так говоришь, будто оно когда-либо было огого. Кампутир сайинз у нас вечное днище для галочки

Казалось бы, причем CS к начальному обучению инженеров-программистов.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Кто сказал «деградация образования»?

Деградация C, скорее. И программирования как отрасли. Как я понимаю, книжки «Аннотированный стандарт C11» нет в природе. Книжка «Аннотированный стандарт C99» есть, но не закончена.

Советуют учить C по книжке K&R, адаптированной под ANSI C.

Большинство дискуссий по C сводится к закидыванию друг друга какашками. Большинство, даже стандарт C не читало, не говоря уж про *осилило*. Эта дискуссия — не исключение.

Какашками умудрились закидать даже Zed Shaw, хотя его книга безупречна в дидактическом смысле (пусть и несовершенна в техническом).

Macil ★★★★★
()
Ответ на: комментарий от Macil

Деградация C

Хмм... тот факт, что некий препод в 2003 (а возможно, и в 2016) учит Си с использованием Borland C и пишет в своей книге о продвинутых технологиях OLE и OpenDoc - это деградация Си?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

тот факт, что некий препод в 2003 (а возможно, и в 2016) учит Си с использованием Borland C и пишет в своей книге о продвинутых технологиях OLE и OpenDoc - это деградация Си?

Это — симптом. По современному C книжек раз два и нет. По C++ книжек больше и они реально лучше. C++11 и C++14 резко подстегнули развитие C++, чего не скажешь про C11.

Книжка «A Retargetable C Compiler: Design and Implementation» 1995-й год, «C Interfaces and Implementations» — 1997.

Потребовалось тут резко прокачать свой C-фу. Дык — облом. Положение спасают только «Modern C» и собственно сам стандарт.

Macil ★★★★★
()
Ответ на: комментарий от Macil

/me молча пожимает плечами и уклоняется от дальнейшей дискуссии

tailgunner ★★★★★
()
Ответ на: комментарий от Macil

Большинство дискуссий по C сводится к закидыванию друг друга какашками

Так на ЛОРе любая дискуссия к этому сводится. Это ж заповедник прыщей и психических.

anonymous
()
Ответ на: комментарий от anonymous

Так на ЛОРе любая дискуссия к этому сводится. Это ж заповедник прыщей и психических.

Я же не про ЛОР. Я про вообще.

Macil ★★★★★
()
Ответ на: комментарий от Macil

По современному C книжек раз два и нет.

А чем современный си отличается от несовременного? 3,5 новыми фичами в с99 и 2,5 в с11? Там новых фич на абзац текста, а многие из этих фич и поддерживаются мало где, те же потоки. Никому не нужно, вот и не пишут книг. С++11 разительно отличается от того, что было в 90-х, там книги нужны, их пишут.

Freyr69 ★★★
()
Ответ на: комментарий от anonymous

4 звезды, а такой глупый.

Будто звезды показатель ума.

staseg ★★★★★
()
Ответ на: комментарий от anonymous

google://intrusive vs non-intrusive containers

Да, но в С контейнеры с void* – говно.

staseg ★★★★★
()
Ответ на: комментарий от Macil

K&R + изучения/участие в открытых проектах разве не достаточно? Какого рода книг ты ждешь по языку, который практически не развивается(в стандартах новых крайне мало изменений)?

forCe
()
Последнее исправление: forCe (всего исправлений: 1)
Ответ на: комментарий от maksspaces

Тогда и шаблоны используй, чегоужтам. Преподу скажешь, что это макросы такие.

anonymous
()
Ответ на: комментарий от maksspaces

си.

Тогда почему у препода код на C++?

просто все постоянно говорят используйте new/delete место malloc и компании, в сишном коде

Кто так говорит? В Си вообще нет new и delete

forCe
()
Ответ на: комментарий от forCe

Тогда почему у препода код на C++?

Это изобретение помойковузного «сообщества»: переси-недоплюсы. Я ещё когда сам учился 15 лет назад с этим столкнулся и долго считал, что это норма. Как видишь традиции сильны.

anonymous
()
Ответ на: комментарий от maksspaces

Я про преподов в универе, по крайней мере что пока были у меня.

Ты хочешь сказать, что они не осознают, что пишут на С++? Тогда почему у твоего препода .cpp файл?

forCe
()
Ответ на: комментарий от forCe

они не осознают, что пишут на С++?

Они не разделяют C и C++, считая их одним языком. Си для них - это такое подмножество C++.

anonymous
()
Ответ на: комментарий от forCe

Короче, дело в чем: в группе учится не один и не два человека, а много, и как бы для упрощения осознания того что такое выделить память говорят: используйте new/delete, для вывода cin/cout)

И мне один раз сказали, когда у видели malloc, хотя до плюсов нам еще год по программе: не нужно его использовать, ибо у него проблема какая то когда выделение памяти происходит на границе странички.

Все там осознают, вы чтоо

maksspaces
() автор топика
Ответ на: комментарий от forCe

.cpp файлик потому что пишется в visual studio 10 express

maksspaces
() автор топика
Ответ на: комментарий от maksspaces

Мне почему-то кажется, что это вы что-то недопоняли. Скорее всего это предмет по алгоритмам или чему-то такому, а не по языку. Тогда на язык пофиг. Я ошибаюсь? Как предмет называется?

forCe
()
Ответ на: комментарий от maksspaces

для упрощения осознания того что такое выделить память

У вас нет курса по устройству ОС? Или по системному программированию?

forCe
()
Ответ на: комментарий от maksspaces

и как бы для упрощения осознания того что такое выделить память говорят: используйте new/delete

Все там осознают, вы чтоо

/0

LibList.cpp

#define DL DESCRIPTOR_LIST

библиотека

Все там осознают, вы чтоо

и еще раз поделил...

znenyegvkby
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.