 |
Feri - izredni študij Feri - izredni študij
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
MilanG
Pridružen/-a: 16.01. 2010, 13:16 Prispevkov: 12
|
Objavljeno: 30 Jan 2010 08:11 Naslov sporočila: rekurzija in dvosmerni seznam |
|
|
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 |
|
 |
igor Administrator foruma
Pridružen/-a: 20.09. 2009, 17:22 Prispevkov: 192
|
Objavljeno: 30 Jan 2010 08:26 Naslov sporočila: |
|
|
Hvala. |
|
Nazaj na vrh |
|
 |
otobrglez
Pridružen/-a: 01.02. 2010, 00:36 Prispevkov: 41
|
Objavljeno: 01 Feb 2010 00:38 Naslov sporočila: Še moja rešitev... |
|
|
Š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 |
|
 |
|
|
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
|
|