Witam mam problem z tą listą dwukierunkową czy mogł by ktoś przejrzeć i ocenić czemu wysypuje się podczas dodawania elementu lub sie zapetla przy wyświetlaniu elementów ??
oto kod:
#include <stdio.h>
#include <stdlib.h>
struct node
{
struct node *next;
struct node *prev;
int val;
};
struct list
{
struct node *head;
struct node *tail;
};
void add_begin(int val,struct list *l);
void add_end(int val,struct list *l);
void add_el(int val,int n,struct list *l);
void print_forward(struct list *l);
void print_backward(struct list *l);
void print_el(int n,struct list *l);
void remove_el(int n,struct list *l);
int size_l(struct list *l);
int main()
{
char zmiana;
int element,n,wybor,operacja;
struct list wsk_list;
wsk_list=(struct list)malloc(sizeof(struct list));
menu:
system("cls");
printf("Wybierz operacje, ktora zostanie przeprowadzona na liscie:\n");
printf("1.Dodaj element \n");
printf("2.Usun element \n");
printf("3.Wyswietl \n");
printf("4.Zakonczenie \n");
printf("Twoj wybor ");
fflush(stdin);
scanf("%d",&operacja);
system("cls");
switch(operacja)
{
case 1:
printf("Podaj element: ");
fflush(stdin);
scanf("%d",&element);
printf("\tUmiesc element na liscie:\n");
printf("1.na poczatek\n");
printf("2.na koniec\n");
printf("3.na wybrana pozycje\n");
fflush(stdin);
scanf("%d",&wybor);
if(wybor==3)
{
printf("Podaj indeks, pod ktory zostanie dodany element: ");
scanf("%d",&n);
add_el(element,n,wsk_list);
}
else if(wybor==2)
add_end(element,wsk_list);
else if(wybor==1)
add_begin(element,wsk_list);
break;
case 2:
printf("Podaj indeks elementu, ktory zostanie usuniety: ");
scanf("%d",&n);
remove_el(n,wsk_list);
system("pause");
break;
case 3:
printf("Wyswietlenie listy:\n");
printf("1.od poczatku\n");
printf("2.od końca\n");
printf("3.dowolny element\n");
fflush(stdin);
scanf("%d",&wybor);
if(wybor==3)
{
printf("Podaj indeks elementu, ktory zostanie wyswietlony: ");
scanf("%d",&n);
print_el(n,wsk_list);
}
else if(wybor==2)
print_backward(wsk_list);
else if(wybor==1)
print_forward(wsk_list);
printf("\n");
system("pause");
break;
case 4:
printf("Zakonczenie programu...");
return 0;
}
goto menu;
}
void add_begin(int val,struct list *l)
{
struct node wsk=(struct node)malloc(sizeof(struct node));
wsk->next=NULL;
wsk->prev=NULL;
wsk->val=val;
if(l->head==NULL)
{
l->head=wsk;
l->tail=wsk;
}
else
{
wsk->next=l->head;
l->head->prev=wsk;
l->head=wsk;
}
}
void add_end(int val,struct list *l)
{
struct node wsk=(struct node)malloc(sizeof(struct node));
wsk->next=NULL;
wsk->prev=NULL;
wsk->val=val;
if(l->head==NULL)
{
l->head=wsk;
l->tail=wsk;
}
else
{
wsk->prev=l->tail;
l->tail->next=wsk;
l->tail=wsk;
}
}
void add_el(int val,int n,struct list *l)
{
int i=0,rozmiar;
struct node *wsk;
struct node el;
rozmiar=size_l(l);
if(n>rozmiar)
{
printf("Podany indeks wykracza poza pozycje, na ktorej moze zostac umieszczony element!\n");
free(wsk);
}
else
{
if(n==0)
add_begin(val,l);
else if(n==rozmiar)
add_end(val,l);
else
{
wsk=(struct node)malloc(sizeof(struct node));
el=l->head;
while(i!=n)
{
el=el->next;
i++;
}
wsk->next=el;
wsk->prev=el->prev;
wsk->val=val;
wsk->next->prev=wsk;
wsk->prev->next=wsk;
}
}
}
void print_forward(struct list *l)
{
struct node *el;
el=l->head;
do
{
if(l->head==NULL)
{
printf("Brak elementow!");
break;
}
printf("%d\t",el->val);
el=el->next;
}
while(el!=l->tail->next);
}
void print_backward(struct list *l)
{
struct node *el;
el=l->tail;
do
{
if(l->head==NULL)
{
printf("Brak elementow!");
break;
}
printf("%d\t",el->val);
el=el->prev;
}
while(el!=l->head->prev);
}
void print_el(int n,struct list *l)
{
int i=0,rozmiar;
struct node *el;
rozmiar=size_l(l);
if(l->head==NULL)
printf("Brak elementu - lista nie zawiera zadnych elementow!");
else if(n>=rozmiar)
printf("Podany indeks wykracza poza rozmiar listy!");
else if(l->head==l->tail)
printf("[%d] element: %d",n,l->head->val);
else
{
el=l->head;
while(i!=n)
{
el=el->next;
i++;
}
printf("[%d] element: %d",n,el->val);
}
}
void remove_el(int n,struct list *l)
{
int i=0,rozmiar;
struct node *el;
rozmiar=size_l(l);
if(l->head==NULL)
printf("Brak elementu - lista nie zawiera zadnych elementow!\n");
else if(n>=rozmiar)
printf("Podany indeks wykracza poza rozmiar listy!\n");
else if(l->head==l->tail)
{
printf("Usuwany [%d] element: %d\n",n,l->head->val);
free(l->head);
l->head=NULL;
l->tail=NULL;
}
else
{
if(n==0)
{
printf("Usuwany [%d] element: %d\n",n,l->head->val);
l->head=l->head->next;
free(l->head->prev);
l->head->prev=NULL;
}
else if(n==rozmiar-1)
{
printf("Usuwany [%d] element: %d\n",n,l->tail->val);
l->tail=l->tail->prev;
free(l->tail->next);
l->tail->next=NULL;
}
else
{
el=l->head;
while(i!=n)
{
el=el->next;
i++;
}
printf("Usuwany [%d] element: %d\n",n,el->val);
el->next->prev=el->prev;
el->prev->next=el->next;
free(el);
}
}
}
int size_l(struct list *l)
{
int rozmiar=0;
struct node *el;
el=l->head;
if(l->head==NULL)
return rozmiar;
do
{
rozmiar++;
el=el->next;
}
while(el!=l->tail->next);
return rozmiar;
}