2014-02-13 2 views
0

Я написал следующий код, который не работает. Приложение вылетает из метода печати. Любая идея, где это происходит не так?Указатели N связанный список в C

#include <stdio.h> 
#include <stdlib.h> 

typedef struct 
{ 
    int item; 
    struct LinkedList *Next; 
} LinkedList; 

int main() 
{ 
    LinkedList vaz; 
    vaz.item = 14123; 
    vaz.Next = 0; 
    add(&vaz,123); 
    add(&vaz,9223); 
    Print(&vaz); 
    return 0; 
} 
void Print(LinkedList* Val) 
{ 
    if(Val != 0){ 
     printf("%i\n",(*Val).item); 
     Print((*Val).Next); 
    } 
} 
void add(LinkedList *Head, int value) 
{ 
    if((*Head).Next == 0) 
    { 
     LinkedList sab; 
     sab.item = value; 
     sab.Next = 0; 
     (*Head).Next = &sab; 
    } 
    else{ 
     add((*Head).Next,value); 
    } 
} 

ответ

1

Вы не выделили кучную память связанного списка, который вы создали. Я думаю, вы должны выделить память в куче, когда добавляете элементы в связанный список. Переменная связанного списка 'sab' является локальной для метода, поэтому память освобождается, как только функция выходит за пределы области видимости.

Чтобы добавить элемент, вам нужно сделать следующее:

LinkedList *sab = (struct LinkedList*) malloc (sizeof(struct LinkedList)); 
if(sab != NULL) 
{ 
    sab->item = value; 
    sab->next = NULL; 
} 

Для получения более подробной информации, Вы можете обратиться: http://www.cprogramming.com/snippets/source-code/singly-linked-list-insert-remove-add-count

2

Ваш метод добавить должен выделить память динамически, вы используете автоматическое распределение (локальные переменные), которые освобождаются при выходе из функции. Это приведет к неопределенному поведению при попытке получить доступ к этой памяти позже.

void add(LinkedList *Head, int value) 
{ 
    if((*Head).Next == 0) 
    { 
     LinkedList sab; <-- need to be allocated dynamically 
     sab.item = value; 
     sab.Next = 0; 
     (*Head).Next = &sab; 
    } 
    else{ 
     add((*Head).Next,value); 
    } 
} 
1

add должен динамически выделять память следующим образом:

void add(LinkedList *Head, int value) 
{ 
    if (Head == NULL) 
     return; 

    if((*Head).Next == NULL) 
    { 
     LinkedList *sab = malloc(sizeof(LinkedList)); 

     if (sab == NULL) { 
      // Error: ran out of memory (really shouldn't happen, but could) 
      return; 
     } 

     (*sab).item = value; 
     (*sab).Next = NULL; 
     (*Head).Next = sab; 
    } 
    else{ 
     add((*Head).Next,value); 
    } 
} 

Кроме того, рекурсивный вызов "излишество" в этом случае. Простой цикл будет достаточно:

void add(LinkedList *Head, int value) 
{ 
    if (Head == NULL) 
     return; 

    while ((*Head).Next != NULL) 
     Head = (*Head).Next; 

    LinkedList *sab = malloc(sizeof(LinkedList)); 

    if (sab == NULL) { 
     // Error: ran out of memory (really shouldn't happen, but could) 
     return; 
    } 

    (*sab).item = value; 
    (*sab).Next = NULL; 
    (*Head).Next = sab; 
} 

Я бы также избежать рекурсивный вызов для печати:

void Print(LinkedList* Val) 
{ 
    while (Val != NULL) { 
     printf("%i\n", (*Val).item); 
     Val = (*Val).Next; 
    } 
} 

Если у вас есть функция, которая удаляет элементы из списка, вам необходимо убедиться, что вы делаете a free на указатель на этот элемент, который удален.

1

Ваш LinkedList *Head не имеет какой-либо памяти Сначала назначьте память к нему, как указано

ценам ниже
LinkedList *Head = (struct LinkedList*)malloc(sizeof(struct LinkedList)); 
Смежные вопросы