2014-07-14 4 views
0

링크 된 목록에 노드를 삽입하려고합니다. 노드를 앞에 삽입하고 노드의 끝과 노드 뒤에 삽입하려고했습니다. 코드가 잘 작동한다고 생각합니다. 그러나이 코드는 런타임 오류를 제공합니다. 런타임 오류가 발생하는 이유를 설명해주십시오.링크 된 목록에 삽입

Insertion in a linked list

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

// A linked list node 
struct node 
{ 
    int data; 
    struct node *next; 
}; 


void push(struct node* head, int new_data) 
{ 
/* 1. allocate node */ 
struct node* new_node = (struct node*) malloc(sizeof(struct node)); 

/* 2. put in the data */ 
new_node->data = new_data; 

/* 3. Make next of new node as head */ 
new_node->next = head; 

/* 4. move the head to point to the new node */ 
head = new_node; 
} 

/* Given a node prev_node, insert a new node after the given prev_node */ 
void insertAfter(struct node* prev_node, int new_data) 
{ 
/*1. check if the given prev_node is NULL */ 
if (prev_node == NULL) 
{ 
    printf("the given previous node cannot be NULL"); 
    return; 
} 

/* 2. allocate new node */ 
struct node* new_node =(struct node*) malloc(sizeof(struct node)); 

/* 3. put in the data */ 
new_node->data = new_data; 

/* 4. Make next of new node as next of prev_node */ 
new_node->next = prev_node->next; 

/* 5. move the next of prev_node as new_node */ 
prev_node->next = new_node; 
} 


void append(struct node* head, int new_data) 
{ 
/* 1. allocate node */ 
struct node* new_node = (struct node*) malloc(sizeof(struct node)); 

struct node *last = head; 

/* 2. put in the data */ 
new_node->data = new_data; 

/* 3. This new node is going to be the last node, so make next of it as NULL*/ 
new_node->next = NULL; 

/* 4. If the Linked List is empty, then make the new node as head */ 
if (head == NULL) 
{ 
    head = new_node; 
    return; 
} 

/* 5. Else traverse till the last node */ 
while (last->next != NULL) 
    last = last->next; 

/* 6. Change the next of last node */ 
last->next = new_node; 
return; 
} 

// This function prints contents of linked list starting from the given node 
void printList(struct node *node) 
{ 
    while (node != NULL) 
    { 
    printf(" %d ", node->data); 
    node = node->next; 
    } 
} 

/* Driver program to test above functions*/ 
int main() 
{ 
    /* Start with the empty list */ 
    struct node* head = NULL; 


    append(head, 6); 
    push(head, 7); 
    push(head, 1); 
    append(head, 4); 
    insertAfter(head->next, 8); 
    printf("\n Created Linked list is: "); 
    printList(head); 

    getchar(); 
    return 0; 
} 
+1

* "런타임 오류가 발생했습니다."* -> 오류 ** **! – delicateLatticeworkFever

+0

ideone 링크를 참조하십시오. 그것은 성공적으로 컴파일하지만 런타임 오류를 보여줍니다. [Ideone code] (http://ideone.com/AmzzSp) – user3087202

+0

거의 누구든지 컴파일 할 코드를 얻은 다음 런타임 오류가 발생합니다. '디버깅'이라는 개발 단계가 있다는 것을 알고 계십니까? –

답변

0

잃어버린 당신이 있어 모든 장소 당신의 head 포인터

당신은 *head(*prev_node)

를 사용하여 포인터 을, 모든 기능에서 해당 주소를 유지 struct node**를 사용하여 업데이트해야합니다

void push(struct node** head, int new_data) 
{ //... 
    // *head 
} 

void insertAfter(struct node** prev_node, int new_data) 
{ //... 
    // (*prev_node) 
} 

void append(struct node** head, int new_data) 
{ //... 
    // *head 
} 

here

PS를 참조하십시오가,

또한 논리적 실수를 할 당신이 모든 것을 완료하면 free() 호출을 사용하여 메모리를 해제하고 있는지 확인 할 수 있습니다.

+0

그러나 헤드 포인터에 대한 참조를 제공해야하는 이유는 무엇입니까? 나는 그것을 main() 함수에서 NULL로 만들었다. – user3087202

+0

@ user3087202 'head'의 주소를 전달해야합니다. withing 함수를 업데이트하는 것은 헤드 포인터의 로컬 복사본입니다. 'struct node ** head'는 노드에 대한 포인터 포인터를 의미합니다. 여기서 포인터는 노드 포인터의 주소를 전달한다고 가정합니다. – P0W

+0

감사합니다. 알았어! :) – user3087202