Вывод и вставка элементов односвязного списка

Вот так выглядит задание. Первую часть то я выполнил, со второй возникают

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <locale.h>
#include <string.h>
#define lenName 70
#define lenZnak 12


typedef struct znak {
    char* fio, * znak;
    int date[3];
}Znak;

typedef struct Node {
    Znak *znakInNode;
    struct Node* next;
} Node;


/*void insert(Node* head, int n, Znak* znak) {
    int i = 0;
    //head = head->next;
    Node* tmp = NULL;
    //Находим нужный элемент. Если вышли за пределы списка, то выходим из цикла,
    //ошибка выбрасываться не будет, произойдёт вставка в конец
    while (i < n && head->next) {
        head = head->next;
        i++;
    }
    tmp = (Node*)malloc(sizeof(Node));

    tmp->znakInNode = znak;
    //Если это не последний элемент, то next перекидываем на следующий узел
    if (head->next) {
        tmp->next = head->next;
        //иначе на NULL
    }
    else {
        tmp->next = NULL;
    }
    head->next = tmp;
}*/

Node* addElementInNPosition(Znak* znak, int n, Node* head)
{
    // Присваивание новому указателю указателя head. 
    // Присваивание выполняется для того, чтобы не потерять указатель на «голову» списка
    Node* p = head;
    // Счетчик
    int count = 1;
    // Поиск позиции n
    while (count < n-1)
    {
        if (p->next) {
            p = p->next;
            count++;
        }
    }
    // Выделение памяти под узел списка
    Node* tmp = (Node*)malloc(sizeof(Node));
    // Присваивание значения узлу
    tmp->znakInNode = znak;
    // Присваивание указателю tmp -> next значения указателя p -> next 
    // (созданный новый узел)
    tmp->next = p->next;
    // Присваивание указателю p -> next значения указателя tmp (созданный новый узел)
    p->next = tmp;
    return head;
}

Node* addFirstElement(Znak* znak, Node* head)
{
    // Выделение памяти под узел списка
    Node* tmp = (Node*)malloc(sizeof(Node));
    // Присваивание значения узлу
    tmp->znakInNode = znak;
    // Присваивание указателю на следующий элемент значения указателя на «голову» 
    // первоначального списка
    tmp->next = head;
    return(tmp);
}

/*Node* addElement(Znak* znak, Node* head, int pos)
{
    // Выделение памяти под узел списка
    Node* tmp = (Node*)malloc(sizeof(Node));
    // Присваивание значения узлу
    tmp->znakInNode = znak;
    // Присваивание указателю на следующий элемент значения указателя на «голову» 
    // первоначального списка
    tmp->next = head;
    return(tmp);
}*/

/*void printStruct(Znak* znak) {
    printf("%s\n%s\n%d.%d.%d\n", znak->fio, znak->znak, znak->date[0], znak->date[1],
        znak->date[2]);
}*/

void printLinkedList(const Node* head) {
    while (head) {
        printf("%s\n%s\n%d.%d.%d\n", head->znakInNode->fio, head->znakInNode->znak, head->znakInNode->date[0], head->znakInNode->date[1],
            head->znakInNode->date[2]);
        head = head->next;
    }
    printf("\n");
}

void printFiender(Node* node, int month) {
    Node* head = node;
    while (head != NULL)
    {
        if (month == head->znakInNode->date[1]) {
            // Вывод значения узла
            printf("%s\n%s\n%d.%d.%d\n%s\n", head->znakInNode->fio, head->znakInNode->znak, head->znakInNode->date[0], head->znakInNode->date[1],
                head->znakInNode->date[2], head->next);
                head = head->next;
        }
        else
        {
            printf("Людей с таким месяцем нет");
            head = head->next;
        }
    }
    // Сдвиг указателя к следующему узлу
}

printAllNode(Node* tmp) {
    while (tmp != NULL)
    {
        // Вывод значения узла
        printf("%s\n%s\n%d.%d.%d\n%s\n", tmp->znakInNode->fio, tmp->znakInNode->znak, tmp->znakInNode->date[0], tmp->znakInNode->date[1],
            tmp->znakInNode->date[2], tmp->next);
        // Сдвиг указателя к следующему узлу
        tmp = tmp->next;
    }
}

