Witam!
Na uczelni uczymy się właśnie tworzyć i używać list jednokierunkowych. I mieliśmy za zadanie napisać funkcje, które dodają nowy element za i przed wskazany przez q element w liście. Z dodawanie za nie miałem problemu, jednakże z przed już mam.
#include<stdio.h>
#include<stdlib.h>
typedef struct el{
int dane;
struct el *nast;
} element;
element *p, *q, *r;
int x, y, z;
element *DNPL(int a, element *l){
element *q;
q = malloc(sizeof(element));
q->dane = a;
q->nast = l;
return q;
}
element *DNKL(int a, element *l){
element *q, *r;
q = malloc(sizeof(element));
while (q != NULL){
printf("%i\n", q->dane);
q = q->nast;
}
if (l == NULL) return q;
r = l;
while (r->nast != NULL) r = r->nast;
r->nast = q;
return l;
}
void druk_normalny(element *p){
if (p != NULL){
printf("%d, ", p->dane);
druk_normalny(p->nast);
}
}
void druk_odwrocony(element *p){
if (p != NULL){
druk_odwrocony(p->nast);
printf("%d, ", p->dane);
}
}
element *znajdz(int x, element *p){
element *q = p;
while ((q != NULL) && (q->dane != x)) q = q->nast;
return q;
}
void dodaj_za(int x, element *q){
element *r = malloc(sizeof(element));
r->dane = x;
r->nast = q->nast;
q->nast = r;
}
void dodaj_przed(int x, element *q, element *p){
element *r = NULL;
if (r->nast == q) DNPL(x, p);
else{
while (r->nast != q) r = r->nast;
element *t = malloc(sizeof(element));
r->nast = t;
t->dane = x;
t->nast = q;
}
}
int main(){
p = NULL;
printf("Podaj elementy list:\n");
scanf("%i", &x);
while(x != 0){
p = DNPL(x, p);
scanf("%i", &x);
}
printf("\nTwoja lista: ");
q=p;
druk_normalny(p);
printf("\nJaki element chcesz znalesc w liscie: "); scanf("%d", &x);
while (x){
q = znajdz(x, p);
if (q != NULL) {
printf("Znaleziono %i\n", x);
}
else{
printf("Nie ma %i na liscie\n", x);
}
scanf("%i", &x);
}
printf("\nPodaj element, ktory chcesz dodac do listy: ");
scanf("%d", &x);
dodaj_przed(x, q, p);
printf("\nTwoja lista: ");
druk_normalny(p);
getchar();
getchar();
return 0;
}
Po skompilowaniu wyskakuje błąd "Unhandled exception at 0x00313CF8 in ASD.exe: 0xC0000005: Access violation reading location 0x00000004." przy warunku if w funkcji dodaj_przed.
Byłbym wdzięczny za pomoc.
Pozdrawiam