Я пытаюсь загрузить файл с данными, которые извлечены в структуру данных и отредактированы внутри программы, но есть некоторые проблемы.Прежде всего, я не могу извлечь данные по какой-то причине, без ошибок, просто пусто.Во-вторых, я не могу добавить новый узел в структуру данных, только один, и затем я застрял в бесконечном цикле, потому что он думает, что я хочу добавить что-то, что уже существует.Кроме того, когда выбираются случаи 3 или 2, я получаю ошибку сегментации
Я пытался найти проблему с GDB, но это не дало мне ничего полезного, пытался переключить ориентацию данных внутриПо-разному регистрировать файлы и инициировать каждый случай в другом порядке, но в итоге эти проблемы сохраняются.
#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;
}
}