LINUX.ORG.RU

Двунаправленный список на Си.

 


0

1

Здравствуйте. Являюсь начинающим в разработке на языке Си, и столкнулся с проблемой в решении следующей задачи: Для решения задачи сформируйте двунаправленный список. Дана последовательность латинских букв, оканчивающаяся точкой. Среди букв есть специальный символ Ch, появление которого означает отмену предыдущего символа. Учитывая вхождение этого символа, преобразуйте последовательность.

На бумаге всё проще простого, но с реализацией на Си есть проблемы. Можете предложить свой пример решения? Всё в статике, никаких динам. массивов и тд. maxsize взять за 100



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

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

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

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

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

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

Это лисп головного мозга в терминальной стадии. Плюсовика-насильника видно по темплейтам, питониста по отступам, а лишпера по односвязным спискам. Там же все из пар собирается, даже небо, даже Аллах…

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

Это будет уже не лисп а какой то весп или арсп.

Он не будет приносить столько радости, да и скобочек там будет меньше, и скобочки будут квадратные:-(

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

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

Можно оптимизировать и хранить в списке только uncommitted stuff… Была бы реальная статистика - можно было-бы обсуждать. Задачка хороша тем что порождает дискуссию, имхо.

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

В этой задаче список очевидно нинужен, она делается на массиве гораздо быстрее и проще.

Конечно можно сделать список с быстрой пакетной аллокацией, но это уже за пределами понимания ТС видимо…

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

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

Любая Ваша попытка этот факт опровергнуть говорит только о том что Вы:

  1. не знаете элементарных вещей
  2. не знаете деталей реализации ЯП при помощи которого Вы этот факт пытаетесь «опровергать».

И жить с этим Вам а не мне…

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

Если что-то невозможно сделать так, значит изначально нужно было делать по-другому, весь алгоритм нужно было продумать с учётом ограничений избранной структуры данных. Мне казалась эта мысль очевидный, а сейчас из-за вашего занудства я оказываюсь в положении человека, вынужденного объяснять в чём соль анекдота. Вот, за что вы так со мной?

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

Пардонте, но если у Вас в алгоритме заложено что Земля плоская и покоится на трех китах - тут уже никто не должен додумывать как затащить в Ваш алгоритм круглую Землю;-)

Если Вы про алгоритм для задачи ТС - напуркуа Вам вообще сдались там односвязные списки?

Вот стандартный вопрос на собеседовани к джуну (пардонте еще раз) - какова алгоритмическая сложность добавления POD элемента в конец списка и в конец вектора? И что на самом деле будет быстрее (разница 1-2 порядка)?

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

Если Вы про алгоритм для задачи ТС - напуркуа Вам вообще сдались там односвязные списки?

Просто так. Пошутить захотелось. Темы с «помогите решить домашнее задание» в принципе не предназначены для решния изначального вопроса, но через глумление над ленивым школьником его следует сподвигнуть на подвиг «взяться за ум и решить задачу самому». А вы человеку вообще никак не помогаете стать лучше и вырасти над собой.

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

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

Что бы человеку вырасти над собой в данном случае надо:

  1. сделать задачу на массиве и осознать что список тут ненужен.
  2. сделать двусвязный список потому что так надо в условии
  3. смержить п1 и п2 потому что так надо в условии

ЗЫ можете считать это мнением проф.препода со стажем овер 20 лет. А задача дурацкая.

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

Вот стандартный вопрос на собеседовани к джуну (пардонте еще раз) - какова алгоритмическая сложность добавления POD элемента в конец списка и в конец вектора? И что на самом деле будет быстрее (разница 1-2 порядка)?

Тут возможны варианты:

struct stailq_item {
    void *data;
    struct stailq_item *next;
};

struct stailq_head {
    struct stailq_item *first;
    struct stailq_item *last;
};
cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 2)
Ответ на: комментарий от AntonI

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

