I am trying to load a file with data which are extracted in a data structure and edited inside the program but there are some problems. First and foremost I can't extract the data for some reason,no errors, just blank. Second I can't add a new node to the data structure,only one, and then I am stuck in an endless loop because it thinks I want to add something that already exists. Also, when the cases 3 or 2 are selected, I get segmentation fault
I have tried to find the problem with gdb but it didn't give me something useful, tried to switch the orientation of the data inside the file in many way and trigger each case in different order but in the end these problems persist.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define MAXSTRING 50
typedef struct{
char name[MAXSTRING];
int id;
} student;
typedef struct _node* node;
typedef struct _list* list;
struct _node {
student data;
node next;
};
struct _list {
node head;
int size;
};
list list_create(){
list l=(list) malloc(sizeof(struct _list));
assert(1);
l->head=malloc(sizeof(struct _node));
l->size=0;
return l;
}
void print(node st){
printf("Name:%s\tId:%.4d\n",st->data.name,st->data.id);
}
void printdata(list l){
int i;
node tmp=l->head;
for(i=0;i<l->size;i++){
print(tmp);
tmp=tmp->next;
}
}
void load(char*filename,list l){
FILE *fd=fopen(filename,"r");
node tmp=l->head;
rewind(fd);
if(fd==NULL){
printf("Error trying to open the file\n");
abort();
}
else{
while(!feof(fd)&&ferror(fd)){
fscanf(fd,"%s\t%d\n",tmp->data.name,&tmp->data.id);
tmp->next=(node)malloc(sizeof(struct _node));
assert(tmp->next);
tmp=tmp->next;
l->size++;
if (tmp==NULL){
printf("Error trying to allocate memory\n");
abort();
}
}
}
tmp->next=NULL;
fclose(fd);
}
int adddata(node st,list l){
st->next=l->head;
l->head=st;
l->size++;
return 0;
}
node findid(int id,list l){
node tmp=l->head;
while(tmp!=NULL){
if(tmp->data.id==id){
return tmp;
}
tmp=tmp->next;
}
return NULL;
}
int deletedata(node st,list l){
node tmp=l->head;
while(tmp->next!=st){
tmp=tmp->next;
}
tmp->next=st->next;
free(st);
l->size--;
return 0;
}
int updatedata(node st,list l){
printf("Give a name:\n");
scanf("%s",st->data.name);
printf("Give id:\n");
scanf("%d",&st->data.id);
return 0;
}
int main(int argc,char *argv[]){
list l=list_create();
if(argc!=2){
printf("Input Error\n");
}
load(argv[1],l);
node st=(node)malloc(sizeof(struct _node));
int action=1;
node found=(node)malloc(sizeof(struct _node));
if(st==NULL||found==NULL){
printf("Error trying to allocate memory");
return 0;
}
while(action>=1&&action<=7){
printMenu(); \\Prints the choices
scanf("%d",&action);
switch(action){
case 1: \\ add data
printf("Give name:\n");
scanf("%s",st->data.name);
printf("Give id\n");
scanf("%d",&st->data.id);
found=findid(st->data.id,l);
while(found!=NULL){
printf("This id already exists\n");
printf("give id\n");
scanf("%d",&st->data.id);
found=findid(st->data.id,l);
}
adddata(st,l);
break;
case 2: \\Delete data
printf("Give id\n");
scanf("%d",&st->data.id);
found=finddata(st->data.id,l);
if(found==NULL){
printf(This id doesn't exist\n");
}
else{
deletedata(found,l);
}
break;
case 3: \\Find data
printf("Give id\n");
scanf("%d",&st->data.id);
found=findid(st->data.id,l);
print(found);
break;
case 4: \\Change name and or id
printf("Give id\n");
scanf("%d",&st->data.id);
found=findid(st->data.id,l);
updatedata(found,l);
break;
case 5: \\Print one data
printf("Give id\n");
scanf("%d",&st->data.id);
found=findid(st->data.id,l);
print(found);
break;
case 6: \\Print all data
printdata(l);
break;
case 7: \\Terminate
action=8;
break;
default:
printf("Please give a valid option\n");
break;
}
}