doubly linked list 검색

조회수 802회

doubly linked list 검색 도와주세요

doubly linked list 검색 부분 도와주세요 제가 코딩하면 무한 루프에 빠져서 돌아가질 않아요

/*
may.5
*/
#include <stdio.h>
#include <stdlib.h>

typedef float elem;
typedef struct node {
    elem data;
    struct node *left_link;
    struct node *right_link;
} node;
static elem count = 0;

//헤드 노드 초기화
void init(node *phead) {
    phead->left_link = phead;
    phead->right_link = phead;
}
//노드 삽입시 노드를 생성하는 함수
node *create(elem data) {
    node *new_node;
    new_node = (node *)malloc(sizeof(node));
    new_node->data = data;
    new_node->left_link = NULL;
    new_node->right_link = NULL;
    return new_node;
}
//해당하는 위치에 있는 노드를 구하는 함수
node *node_pos(node *pnode, int num) {
    int i;
    if (num == (count + 1)) {
        pnode = pnode->left_link;
    }
    else if (num <= (count + 1) / 2) {
        for (i = 0; i < num - 1; i++)
            pnode = pnode->right_link;
    }
    else {
        for (i = 0; i < 2 + (count - num); i++)
            pnode = pnode->left_link;
    }
    return pnode;
}
//삽입함수
void insert_node(node *p, node *new_node, int num) {
    if (num > count + 1) {
        printf("총 노드의 개수보다 높은 수를 입력하셨습니다.\n");
        exit(1);
    }
    if (num == 1) {
        new_node->left_link = p;
        new_node->right_link = p->right_link;
        p->right_link->left_link = new_node;
        p->right_link = new_node;
    }
    else {
        node *pnode = node_pos(p, num);
        new_node->left_link = pnode;
        new_node->right_link = pnode->right_link;
        pnode->right_link->left_link = new_node;
        pnode->right_link = new_node;
    }
    count++;
}

//삭제함수
void remove_node(node *p, int num) {
    node *remove = node_pos(p, num + 1);
    if (p->left_link == p->right_link) {
        printf("삭제할 노드가 없습니다.\n");
        exit(1);
    }
    else {
        count--;
        remove->left_link->right_link = remove->right_link;
        remove->right_link->left_link = remove->left_link;
        free(remove);
    }
}
//출력
void show_list(node *phead) {
    node *p;
    for (p = phead->right_link; p != phead; p = p->right_link) {
        printf("<<| %x | %.3f | %x |>> \n", p->left_link, p->data, p->right_link);
    }
    printf("\n");
}
//탐색
/*
void expl(node *p, int num) {

    }
}
*/
int main() {
    short pic = 0, pic2 = 0;
    float add_num = 0;
    int place = 0;

    node head_node;
    init(&head_node);

    while (1) {
        printf("실행할 동작을 선택\n");
        printf(
            "    1. 노드추가  2. 노드 삭제 3.노드 검색 4. 노드 출력 5. 종료 \n 메뉴를 "
            "선택하세요 : ");
        scanf_s("%hd", &pic);

        if (pic >= 1 && pic != 5) {
            switch (pic) {
            case 1:
                printf("삽입할 수 설정 : ");
                scanf_s("%f", &add_num);
                printf("삽입할 위치를 선택하시오\n");
                printf("1. 맨 앞, 2. 맨뒤, 3.사용자 위치 설정 : ");
                scanf_s("%hd", &pic2);
                if (pic2 == 1) {
                    insert_node(&head_node, create(add_num), 1);
                }
                else if (pic2 == 2) {
                    insert_node(&head_node, create(add_num), count + 1);
                }
                else if (pic2 == 3) {
                    printf("삽입할 위치를 설정 (1~ ) : ");
                    scanf_s("%d", &place);
                    insert_node(&head_node, create(add_num), place);
                }
                printf("삽입되었습니다.\n\n");
                place = 0;

                break;
            case 2:
                printf("제거할 위치를 설정 (1~ ) : ");
                scanf_s("%d", &place);
                remove_node(&head_node, place);

                printf("제거되었습니다.\n\n");
                break;
            case 3:
                printf("\n");
                printf("검색하실 위치를 정하시오 : ");
                scanf_s("%d", &place);
                printf("\n");
                printf("검색하신 위치에 값은 : ");
                //expl(&head_node,place);
                break;
            case 4:
                printf("\n");
                show_list(&head_node);
                break;

            default:
                printf("유효하지 않은 값입니다. 다시 입력해주십시오.\n\n");
                break;
            }
        }
        else if (pic == 5)
            break;
    }
    exit(1);
}

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

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

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

(ಠ_ಠ)
(ಠ‿ಠ)