Почему не работает добавление в двусвязном списке? - C (СИ)
Формулировка задачи:
У меня не работает функция добавления. Помогите найти ошибку. Программа запускается ввожу данные, и после того как введу последнее данное сразу выкидывает из программы. Тоесть функция ввода прорабатывает а добавление нет.Написать программу, обеспечивающую хранение информации, указанной в варианте, в виде двусторонне связанного списка и выполняющую следующие операции по манипулированию элементами списка:
1. добавление объекта в список;
2. удаление объектов из списка;
3. получение списка всех объектов;
4. обработка объектов по заданному в варианте критерию.
Программа должна иметь следующую файловую структуру:
1. файл, содержащий объявления функций, реализующих требуемую в задании функциональность;
2. файл, содержащий описание этих функций;
3. головной файл, реализующий интерфейс пользователя.
7 Сведения о сдаче студентами сессии:
• номер группы,
• фамилия студента,
• оценки по пяти экзаменам и пяти зачетам (“з” – зачет, “н” - незачет).
Выдать на печать следующую информацию:
• фамилии неуспевающих студентов с указанием номеров групп и количества задолженностей;
• средний балл, полученный каждым студентом группы Х и всей группы в целом.
мой код.(конкретно по добавлению)
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int main()
{ int x;
struct student S;
int p;
char c='y';
while(c=='y'||c=='Y')
{
system("cls");
printf("1 Add new element\n");
printf("2 Delete element\n");
printf("3 View the list\n");
printf("4 Print a list of underachieving students \n");
printf("5 Calculate the average score\n");
scanf("%d", &p);
switch (p)
{
case 1: {
Input();
printf("Element added.\n");}
break;
case 2: {
printf("Input surname \n");
scanf("%s", S.Name);
getchar();
del_obj(S.Name);
printf("Deleted.\n"); }
break;
case 3:
PrintList();
break;
case 4:
PrintNames();
break;
case 5: {
system("cls");
printf("Input number group \n");
scanf("%d", &x);
getchar();
PrintBall(x); }
break;
case 6:c='N';}
if (c!='N'){printf("Continue? Yes(Y) or No(N)\n");
scanf("%c",&c);}
}
}
#include <stdio.h>
#include <stdlib.h>
struct student
{
char *Name;
int Group;
int exam[3];
char pass[3];
};
struct obj
{
struct student S;
struct obj *next;
struct obj *prev;
};
struct obj* add_obj(char* Name,int Group, int exam, char pass);
struct obj* del_obj(char* Name);
void PrintList();
void Input();
void PrintNames();
void PrintBall(int X);
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
struct obj *head = NULL, *tail = NULL;
struct obj* add_obj(char* Name,int Group, int exam, char pass)
{
int i;
struct obj * current =(struct obj *)malloc(sizeof(struct obj));
current->S.Name=Name;
current->S.Group=Group;
current-> S.exam[i]=exam;
current->S.pass[i]=pass;
current->prev = tail;
current->next = NULL;
if(tail != NULL) tail->next = current;
if(head == NULL) head = current;
tail = current;
return current;
}
void Input() // ââîä Г*îâîãî ýëåìåГ*ГІГ* Г± ГЄГ«Г*ГўГЁГ*òóðû
{
struct student S ;
int i;
S.Name = 0;
S.Group = 0;
printf("Input Surname\n");
S.Name = (char*)malloc(sizeof(char)* 20);
scanf("%s", S.Name);
getchar();
printf("Input number group\n");
scanf("%d", &(S.Group));
getchar();
for (i = 0; i < 3; i++)
{
printf("Input the estimate for %d exam\n", i+1);
scanf("%d", &(S.exam[i]));
getchar();
}
for (i = 0; i < 3; i++)
{
printf("Input the estimate for %d setoff\n", i+1);
scanf("%s", &(S.pass[i]));
getchar();
}
add_obj(S.Name,S.Group,S.exam, S.pass);
}Решение задачи: «Почему не работает добавление в двусвязном списке?»
textual
Листинг программы
/* * dllist.h * * Double Linked List header file * */ #ifndef DLLIST_H #define DLLIST_H 1 typedef struct DLLIST dllist_t; typedef void * (*data_constructor_t)(const void *); typedef void (*data_destructor_t)(void *); typedef int (*data_comparator_t)(const void *, const void *); typedef void (*data_proc_t)(void *, void *); extern dllist_t * dllist_new(data_constructor_t, data_destructor_t); extern void dllist_free(dllist_t *); extern int dllist_add(dllist_t *, const void *); extern void * dllist_find(dllist_t *, const void *, data_comparator_t); extern int dllist_remove(dllist_t *, const void *, data_comparator_t); extern void dllist_foreach(dllist_t *, void *, data_proc_t); #endif /* DLLIST_H */