Застрял в странный цикл и нет файлов - PullRequest
0 голосов
/ 13 июня 2019

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