U kontekstu atp. LIST napiˇite potprogram void ELIMINATE(LIST *L, elementtype x) koji iz liste L izbacuje sve elemente koji su ve ́i od zadanog elementa x. Pretpostavljamo da se podaci tipa elementtype mogu usporedivati standardnim operatorom “≤”. Potprogram treba biti neovisan o implementaciji atp LIST. Pretpostavite da pozicije svih elemenata liste nakon poziva funkcije DELETE ostaju oˇuvane (osim naravno onog elementa kojeg briˇemo).
[code:1]#include<stdio.h>
#include<stdlib.h>
#define elementtype int
typedef struct celltype {
elementtype element;
struct celltype *next;
} celltype;
typedef celltype *LIST;
typedef celltype *position;
position END (LIST L) {
position q;
for(q=L;q->next!=NULL; ) q=q->next;
return q;
}
position MAKE_NULL (LIST *L) {
*L = (celltype*)malloc(sizeof(celltype));
(*L)->next = NULL;
return (*L);
}
void INSERT (elementtype x, position p, LIST *L) {
position t;
t = p->next;
p->next = (celltype*)malloc(sizeof(celltype));
p->next->element = x;
p->next->next= t;
}
void DELETE (position p, LIST *L) {
position t;
if(p->next==NULL) {
printf("Kriva pozicija");
exit(1);
}
t = p->next;
p->next = p->next->next;
free(t);
}
position FIRST (LIST L) {
return L;
}
position NEXT (position p, LIST L) {
if(p->next == NULL) {
printf("Kriva pozicija");
exit(1);
}
return p->next;
}
position PREVIOUS (position p, LIST L) {
position q;
for(q=L;q->next!=p;q=q->next)
return q;
}
elementtype RETRIEVE (position p, LIST L) {
return p->next->element;
}
void ELIMINATE (LIST *L, elementtype x) {
position p;
for(p=FIRST(*L);p!=END(*L);p=NEXT(p, *L)) {
if(RETRIEVE(p, *L) > x) {
position t = p;
p = NEXT(p, *L);
DELETE(t, L);
}
else p = NEXT(p, *L);
}
}
int main(void) {
elementtype y, x;
LIST *L;
position p;
MAKE_NULL(L);
int i, n;
printf("Ucitaj element x: "); scanf("%d", &x);
printf("Koliko ima elemenata u listi? "); scanf("%d", &n);
for(i=0;i<n;i++) {
scanf("%d", &y);
INSERT(y, END(*L), L);
}
for(p=FIRST(*L);p!=END(*L);p=NEXT(p, *L)) {
printf("%d ", RETRIEVE(p, *L));
}
ELIMINATE(L, x);
for(p=FIRST(*L);p!=END(*L);p=NEXT(p, *L)) {
printf("%d ", RETRIEVE(p, *L));
}
return 0;
}[/code:1]
izbacuje mi 'segmentation fault'..
u cem je problem :?
U kontekstu atp. LIST napiˇite potprogram void ELIMINATE(LIST *L, elementtype x) koji iz liste L izbacuje sve elemente koji su ve ́i od zadanog elementa x. Pretpostavljamo da se podaci tipa elementtype mogu usporedivati standardnim operatorom “≤”. Potprogram treba biti neovisan o implementaciji atp LIST. Pretpostavite da pozicije svih elemenata liste nakon poziva funkcije DELETE ostaju oˇuvane (osim naravno onog elementa kojeg briˇemo).
Kod: | #include<stdio.h>
#include<stdlib.h>
#define elementtype int
typedef struct celltype {
elementtype element;
struct celltype *next;
} celltype;
typedef celltype *LIST;
typedef celltype *position;
position END (LIST L) {
position q;
for(q=L;q->next!=NULL; ) q=q->next;
return q;
}
position MAKE_NULL (LIST *L) {
*L = (celltype*)malloc(sizeof(celltype));
(*L)->next = NULL;
return (*L);
}
void INSERT (elementtype x, position p, LIST *L) {
position t;
t = p->next;
p->next = (celltype*)malloc(sizeof(celltype));
p->next->element = x;
p->next->next= t;
}
void DELETE (position p, LIST *L) {
position t;
if(p->next==NULL) {
printf("Kriva pozicija");
exit(1);
}
t = p->next;
p->next = p->next->next;
free(t);
}
position FIRST (LIST L) {
return L;
}
position NEXT (position p, LIST L) {
if(p->next == NULL) {
printf("Kriva pozicija");
exit(1);
}
return p->next;
}
position PREVIOUS (position p, LIST L) {
position q;
for(q=L;q->next!=p;q=q->next)
return q;
}
elementtype RETRIEVE (position p, LIST L) {
return p->next->element;
}
void ELIMINATE (LIST *L, elementtype x) {
position p;
for(p=FIRST(*L);p!=END(*L);p=NEXT(p, *L)) {
if(RETRIEVE(p, *L) > x) {
position t = p;
p = NEXT(p, *L);
DELETE(t, L);
}
else p = NEXT(p, *L);
}
}
int main(void) {
elementtype y, x;
LIST *L;
position p;
MAKE_NULL(L);
int i, n;
printf("Ucitaj element x: "); scanf("%d", &x);
printf("Koliko ima elemenata u listi? "); scanf("%d", &n);
for(i=0;i<n;i++) {
scanf("%d", &y);
INSERT(y, END(*L), L);
}
for(p=FIRST(*L);p!=END(*L);p=NEXT(p, *L)) {
printf("%d ", RETRIEVE(p, *L));
}
ELIMINATE(L, x);
for(p=FIRST(*L);p!=END(*L);p=NEXT(p, *L)) {
printf("%d ", RETRIEVE(p, *L));
}
return 0;
} |
izbacuje mi 'segmentation fault'..
u cem je problem
_________________ Lakše je naučiti matematiku nego raditi bez nje.
|