Вывод и вставка элементов односвязного списка
#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 выкидывается исключение, не могу понять почему, может мне кто-то объяснит, пожалуйста