int queueZnak(char* a) {
    if (strcmp(a, "oven") == 0)
        return 1;
    else if (strcmp(a, "telets") == 0)
        return 2;
    else if (strcmp(a, "bliznettsi") == 0)
        return 3;
    else if (strcmp(a, "rak") == 0)
        return 4;
    else if (strcmp(a, "lev") == 0)
        return 5;
    else if (strcmp(a, "deva") == 0)
        return 6;
    else if (strcmp(a, "vesi") == 0)
        return 7;
    else if (strcmp(a, "skorpion") == 0)
        return 8;
    else if (strcmp(a, "strelets") == 0)
        return 9;
    else if (strcmp(a, "kozerog") == 0)
        return 10;
    else if (strcmp(a, "vodolei") == 0)
        return 11;
    else if (strcmp(a, "ribi") == 0)
        return 12;
}

void main() {

    setlocale(LC_ALL, "Rus");

    Node* node = NULL;
    Znak* znaks = calloc(lenZnak, sizeof(struct znak));

    char fio[lenName];
    char znak[lenName];
    int data[3];
    int breakInput = 1, structArrLenght = -1, month, weightZnak; //structArrLenght - количество элементов с одинаковыми полями в структуре
    int arrZnak[lenZnak] = {99,99,99,99,99,99,99,99,99,99,99,99};

    printf("Введите имя и фамилию %d человека:  ", 1);
    scanf_s("%s", fio, 50);
    znaks->fio = calloc(strlen(fio) + 1, sizeof(char));
    znaks->fio = strcpy(znaks->fio, fio);

    printf("Введите знак зодиака с маленькой буквы: ");
    scanf_s("%s", znak, 50);
    znaks->znak = calloc(strlen(znak) + 1, sizeof(char));
    znaks->znak = strcpy(znaks->znak, znak);

    for (int j = 0; j < 3; j++) {
        printf("Введите дату рождения %d: ", j + 1);
        scanf("%d", &znaks->date[j]);
        //znaks->date[j] = data[j];
    }

        node = addFirstElement(znaks, node);
        arrZnak[0] = queueZnak(node->znakInNode->znak);
        
        printAllNode(node);
    //Начало заполнения Списка
    printf("Вы желаете продолжить ввод данных? 0 - нет, 1 - да \n");
    scanf_s("%d", &breakInput);

    if (breakInput != 0) {
        for (int i = 1; i < lenZnak; i++) {

            printf("Введите имя и фамилию %d человека:  ", i + 1);
            scanf_s("%s", fio, 50);
            znaks->fio = strcpy(znaks->fio, fio);

            printf("Введите знак зодиака с маленькой буквы: ");
            scanf_s("%s", znak, 50);
            znaks->znak = strcpy(znaks->znak, znak);
        

            for (int j = 0; j < 3; j++) {
                printf("Введите дату рождения %d: ", j + 1);
                scanf("%d", &znaks->date[j]);
                //znaks->date[j] = data[j];
            }

            weightZnak = queueZnak(znaks->znak);

            arrZnak[i] = weightZnak;

            for (int i1 = 0; i1 < lenZnak; i1++) {
                int sorted = 1;
                for (int j1 = 1; j1 < lenZnak - i1; j1++) {
                    if (arrZnak[j1-1] > arrZnak[j1]) {
                        int temp = arrZnak[j1 - 1];
                        arrZnak[j1 - 1] = arrZnak[j1];
                        arrZnak[j1] = temp;
                    }
                }
                if (sorted) {
                    break;
                }
            }

            int position = -1;
            for (int k = 0; k < lenZnak; k++) {
                if (arrZnak[k] == weightZnak) {
                    position = k+1;
                    printf("%d\n", position);
                }
            }
            printf("%d\n", position);


        

            node = addElementInNPosition(node, znaks, position);

            //printAllNode(node);

            printf("Вы желаете продолжить ввод данных? 0 - нет, 1 - да \n");
            scanf_s("%d", &breakInput);

            if (breakInput == 0) {
                break;
            }
        }
    }

    printf("Введите месяц рождения, чтобы найти совпадения?\n");
    scanf("%d", &month);
    printLinkedList(node);
    //printFiender(node, month);
    //printAllNode(node);
}

`

Почему-то в функции addElementInNPosition выкидывается исключение, не могу понять почему, может мне кто-то объяснит, пожалуйставведите сюда описание изображения


Ответы (0 шт):