Попытался реализовать односвязный список, функции добавления элемента в конец списка,в любое место списка. Скорее всего делаю что-то не так в main(), не могу понять что. Отладчиком пользовался, аварийно вылетает при вызове функций addToEnd(….),add(..). Скорее всего ошибка глупая, заранее спасибо.
typedef int type; struct node { type* data; node* next; }; void addToEnd(type* elem); void add(int afterIdx, type* elem); type* get(int idx); void set(int idx, type* elem); #include "linked_list.h" #include <stdio.h> #include <stdlib.h> node* first = NULL; //указатель на первый узел (Если указатель на первый элемент равен нулл это означет, что в списке нет элементов. ) void addToEnd(type* elem) { if (first) { //если указатель на первый элемент списка существует , т.е. не равен NULL) first = (node*)malloc(sizeof(node)); //выделяем память для указателя на первый элемент first->data = elem; //присваиваем значение первому элементу first->next = NULL;// присваиваем NULL т.к. не знаем указателя на следующий элемент и нам не надо с ним работать т.к. добавляем в конец } else { node* tmp = first; //создаем переменную ,в которой будет лежать указатель на первый элемент while (tmp->next) { // перебираем элементы в списке tmp = tmp->next; } node* newnode = (node*)malloc(sizeof(node)); // выделяем память для указателя на добавленный нами элемент newnode->data = elem; newnode->next = NULL; tmp->next = newnode;// делаем так,чтобы предпоследний элемент указывал на наш } } void add(int afterIdx, type* elem) { if (first) { first = (node*)malloc(sizeof(node)); first->data = elem; first->next = NULL; } else { int i = 0; node* tmp = first; while (i < afterIdx && tmp->next) //добираемся до элемента с необходимым номером { tmp = tmp->next; i++; } node* newnode = (node*)malloc(sizeof(node)); //выделяем память для добовляемого узла newnode->data = elem;//присваиваем значени в узле if (tmp->next) // если этот элемент в списке не последний выполняется условие { newnode->next = tmp->next; //новый узел будет указывать на следующий } else { newnode->next = NULL; //если добавляемый узел - последний элемент в списке } tmp->next = newnode; // элемент ,который сейчас находится перед добавляемым узлом должен указывать на него } } void set(int idx, type* elem) { if (!first) { int i = 0; node* tmp = first; while (i < idx&&tmp->next) { tmp = tmp->next; i++; } tmp->data = elem; } else printf("first = NULL"); } type* get(int idx) { if (!first) { int i = 0; node* tmp = first; while (i < idx && tmp->next) { tmp = tmp->next; i++; } printf("Value of %i is %d", idx, tmp->data); return tmp->data; } else printf("first = NULL"); } int main() { int N = 0; int data = 0; printf("Input count of elements"); scanf_s("%d", &N); for (int i = 0; i < N; i++) { printf("Input %i element", i + 1); scanf_s("%d", &data); add(i,&data); } system("pause"); return 0; }