링크드 리스트 구현과 관련해서

출력이 되지 않는 오류가 발생해서 지피티에게 코드 리뷰를 부탁했다.

 c언어로 코드를 작성했고,

함수로는 리스트 노드를 만드는 create_Node(), 노드를 뒤에 삽입하는 insert(), 노드를 삭제하는 delete(),

연결리스트를 출력하는 print_Node()함수를 구현했다.

노드 탐색과 노드를 중간에 삽입하는 함수의 구현은 나중에 추가할 예정이다.

내가 작성한 코드는 아래와 같다.


내가 작성한 코드

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

// 노드 구조체 선언 
typedef struct tagNode{
    int data;
    struct tagNode* next;
}Node;

// 노드 생성하는 함수
Node* create_Node(int data){
    Node* NewNode = (Node*)malloc(sizeof(Node)); //malloc을 통한 동적할당
    NewNode->data = data; //NewNode의 data에 입력값 할당
    NewNode->next = NULL; //노드의 초기 상태이므로 다음 노드를 지정하는 포인터에는 NULL할당

    return NewNode;
}

// 노드를 추가 연결하는 함수
void insert(Node** head, Node* newNode){
    if (*head == NULL) //헤드에 연결된 노드가 없다면
        *head = newNode; //newNode가 헤드가 된다.
    else{ // 연결된 노드가 있다면
        Node* current = *head; //current에 head값 할당
        while(current!=NULL){ //current가 NUll이 아닐때까지
            current = current->next; //current는 current 다음 노드로 이동
        }
        current = newNode->next; //current는 newNode의 다음 노드
    }
}

// 리스트를 삭제하는 함수
void delete(Node** head){
    free(*head); //free를 통한 메모리 해제
}

// 리스트를 출력하는 함수
void print_Node(Node **head){
    Node *current = *head; //current에 head값 할당
    while(current != NULL){ //current가 NULL이 아닐 때까지 반복
        printf("%d",current->data); //current가 지시하는 data 출력
    }
    current = current->next; //current를 다음 노드로 이동
}

int main() {

    Node** List = NULL;
    Node* new = create_Node(3);
    insert(List, new);
    print_Node(List);
        
    return 0;
}

 코드를 실행했는데 출력이 되지 않아서 문제점을 짚어주도록 지피티에게 요청했다.


지피티가 말해준 문제점과 개선 코드

 

지피티는 다음과 같은 점을 말해주었다.

네 코드를 살펴보겠습니다. 몇 가지 문제가 있네요:

  1. insert 함수에서 새로운 노드를 연결 리스트에 삽입하는 부분이 잘못되었습니다. current를 새로운 노드의 next로 설정하는 대신, current가 마지막 노드를 가리키도록 해야 합니다.

  2. delete 함수에서는 연결 리스트의 노드를 삭제하는데, 현재 구현은 헤드 노드만 삭제하고 나머지 노드들은 해제하지 않습니다.

  3. print_Node 함수에서도 일부 문제가 있습니다. 노드를 이동시키는 부분이 빠져있어서 무한루프에 빠질 수 있습니다.

  4. main 함수에서 연결 리스트의 헤드를 가리키는 이중 포인터인 List를 초기화하지 않았습니다.


지피티가 말한 문제점을 개선한 코드

 

지피티가 말한 문제점을 인식하고 이를 반영하여 코드를 조금 수정해보았다.

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

//Node 구조체 선언
typedef struct tagNode{
    int data;
    struct tagNode* next;
}Node;

// Node 만드는 함수
Node* create_Node(int data){
    Node* NewNode = (Node*)malloc(sizeof(Node)); // 동적할당
    NewNode->data = data; // data값 할당
    NewNode->next = NULL; // Node 초기화 상태이므로 다음 노드에 연결은 NULL로 선언

    return NewNode;
}

//노드를 추가 삽입하는 함수
void insert(Node** head, Node* newNode){
    if (*head == NULL) //헤드에 연결된 노드가 없다면
        *head = newNode; // newNode를 헤드에 할당
    else{ // 헤드에 연결된 노드가 있다면
        Node* current = *head; // current에 head가 지시하는 주소 할당
        while(current->next != NULL){ // current의 다음 노드가 없을 때까지
            current = current->next; // current에 current 다음 노드 할당
        }
        current->next = newNode; // current의 뒤에 더 이상 노드가 없다면 newNode를 다음노드로 지정
    }
}

// 리스트를 지우는 함수
void delete(Node** head){
    free(*head); // free함수로 메모리 해제
    *head = NULL; // 헤드가 가리키는 노드도 초기화
}

// 리스트에 있는 노드를 모두 출력하는 함수
void print_Node(Node **head){
    Node *current = *head; // current에 헤드가 지시하는 주소 할당
    while(current != NULL){ // current 다음 노드가 없을 때까지
        printf("%d",current->data); // current가 가리키는 data값 출력
        current = current->next; // current에 다음 노드 할당, 다음으로 이동
    }
    printf("\n");
}

int main() {

    Node* List = NULL; //List 초기화
    Node* new = create_Node(3); // data가 3인 노드 만들기
    insert(&List, new); // 만든 노드를 리스트에 삽입
    Node* new02 = create_Node(4); // data가 4인 노드 만들기
    insert(&List, new02); // 만든 노드를 리스트에 삽입
    print_Node(&List); // 리스트 출력

    delete(&List); // 리스트 지우기
        
    return 0;
}

 그리고 실행을 해보니 잘 돌아가는 것을 확인할 수 있었다.

연결리스트_출력