Inserted list in this case are structures who's variables = 1,2,3,4, respectively. SO the idea is:
1--> <--2 --> <-- 3 --> <--4
(--> is the "next*" pointer, <-- is the "prev*" pointer)
If used to delete 1,2,3, it doesnt give segmentation fault, but it sets the variables within the structures to 0, doesnt delete the structure.
If used to delete the last element (whose variables=4), it gives segmentation fault.
Plz tell me what's wrong / how I could improve / correct the way Im using dynamic lists, etc. All constructive help is greatly apreciated.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct p{
float x,y,z;
char s;
struct p* next;
struct p* prev;
}DATA;
typedef DATA* LISTA_DATA;
void alloc_data(LISTA_DATA* lista_data, LISTA_DATA prev, float i)
{
if(*lista_data==NULL)
{*lista_data=(LISTA_DATA)malloc(sizeof(DATA));
if(*lista_data!=NULL)
{(**lista_data).x=i;
(**lista_data).y=i;
(**lista_data).z=i;
(**lista_data).s='C';
(**lista_data).next=NULL;
(**lista_data).prev=prev;
}
else
printf("\nError alocating memory");
}
else
alloc_data(&(**lista_data).next,*lista_data, i);
}
void initate_data(LISTA_DATA* lista_data)
{ int i=0;
for(i=0; i<5; i++)
alloc_data(lista_data, NULL, i);
}
void show_data(LISTA_DATA lista_data)
{
if(lista_data==NULL) return;
printf("\n%f %f %f %c\n", (*lista_data).x,(*lista_data).y,(*lista_data).z,(*lista_data).s);
show_data((*lista_data).next);
}
void delete_data(LISTA_DATA* lista_data, float number)
{
LISTA_DATA temp=NULL;
if(*lista_data==NULL) return;
else if((**lista_data).x==number)
{temp=*lista_data;
if((**lista_data).prev!=NULL)
{(*(**lista_data).prev).next=(**lista_data).next;}
if((**lista_data).next!=NULL)
{(*(**lista_data).next).prev=(**lista_data).prev;}
if((**lista_data).prev==NULL)
*lista_data=(**lista_data).next;
if(temp!=NULL)
{free(temp);
temp=NULL;}
}
else
if((**lista_data).next!=NULL)
delete_data(&(**lista_data).next, number);
}
int main(){
LISTA_DATA lista_data=NULL;
initate_data(&lista_data);
show_data(lista_data);
printf("\n Expected 0 1 2 3 4 3 2 1 0:");
printf("\n %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f \n",
(*lista_data).x,
(*(*lista_data).next).x,
(*(*(*lista_data).next).next).x,
(*(*(*(*lista_data).next).next).next).x,
(*(*(*(*(*lista_data).next).next).next).next).x,
(*(*(*(*(*(*lista_data).next).next).next).next).prev).x,
(*(*(*(*(*(*(*lista_data).next).next).next).next).prev).prev).x,
(*(*(*(*(*(*(*(*lista_data).next).next).next).next).prev).prev).prev).x,
(*(*(*(*(*(*(*(*(*lista_data).next).next).next).next).prev).prev).prev).prev).x);
/*WORKING*/
printf("\n DATA 0 1 2 3 ");
delete_data(&lista_data,4);/*segmentation fault*/
show_data(lista_data);
/*FRAKKED UP*/
/* printf("\n DATA 0 1 3 ");
delete_data(&lista_data,2);
show_data(lista_data);
printf("\n DATA 0 3 ");
delete_data(&lista_data,1);
show_data(lista_data);
printf("\n DATA 3 ");
delete_data(&lista_data,1);
show_data(lista_data);
*/
free(lista_data);
return 0;
}
(the printf function was to test if the pointers next and prev were working)
Edited by Ennerggie, 20 February 2012 - 05:03 AM.


Sign In
Create Account

Back to top









