Feri - izredni študij Seznam forumov Feri - izredni študij
Feri - izredni študij
 
 Pogosta vprašanjaPogosta vprašanja   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   RSS Feed   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Zasebna sporočilaZasebna sporočila   PrijavaPrijava 




rekurzija in dvosmerni seznam

 
Objavi novo temo   Odgovori na to temo    Feri - izredni študij Seznam forumov -> Osnove sistemske programske opreme OSPO
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
MilanG



Pridružen/-a: 16.01. 2010, 13:16
Prispevkov: 12

PrispevekObjavljeno: 30 Jan 2010 08:11    Naslov sporočila: rekurzija in dvosmerni seznam Odgovori s citatom

Ce komu kaj pomaga:

Koda:

#include <stdio.h>
#include <stdlib.h>

struct dllist {
 int number;
 struct dllist *next;
 struct dllist *prev;
};

struct dllist *head, *tail;

void append_node(struct dllist *lnode);
void insert_node(struct dllist *lnode, struct dllist *after);
void remove_node(struct dllist *lnode);
int prestej (struct dllist *lnode,int *stev);


int main(void) {
 struct dllist *lnode;
 int i = 0;
 int stev = 0;
   

 for(i = 0; i <= 5; i++) {
  lnode = (struct dllist *)malloc(sizeof(struct dllist));
  lnode->number = i;
  append_node(lnode);
 }

 /* print the dll list */
 for(lnode = head; lnode != NULL; lnode = lnode->next) {
/*  printf("%d\n", lnode->number);*/
 }
   
 lnode = head;
 prestej (lnode,&stev);
 /*printf("prestej = %d\n",stev);*/

 /* destroy the dll list */
 while(head != NULL)
  remove_node(head);

 return 0;
}

void append_node(struct dllist *lnode) {
 if(head == NULL) {
  head = lnode;
  lnode->prev = NULL;
 } else {
  tail->next = lnode;
  lnode->prev = tail;
 }

 tail = lnode;
 lnode->next = NULL;
}

void insert_node(struct dllist *lnode, struct dllist *after) {
 lnode->next = after->next;
 lnode->prev = after;

 if(after->next != NULL)
  after->next->prev = lnode;
 else
  tail = lnode;

 after->next = lnode;
}

void remove_node(struct dllist *lnode) {
 if(lnode->prev == NULL)
  head = lnode->next;
 else
  lnode->prev->next = lnode->next;

 if(lnode->next == NULL)
  tail = lnode->prev;
 else
  lnode->next->prev = lnode->prev;
}


int prestej (struct dllist *lnode, int *stev)
{
   
   if (lnode->next == NULL)
     {
   *stev = *stev + 1;
   return *stev ;
     }
   
   else
     {
   *stev = *stev + 1;
   return prestej(lnode->next,stev++);
     }
   
}
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
igor
Administrator foruma


Pridružen/-a: 20.09. 2009, 17:22
Prispevkov: 192

PrispevekObjavljeno: 30 Jan 2010 08:26    Naslov sporočila: Odgovori s citatom

Hvala.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
otobrglez



Pridružen/-a: 01.02. 2010, 00:36
Prispevkov: 41

PrispevekObjavljeno: 01 Feb 2010 00:38    Naslov sporočila: Še moja rešitev... Odgovori s citatom

Še moja rešitev...

Koda:

/* By Oto Brglez - <otobrglez@gmail.com> */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

struct element{
        int v; // vrednost
        struct element * naslednji;
        struct element * prejsnji;
} el;

/* Kazalec na zacetek */
struct element * zacetek;

/* Kazalec na konec */
struct element * konec;

/* Doda element na konec seznama */
void dodaj_element(struct element* node);

/* Odstrani element iz seznama */
void odstrani_element(struct element* node);

/* Pocisti rekurzivno */
void odstrani_vse();
void odstrani_vse_r(struct element* node);

/* Vrni node*/
struct element* vrni_element_at(int index);

/* Presteje elemente na zeznamu */
int prestej();

#if prestej_rekurzivno == 1
int prestej_r(struct element* node,int dolzina);
#endif

