Добавить элемент в список - C (СИ)

Узнай цену своей работы

Формулировка задачи:

У меня есть программа, двунаправленный список Она считывает из файла base, вот такую информацию:
Имя Фамилия номер оценка Имя Фамилия номер оценка и т.д.
далее выводит на экран. После я хочу добавить ещё один элемент к этому списку, добавляю, программа выводит его, но в файл он не записывается. Не получается реализовать запись. Подскажите пожалуйста. Почему-то не работает Пытаюсь реализизовать через fwrite Код программы:
#include <stdio.h>
#include <Strings.h>
#include <stdlib.h>
 
struct list
{
    int id;
    char data[100];
    int mark;
    struct list *next;
    struct list *last;
};
void output(struct list *head)
{
    while(head)
    {
        printf("\n%d %s %d", head->id, head->data, head->mark);
        head=head->next;
    }
}
void add(struct list *head)
{
    FILE *f=fopen("base.txt","a+");
    char name[50];
    char surname[25];
    printf("\nPlease type name, surname, id and mark\n");
    scanf("%s%s%d%d", name, surname, &head->id, &head->mark);
    strcat(name, " ");
    strcat(name, surname);
    strcpy(head->data, name);
    //fwrite((head->data, head->id, head->mark), 1, strlen(head->data), f); // вот тут пробую, но не получается. В этой строчки полно ошибок, но я попытался передать суть, того, что я хочу сделать. Помогите исправить. Запись в файл должна производиться с новой строчки каждый раз.
}
int main()
{
    struct list *item;
    struct list *n;
    struct list *l=NULL;
    FILE *f=fopen("base.txt","r+");
    char name[100];
    char surname[50];
    int x;
    while (!feof(f))
    {
        if(l==0)
        {
            item=(struct list*)malloc(sizeof(struct list));
            if(item==0) { printf("\nError"); return 0; }
            item->last=0;
            n=item;
        }
        else
        {
            item->next=(struct list*)malloc(sizeof(struct list));
            item=item->next;
            if(item==0) { printf("\nError"); return 0; }
            item->last=l;
        }
        fscanf(f,"%s%s%d%d", name, surname,&item->id,&item->mark);
        strcat(name," ");
        strcat(name,surname);
        strcpy(item->data,name);
        item->next=0;
        l=item;
 
    }
    do {
        output(n);
        printf("\n\n\*------Menu:------*");
        printf("\n1. Add person\n");
        scanf("%d", &x);
        switch(x)
        {
            case 1:
                l->next=(struct list*)malloc(sizeof(struct list));
                if (l->next==0) return 0;
                l->next->last=l;
                l=l->next;
                add(l);
                break;
        }
    } while (x!=4);
    while (n)
    {
        l=n;
        n=n->next;
        free(l);
    }
    return 0;
}

Решение задачи: «Добавить элемент в список»

textual
Листинг программы
#include <stdio.h>
#include <Strings.h>
#include <stdlib.h>
 
struct list
{
    int id;
    char data[100];
    int mark;
    struct list *next;
    struct list *last;
};
void output(struct list *head)
{
    while(head)
    {
        printf("\n%d %s %d", head->id, head->data, head->mark);
        head=head->next;
    }
}
void add(struct list *head)
{
    FILE *f=fopen("base.txt","a+");
    char name[50];
    char surname[25];
    printf("\nPlease type name, surname, id and mark\n");
    scanf("%s%s%d%d", name, surname, &head->id, &head->mark);
    strcat(name, " ");
    strcat(name, surname);
    strcpy(head->data, name);
    fprintf(f,"\n%s %s %d %d", name, surname, head->id, head->mark);
    fclose(f);
    //fwrite((head->data, head->id, head->mark), 1, strlen(head->data), f); // вот тут пробую, но не получается. В этой строчки полно ошибок, но я попытался передать суть, того, что я хочу сделать. Помогите исправить. Запись в файл должна производиться с новой строчки каждый раз.
}
int main()
{
    struct list *item;
    struct list *n;
    struct list *l=NULL;
    FILE *f=fopen("base.txt","r+");
    char name[100];
    char surname[50];
    int x;
    while (!feof(f))
    {
        if(l==0)
        {
            item=(struct list*)malloc(sizeof(struct list));
            if(item==0) { printf("\nError"); return 0; }
            item->last=0;
            n=item;
        }
        else
        {
            item->next=(struct list*)malloc(sizeof(struct list));
            item=item->next;
            if(item==0) { printf("\nError"); return 0; }
            item->last=l;
        }
        fscanf(f,"%s%s%d%d", name, surname,&item->id,&item->mark);
        strcat(name," ");
        strcat(name,surname);
        strcpy(item->data,name);
        item->next=0;
        l=item;
 
    }
    do {
        output(n);
        printf("\n\n\*------Menu:------*");
        printf("\n1. Add person\n");
        scanf("%d", &x);
        switch(x)
        {
            case 1:
                l->next=(struct list*)malloc(sizeof(struct list));
                if (l->next==0) return 0;
                l->next->last=l;
                l=l->next;
                add(l);
                break;
        }
    } while (x!=4);
    while (n)
    {
        l=n;
        n=n->next;
 
   free(l);
    }
    fclose(f);
    return 0;
}

Объяснение кода листинга программы

  1. В начале кода определена структура list для представления элементов списка.
  2. Функция output используется для вывода содержимого списка.
  3. Функция add используется для добавления нового элемента в список и записи этого элемента в файл base.txt.
  4. В функции main создается пустой список и открывается файл base.txt для чтения и записи.
  5. Затем происходит чтение данных из файла и добавление этих данных в список до тех пор, пока не будет достигнут конец файла.
  6. После этого пользователю предлагается выбрать действие из меню, где вариант 1 используется для добавления нового элемента в список.
  7. В случае выбора варианта 1, создается новый элемент, который добавляется в конец списка и затем добавляется в файл base.txt.
  8. После выхода из цикла do-while, список освобождается и файл закрывается.
  9. Возвращаемое значение функции main равно 0, что указывает на успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы