infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Elena D. din Noiembrie 16, 2013, 00:27:09



Titlul: Afisare linii in ordine inversa
Scris de: Elena D. din Noiembrie 16, 2013, 00:27:09
Salutare! Am o problema in C care imi da ceva bataie de cap. Am o lista simplu inlantuita care contine cuvinte pe mai multe linii. Trebuie sa printez liniile in ordine inversa, fara a folosi arrays.
De exemplu:
Ana
are
mere.

mere
are
Ana

Ceva idei?

Multumesc anticipat!


Titlul: Răspuns: Afisare linii in ordine inversa
Scris de: Petru Trimbitas din Noiembrie 16, 2013, 01:42:27
presupunand ca lista ta arata asa:
Cod:
struct list {
  list *nxt;
  char s[105];
};

as face asa:
Cod:
void print(list *node) {
  if(node->nxt!=NULL) print(node->nxt);
  printf("%s\n",node->s);
}


Titlul: Răspuns: Afisare linii in ordine inversa
Scris de: Elena D. din Noiembrie 16, 2013, 01:54:51
Petru, multumesc frumos. Insa metoda respectiva printeaza lista in ordine inversa. Cu alte cuvinte:

Ana
are
mere

devine
erem
era
ana
.

Output-ul meu ar trebui sa arate asa:
mere
are
Ana
.

Lista mea arata asa:
Cod:
typedef struct list{
  char val;
  struct list *next;
} item;
si trebuie sa citesc caracterele folosind getchar();.
Imi cer scuze daca la inceput m-am exprimat gresit.


Titlul: Răspuns: Afisare linii in ordine inversa
Scris de: Petru Trimbitas din Noiembrie 16, 2013, 12:10:28
eu in fiecare nod din lista stochez un cuvant deci afisarea e cum ai cerut


Titlul: Răspuns: Afisare linii in ordine inversa
Scris de: Elena D. din Noiembrie 16, 2013, 13:37:59
Cum fac asta fara a folosi arrays?


Titlul: Răspuns: Afisare linii in ordine inversa
Scris de: FMI Razvan Birisan din Noiembrie 16, 2013, 14:04:51
Ai putea incerca sa memorezi fiecare caracter intr-un element al listei ( inclusiv caracterul '\n' )


Titlul: Răspuns: Afisare linii in ordine inversa
Scris de: Elena D. din Noiembrie 16, 2013, 14:10:09
Razvan, asta am reusit. Am incercat sa retin toti pointer-ii catre "\n" sau "NULL" si sa printez pornind de la ei, insa nu afiseaza decat ultima linie, apoi se blocheaza.


Titlul: Răspuns: Afisare linii in ordine inversa
Scris de: FMI Razvan Birisan din Noiembrie 16, 2013, 14:29:53
Cod:
# include <cstdio>

struct lista
{
    char a;
    lista * next;
};

lista *prim, *ultim;
char x;

void Adaug()
{
    lista * nou = new lista;
    nou->a = x;
    nou->next = NULL;
    if( prim == NULL )
        prim = ultim = nou;
    else
    {
        ultim->next = nou;
        ultim = ultim->next;
    }
}

void Citire()
{
    x=getchar();
    while( x != '.' )
    {
        Adaug();
        x=getchar();
    }
}

void Tipar( lista * p )
{
    for( ; p && p->a != '\n' && p->a != '#' ; p=p->next )
        putchar(p->a);
    putchar('\n');
}

lista * Cauta()
{
    lista *line = NULL;
    for( lista * i = prim ; i ; i=i->next )
        if( i->a == '\n' )
            line = i;
    return line;
}

int main()
{
    lista* x;
    Citire();
    while( (x=Cauta()) )
    {
        x->a = '#';
        Tipar(x->next);
    }
    Tipar(prim);
    return 0;
}


Caracterele se introduc in lista pana la intalnirea caracterului caracterelul '.''

Sper sa te ajute. :)
Spune-mi daca nu intelegi ceva :thumbup:


Titlul: Răspuns: Afisare linii in ordine inversa
Scris de: Elena D. din Noiembrie 16, 2013, 14:36:46
Multumesc frumos! O sa-l modific putin, totusi. Trebuie folosesc alta structura repetitiva in loc de for. O sa folosesc while. Multumesc inca o data!