/* Glavni program */
int main(int argc, char * argv[]){
        int i=0;
        for(i=0; i<10; i++){
                /* Dodam 10 stevil pomnozenih s 3*/
                struct element * node = (struct element*)malloc(sizeof(struct element));
                node->v = i*10;
                dodaj_element(node);
                printf("Podatki i=%d v=%d\n",i, ((struct element*)vrni_element_at(i))->v);
        };


#if dolgi_test == 1

        /* Testiram vracanje elementov na mestu */
        printf("Na mestu i=0 je v=%d\n", ((struct element*)vrni_element_at(0))->v );
        printf("Na zadnjem mestu je v=%d\n", ((struct element*)vrni_element_at( prestej()-1 ))->v );

        /* Brisanje 5 elementa */
        printf("Brisem i=%d, v=%d\n",5, ((struct element*)vrni_element_at(5))->v);
        (void)odstrani_element( vrni_element_at(5) );

        /* Brisanje prvega elementa */
        printf("Brisem i=%d, v=%d\n",0, ((struct element*)vrni_element_at(0))->v);
        (void)odstrani_element( vrni_element_at(0) );

        /* Brisanje zadnjega elementa */
        printf("Brisem i=%d, v=%d\n",0, ((struct element*)vrni_element_at( prestej()-1 ))->v);
        (void)odstrani_element( vrni_element_at( prestej()-1) );

        /* Brisanje zacetka */
        printf("Brisem zacetek...\n");
        (void)odstrani_element(zacetek);

        /* Brisanje konca */
        printf("Brisem konec...\n");
        (void)odstrani_element(konec);

        /* Pocistim celoten seznam... */
        odstrani_vse();

        printf("Velikost %d\n", prestej());

#endif

        exit(EXIT_SUCCESS);
} // main

void dodaj_element(struct element* node){
        if(prestej()==0){ // Prazen seznam
                zacetek = node;
                konec = NULL;
                node->prejsnji = NULL;
                node->naslednji = NULL;
        } else {
                struct element * zadnji = zacetek;
                while(zadnji->naslednji != NULL) zadnji = zadnji->naslednji;
                zadnji->naslednji = node;
                node->naslednji = NULL;
                node->prejsnji = zadnji;
                konec = node;
        };
} // dodaj_element

void odstrani_element(struct element* node){
        if(prestej() == 0) return;

        // Samo 1 element
        if(prestej() == 1){
                zacetek=NULL;
                konec=NULL;
                free(node); return;
        };

        // Brisanje prvega na seznamu
        if(node == zacetek){
                zacetek=node->naslednji;
                node->naslednji->prejsnji = NULL;
                free(node);
                return;
        }

        // Node je na koncu
        if(node == konec){
                konec = node->prejsnji;
                konec->naslednji = NULL;
                free(node);
                return;
        }

        node->prejsnji->naslednji = node->naslednji;
        node->naslednji->prejsnji = node->prejsnji;
        (void)free(node);

} // odstrani_element

void odstrani_vse(){
        odstrani_vse_r(zacetek);
} // odstrani_vse

/*
!!! REKURZIJA !!!
 */
void odstrani_vse_r(struct element* node){
        if(node == NULL) return;

        if(node->prejsnji != NULL) node->prejsnji->naslednji = node->naslednji;
        if(node->naslednji != NULL) node->naslednji->prejsnji = node->prejsnji;

        struct element* node_n = node->naslednji;
        zacetek = node_n;

        free(node);

        odstrani_vse_r(node_n);
} // odstrani_vse_r

#if prestej_rekurzivno != 1
/* Ne rekurzivno stetje */
int prestej(){
        if(zacetek==NULL) return 0;
        struct element* trenutni = zacetek;

        int i=0;
        for(trenutni = zacetek; trenutni!= NULL; trenutni = trenutni->naslednji) i++;
        return i;
} // prestej

#else
/* Rekurzivno stetje */
int prestej(){
        if( zacetek == NULL) return 0;
        return prestej_r(zacetek,0);
} // prestj

int prestej_r(struct element* node, int dolzina){
        if(node!=NULL) dolzina++;
        if(node->naslednji !=NULL) return prestej_r(node->naslednji, dolzina);
        return dolzina;
} //prestej_r
#endif

struct element* vrni_element_at(int index){
        if(prestej() == 0) return NULL;
        struct element* trenutni = zacetek;
        int i = 0;
        for(i=0, trenutni = zacetek; trenutni != NULL; trenutni = trenutni->naslednji, i++)
                if(i==index) return trenutni;
        return NULL;
} // vrni_element_at
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Feri - izredni študij Seznam forumov -> Osnove sistemske programske opreme OSPO Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu


MojForum.si - brezplačno gostovanje forumov. Powered by phpBB 2.