CS/자료구조

[자료구조] 연결리스트(Linked List)

하늘아래현서 2022. 6. 9. 16:32
//연결리스트

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

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

//노드 생성 함수
ListNode* create_node(int data){
    ListNode* node;
    node = (ListNode*)malloc(sizeof(ListNode));
    node->data = data;
    node->link = NULL;
    
    return node;
}

//노드를 제일 앞에 삽입하는 함수
//삽입하는 노드가 head가 된다.
ListNode* insert_first(ListNode* head){
    int data;
    ListNode* new_node;
    
    printf("input data : ");
    scanf("%d", &data);
    
    new_node = create_node(data);
    
    if(head == NULL){
        head = new_node;
    }else{
        new_node->link = head;
        head = new_node;
    }
    
    return head;
}

//노드를 찾는 함수
ListNode* search_node(ListNode* head){
    int data;
    ListNode* pre_node = NULL;
    
    printf("which data do you search? ");
    scanf("%d", &data);
    
    //head가 NULL일 때
    if(head == NULL){
        return NULL;
    //찾는 data가 head일 때 head 리턴
    }else if(head->data == data){
        return head;
    }
    
    //data 찾기
    while(head->data != data && head->link != NULL){
        pre_node = head;
        head = head->link;
    }
    
    //찾는 데이터의 전 노드 리턴
    if(head->data == data){
        return pre_node;
    //찾는 데이터가 없을 때 NULL 리턴
    }else{
        return NULL;
    }
}

//노드 중간에 삽입하는 함수
ListNode* insert(ListNode* head){
    ListNode* pre_node;
    ListNode* new_node;
    ListNode* temp;
    int data;
    
    printf("input data : ");
    scanf("%d", &data);
    new_node = create_node(data);
    
    pre_node = search_node(head);
    
    //찾은 데이터가 head일 경우
    if(pre_node == head){
        new_node->link = head;
        return new_node;
    
    //찾는 데이터가 없을 경우 맨 뒤에 삽입
    }else if(pre_node == NULL){
        pre_node = head;
        while(pre_node != NULL){
            temp = pre_node;
            pre_node = pre_node->link;
        }
        temp->link = new_node;
        return head;
        
    //찾은 데이터가 있을 경우 찾은 데이터 뒤에 삽입
    }else{
        new_node->link = pre_node->link;
        pre_node->link = new_node;
        return head;
    }
}

//맨 앞 노드 삭제하는 함수
ListNode* delete_first(ListNode* head){
    ListNode* temp;
    
    if(head == NULL){
        return NULL;
    }
    
    temp = head;
    head = head->link;
    free(temp);
    
    return head;
}

//전체 노드를 출력하는 함수
void print_node(ListNode* head){
    while(head != NULL){
        printf("%d ", head->data);
        head = head->link;
    }
    printf("\n");
}

int main(int argc, const char * argv[]) {
    ListNode* head = NULL;
    ListNode* pre_node;
    int menu;
    
    do{
        printf("========================\n");
        printf("1.insert_first 2.insert\n3.delete_first 4.delete\n5.search 6.reverse\n7.print_node 8.end\n");
        printf("========================\n");
        printf("menu : ");
        scanf("%d", &menu);
        
        if(menu == 1){
            head = insert_first(head);
        }else if(menu == 2){
            head = insert(head);
        }else if(menu == 3){
            head = delete_first(head);
        }else if(menu == 4){
            //head = delete_node(head);
        }else if(menu == 5){
            pre_node = search_node(head);
            if(pre_node == NULL){
                printf("no data\n");
            }else{
                printf("data is %d\n", pre_node->data);
            }
        }else if(menu == 6){
            //reverse(head);
        }else if(menu == 7){
            print_node(head);
        }
    }while(menu != 8);
}