Реализация однонаправленного связного списка - C (СИ)
Формулировка задачи:
Здравствуйте! Пишу реализацию однонаправленного связанного списка.
Не могу определить в чем проблема реализации. Подскажите. Спасибо.
Пишет segmentation fault
#include <stdio.h>
#include <stdlib.h>
struct list {
struct list * next;
int content;
};
struct list * createList()
{
return (struct list *)malloc(sizeof(struct list *));
}
void addToList( struct list * lst, int content )
{
struct list * newList = createList();
newList->next = lst;
newList->content = content;
lst = newList;
}
void printList( struct list * lst )
{
if( lst == NULL )
return;
struct list * current = lst;
do{
printf("(%d,%p) ", current->content, current);
} while( (current=current->next)!= NULL );
printf("\n");
}
int main( int argc, char ** argv )
{
struct list * nl = createList();
addToList(nl,5);
addToList(nl,7);
addToList(nl,2);
addToList(nl,1);
addToList(nl,9);
addToList(nl,3);
printList(nl);
return 0;
}Решение задачи: «Реализация однонаправленного связного списка»
textual
Листинг программы
struct list {
struct list * next;
int content;
};
struct list * createList()
{
struct list * newList= (struct list *)malloc(sizeof(struct list));
newList->next = NULL;
newList->content = 0;
return newList;
}
void addToList(struct list ** lst, int content)
{
struct list * newList = createList();
newList->next = *lst;
newList->content = content;
*lst = newList;
}
void printList(struct list * lst)
{
if (lst == NULL)
return;
struct list * current = lst;
do {
printf("(%d,%p)\n", current->content, current);
current = current->next;
} while (current != NULL);
printf("\n");
}
int main(int argc, char ** argv)
{
struct list * nl = createList();
addToList(&nl, 5);
addToList(&nl, 7);
addToList(&nl, 2);
addToList(&nl, 1);
addToList(&nl, 9);
addToList(&nl, 3);
printList(nl);
return 0;
}
Объяснение кода листинга программы
- Структура связного списка
struct listобъявлена с полямиnextиcontent. - Функция
createListвыделяет память под новый элемент списка, инициализирует его поляnextиcontentи возвращает его адрес. - Функция
addToListпринимает указатель на голову списка и значение, которое нужно добавить в список. Создает новый элемент списка, инициализирует его поляnextиcontentи добавляет его в начало списка. - Функция
printListпринимает указатель на голову списка и выводит содержимое каждого элемента списка, пока не встретитNULL. - В функции
mainсоздается новый список, в который добавляются элементы со значениями 5, 7, 2, 1, 9, 3. - Затем вызывается функция
printList, чтобы вывести содержимое списка. - Наконец, функция
mainвозвращает0, завершая работу программы.