2014-02-13 2 views
0

다음 코드는 작동하지 않습니다. 응용 프로그램이 인쇄 메소드에서 충돌합니다. 어디서 잘못 되었습니까?포인터 C에서 N 연결된 목록

#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 Print(LinkedList* Val) 
{ 
    while (Val != NULL) { 
     printf("%i\n", (*Val).item); 
     Val = (*Val).Next; 
    } 
} 

, 당신은 당신이 할 수 있도록해야합니다

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; 
} 

내가 마찬가지로 인쇄 재귀 호출을 피할 것 제거 된 해당 항목에 대한 포인터에 free이 있습니다.

1

귀하의 LinkedList *Head

LinkedList *Head = (struct LinkedList*)malloc(sizeof(struct LinkedList)); 
below- 주어진 어떤 메모리가 첫째로 메모리를 할당하지 않습니다