P.S. Однако, это всё равно уже вторая стадия. А на первой ученик должен осознать, что: а) в принципе плохо поступил; б) если хочешь, чтобы ответили нормально, нужно спрашивать иначе.

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

На односвязные списки задача ложится идеально. Собственно, однократный проход коллекции с обработкой элементов, что может лучше ложиться на списки? Чтобы не быть голословным:

(define (simplify lst)
  (define (iter lst)
    (define (skiper? x) (eq? x 'Ch))
    (define (add x data)
      (if (skiper? x) data
	  (cons x data)))
    (fold-right
     (λ (x acc)
       (let ((skip? (car acc))
	     (skip-next (skiper? x))
	     (data (cdr acc)))
	 (if skip? (cons skip-next data)
	     (cons skip-next  (add x data))))
       )
     (list #f) lst))
  (cdr (iter lst)))
ugoday ★★★★★
()
Ответ на: комментарий от ugoday

однократный проход коллекции с обработкой элементов, что может лучше ложиться на списки?

Зачем тут списки?! На вектор она ложится гораздо лучше.

А на списки гораздо лучше ложатся задачи где важно сохранить последовательность и адреса элементов например.

Таки я настоятельно прошу Вас ответить на вопрос, какова алгоритмическая сложность добавления элмента в конец списка и в конец вектора. И что работает быстрее.

ТС расти над собой не хочет, придется за уши тянуть Вас вместо него;-)

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

Зачем тут списки?

Затем, что это удобная структура данных для решения данной задачи. Чего вы от меня (или от списков) ещё хотите?

Таки я настоятельно прошу Вас ответить придется за уши тянуть

Что-то возникают у меня вопросы кто тут кого тянуть за уши и экзаменовать должен.

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

Затем, что это удобная структура данных для решения данной задачи.

Нет. И если бы Вы знали ответ на дважды заданный Вам вопрос, Вы бы это тоже понимали. Но увы и ах…

Что-то возникают у меня вопросы кто тут кого тянуть за уши и экзаменовать должен.

Ни у кого кроме Вас таких вопросов тут не возникает. Хочу напомнить, что Вы:

  1. упорно несли фигню несколько комментов подряд про удаление элемента из односвязного списка

  2. несмотря на дважды повторенную просьбу, так и не смогли ответить на тривиальный вопрос который обычно задают джунам на собеседовании - т.е. Вы на этот вопрос ответить не в состоянии. А щеки то как дуете, бггг!

  3. упорно пытаетесь использовать лисп в теме посвященной С-ям.

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

Нет.

Аргументов, как я понимаю, не воспоследует.

упорно несли фигню

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

несмотря на дважды повторенную просьбу,

Просьба на то и просьба, что её можно проигнорировать. С чего вы вообще решили, что я у вас на собеседовании? Уразумейте это для начала.

упорно пытаетесь использовать лисп в теме посвященной С-ям.

На чём удобнее иллюстрировать алгоритм, то и использую. А если вам что-то непонятно, то вам должно быть стыдно, щёки дуете как доктор-профессор, а простейший алгоритм вас в тупик ставит. Фу таким быть.

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

Аргументов, как я понимаю, не воспоследует.

Все аргументы были озвучены, перечитайте тред.

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

Для собеседников очевидным является то, что Вы несли фигню про удаление элемента из односвязного списка. Это как заявить что cos(phi) может достигать двух - дальше никакие оправдания военным временем уже не катят.

Просьба на то и просьба, что её можно проигнорировать.

Ответ на этот вопрос, как я уже сказал, является аргументом против применения списков в задаче ТС. Вы тут продвигали идею роста над собой - но сами расти категорически не желаете. Ай-яй.

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

На чём удобнее иллюстрировать алгоритм, то и использую.

Тред посвящен С. Читатели Ваших иллюстарций в этом треде не обязаны знать лисп - если Вы конечно хотите что бы эти иллюстрации иллюстрировали кому то хоть что то кроме Вас самого.

щёки дуете как доктор-профессор, а простейший алгоритм вас в тупик ставит. Фу таким быть.

На первый раз я Вам прощу хамство, так и быть. Все таки Вы так эпично обгадились и у Вас явный баттхерт…

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

А вот это уже предметная критика. Да, данное решение не претендует на чемпионство по производительности. Нет, это не является проблемой (за исключением случаев, когда является, но это ещё доказать надо).

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

Он лиспер, он вообще не понимает что такое malloc. Да и лиспер он херовый - даже азы алгоритмов работы со списками прошли мимо него.

Кстати я не уверен что в тех древних легендарных лисп-машинах аллоцировалась каждая нода отдельно. Но на С сделать эффективную пакетную аллокацию для списка вместе со списком… собенно когда можно вообще не городить своих структур данных… но у лисперов своя вселенная.

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

это не является проблемой

Дяденька, какое из двух решений надо выбрать:

  1. на векторе который из коробки, тривиально пишется в 10 строчек, работает быстро

  2. на самодельном списке который надо написать и отладить, работает на два-три порядка медленнее

???

Ответ очевиден, но не только лишь для всех.

Таки нелюбовь к Стругацким и иррациональная ненависть к СССР все таки является вполне достоверным признаком неадекватности. Вы это вполне наглядно иллюстрируете…

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

Я пришёл сказать, что я вас решил игнорировать, потому как верю в принцип «если ты споришь с идиотом, то скорее всего он сейчас делает то же самое». Но потом я прочитал

Таки нелюбовь к Стругацким и иррациональная ненависть к СССР

И только уверился в благодатности и своевременности этого решения. Всего хорошего, с Новым Годом и Рождеством Хрисовым!

ugoday ★★★★★
()

Чот никто не предлагает, я снова попробую:

import java.util.Arrays;
import java.util.LinkedList;

public class ListInetratr {

	public static void main(String[] args) {
		String[] str = {"Ch", "B", "C", "D", "Ch", ".",};
		var sub = new LinkedList<String>(Arrays.asList(str));
		System.out.println("" + sub);
		for(int i= 0; i<sub.size(); i++)
		{//там в конце точка, но мало ли.
			if((i > 0 && i< sub.size()) && sub.get(i).equals("Ch")) sub.remove(i-1);
		}
		System.out.println("" + sub);
	}

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

Как то пофик, вот вообще. Но - увы и ах - игнор не поднимет Вас на уровень хотя бы джуна. Впрочем «Вам с этим жить»(с) Вы.

Я даже немного сочувствую Вашему лютому баттхерту. @LamerOk вот выбрал другой путь - он мне негативные реакции ставит, ему это видимо как то помогает пережить страдания…

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

В эту игру можно играть вдвоем - но я попробовал, игра скучная;-(

Всегда считал что если с чем то не согласен - скажи предметно, ротом. А так, с этими массовыми отрицательными реакциями, Вы просто выглядите бессловесным клоуном. Простите за резкость (без всякого сарказма).

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

Так зачем вы скриптовуху смешиваете с Си?

Лисп очень даже интересный и высокоуровневый язык программирования, вполне достойный внимания, но надо отдавать себе отчёт, что он работает в интерпретаторе и никогда не был и не будет быстрым.

Нафиг писать программу на Си, если не оптимизировать её? Пишите тогда на Лиспе. С таким подходом писать на Си – создавать геморой себе и окружающим с очень сомнительными приростом производительности. Вы бы ещё собрались на ассемблере браузер писать. Можно. Но зачем?

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

А почему Вы все это у меня спрашиваете?! Это не я лисп в этот тред притащил;-)

Я просто пытаюсь обьяснить (себе наверное в первую очередь) ход мыслей г-на Угодай.

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

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

Вопрос ни в одном глазу ни в «скриптовухе». Вопрос в том что задачка изначально была на структуры данных, и господин @ugoday столько успел хни нанести которая мне просто на голову не налазит, что даже не смешно.

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)