[C언어] 단순연결리스트 메모리 해제

조회수 3524회
#include<stdio.h>
#include<stdlib.h>

typedef struct ListNode {
    int data;
    struct ListNode* link;
}list;

typedef struct {
    list* head;
}list_h;

list_h* create() {
    list_h* L;
    L = (list_h*)malloc(sizeof(list_h*));
    L->head = NULL;
    return L;
}

void addLastNode(list_h* L, int x) {
    list* newNode = (list*)malloc(sizeof(list*));
    list* p;
    newNode->data = x;
    newNode->link = NULL;
    if (L->head == NULL) {
        L->head = newNode;
        return;
    }
    else {
        p = L->head;
        while (p->link != NULL) {
            p = p->link;
        }
        p->link = newNode;
    }
}

void freeList(list_h* L) {
    list* c;
    while (L->head != NULL) {
        c = L->head;
        L->head = L->head->link;
        free(c);
        c = NULL;
    }
}

void reverse(list_h* L) { //L->r->q->p
    list* p = L->head; 
    list* q = NULL; 
    list* r = NULL; 

    while (p != NULL) {
        r = q;
        q = p;
        p = p->link;
        q->link = r;
    }
    L->head = q;
}

void delLastNode(list_h* L) {
    list* a = L->head->link;
    list* b = L->head;
    if (L->head == NULL) return;
    if (L->head->link == NULL) {
        free(L->head);
        L->head = NULL;
        return;
    }
    else {
        while (a->link != NULL) {
            b = a;
            a = a->link;
        }
        free(a);
        b->link = NULL;
    }
}
void printList(list_h* L) {
    list* p = L->head;
    printf("L -> ");
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->link;
        if (p != NULL) printf("-> ");
    }
}
int main() {
    list_h* L;
    L = create();
    printf("1. 공백리스트 생성\n");
    printList(L);

    printf("2. 리스트에 노드 추가하기\n");
    addLastNode(L, 1);
    addLastNode(L, 2);
    addLastNode(L, 3);
    printList(L);

    printf("3. 마지막 노드 삭제하기\n");
    delLastNode(L);
    printList(L);

    printf("4. 리스트 원소를 역순으로 변경하기\n");
    reverse(L);
    printList(L);

    printf("5. 리스트 공간 해제, 공백리스트로 만들기\n");
    freeList(L);
    printList(L);

    return 0;
}

delLastNode함수와 freeList함수에서 free(L);가 예외발생하네요,,ㅠ 뭐가 잘못되었나요,,,

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 어떤 오류가 발생하는지 적어주세요. 알 수 없는 사용자 2018.3.21 12:16
  • 실행을 하면 예외가발생함 이라뜨고 중단점을 트리거했다고 하네요 ㅠㅠ 딱히 다른 말도 없어서 어찌해야 할지 모르겠어요 ㅠㅠ 알 수 없는 사용자 2018.3.22 19:15

1 답변

  • void addLastNode(list_h* L, int x) {
        list* newNode = (list*)malloc(sizeof(list*));
        ........
    }
    
    

    문제의 근원은 여기같네요.

    list* newNode = (list*)malloc(sizeof(list));
    

    로 수정하니 작성하신 메인함수는 잘 돌아가네요.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)