Spojový seznam odkazující na další spojový seznam rubrika: Programování: C/C++

4 Levin
položil/-a 2.1.2016

Ahoj, řeším následující problém v C. Od uživatele dostanu číslo, které udává délku řetězce a daný řetězec, např:

3 cau
4 ahoj

Řeším to pomocí spojových seznamů, jelikož potřebuji evidovat délku a když jsou délky stejné, tak aby řetězce byly postupně za sebou.

Mám následující struktury

typedef struct retezce
{
  struct retezce *dalsi;
  int delka;
  char ret[100];
}RETEZCE;
 
typedef struct pocet
{
  struct pocet *dalsi;
  RETEZCE *retezec;
}POCET;

Poté mám napsanou funkci na přiřazování a vytvoření. Vytváření funguje, ale mám problém, jak přiřadit vytvořenou strukturu na spravné místo, pokud již existuje stejná délka řetězce do toho stejného seznamu. Zkoušel jsem to projíždět while cyklem, a když jsem našel shodu, tak přiřadit vytvořenou strukturu na 1. pozici a posunout stavajici strukturu na 1. pozici na retezec->dalsi a vratit odkaz, pokud se v cyklu shoda nenašla tak vytvořit strukturu POCET a dát ji odkaz z vytvořené struktury RETEZEC. Problém je, že když vracím návratové hodnoty z while nebo poté z funkce, když se nenajde shoda, tak už ztratím odkazy. Zkoušel jsem to řešit asi 3 hodiny a nenašel jsem řešení, jak to správně přiřazovat.
Potřebuji poradit, jak vrátit z funkce návratovou hodnotu, aby odkazy byly správně zachovány a nic "nechybělo". Díky za každou radu.

Komentáře

  • Taco : Trošku jsem se v tom zadání ztratil. Mám to chápat tak, že problém je, že ti funkce buď vrátí novou adresu ukazatele, nebo NULL v případě když řetězec se stejnou délkou nenajde? Nebo jak? 3.1.2016
odkaz
8 Jakub Macek
odpověděl/-a 3.1.2016

To chce asi vidět zdroják, nicméně v tomto případě bych to viděl trochu více na hrubou sílu. Pokud je pravda, že pro řetězec stačí 100 bytů, tak bych nadrzo udělal pole 100 struktur, kde index by byla délka řetězce a ve struktuře by bylo uložen počet vložených řetězců dané délky a pak pole jednotlivých řetezců (postupně zvětšované pomocí realloc). Pokud je potřeba lexikografické seřazení (a ne podle pořadí vstupu), tak nakonec bych to prošel a pro každou délku to setřídil (třeba qsortem).
Při tom lexikografickém setřídění by to ještě mohlo jít dále - při vstupu to sypat za sebe do pole řetězců a pak si napsat vlastní porovnávací funkci pro qsort, která zohlední nejdříve délku a pak uděla strcmp. Toto asi nebude na první pokus efektivní, ale takové kriterium nebylo řečeno.

A pokud jde o praktickou věc a nejde kupříkladu o semestrální projekt na struktury, tak pochopitelně nejlepší je využít existujících tříd v C++ STL :).

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.