편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2021.04.27

    원형연결리스트 질문입니다! 노드값을 삽입하니 프로그램종료가 되어버립니다.


    /*
     *  doubly circular linked list
     *
     *  Data Structures
     *
     *  Department of Computer Science
     *  at Chungbuk National University
     *
     */
    
    
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    /* 필요한 헤더파일 추가 */
    
    typedef struct Node {
        int key;
        char data[4];
        struct Node* llink;
        struct Node* rlink;
    } listNode;
    
    /* 함수 리스트 */
    int initialize(listNode** h);
    int freeList(listNode* h);
    int insertLast(listNode* h, int key);
    int deleteLast(listNode* h);
    int insertFirst(listNode* h, int key);
    int deleteFirst(listNode* h);
    int invertList(listNode* h);
    
    int insertNode(listNode* h, int key);
    int deleteNode(listNode* h, int key);
    
    void printList(listNode* h);
    
    
    
    int main()
    {
        char command;
        int key;
        listNode* headnode=NULL;
    
        do{
            printf("----------------------------------------------------------------\n");
            printf("                  Doubly Circular Linked List                   \n");
            printf("----------------------------------------------------------------\n");
            printf(" Initialize    = z           Print         = p \n");
            printf(" Insert Node   = i           Delete Node   = d \n");
            printf(" Insert Last   = n           Delete Last   = e\n");
            printf(" Insert First  = f           Delete First  = t\n");
            printf(" Invert List   = r           Quit          = q\n");
            printf("----------------------------------------------------------------\n");
    
            printf("성명: 신태양\n");
            printf("학번: 2017038096\n");
            printf("Command = ");
            scanf(" %c", &command);
    
            switch(command) {
            case 'z': case 'Z':
                initialize(&headnode);
                break;
            case 'p': case 'P':
                printList(headnode);
                break;
            case 'i': case 'I':
                printf("Your Key = ");
                scanf("%d", &key);
                insertNode(headnode, key);
                break;
            case 'd': case 'D':
                printf("Your Key = ");
                scanf("%d", &key);
                deleteNode(headnode, key);
                break;
            case 'n': case 'N':
                printf("Your Key = ");
                scanf("%d", &key);
                insertLast(headnode, key);
                break;
            case 'e': case 'E':
                deleteLast(headnode);
                break;
            case 'f': case 'F':
                printf("Your Key = ");
                scanf("%d", &key);
                insertFirst(headnode, key);
                break;
            case 't': case 'T':
                deleteFirst(headnode);
                break;
            case 'r': case 'R':
                invertList(headnode);
                break;
            case 'q': case 'Q':
                freeList(headnode);
                break;
            default:
                printf("\n       >>>>>   Concentration!!   <<<<<     \n");
                break;
            }
    
        }while(command != 'q' && command != 'Q');
    
        return 1;
    }
    
    
    int initialize(listNode** h) {
    
        /* headNode가 NULL이 아니면, freeNode를 호출하여 할당된 메모리 모두 해제 */
        if(*h != NULL)
            freeList(*h);
    
        /* headNode에 대한 메모리를 할당하여 리턴 */
        *h = (listNode*)malloc(sizeof(listNode));
        (*h)->rlink = *h;
        (*h)->llink = *h;
        (*h)->key = -9999;
        return 1;
    }
    
    /* 메모리 해제 */
    int freeList(listNode* h){
        listNode* p = h->rlink;
    
        listNode* prev = NULL;
        while(p != NULL) {
            prev = p;
            p = p->llink;
            free(prev);
        }
        free(h);
        return 0;
    }
    
    
    
    void printList(listNode* h) {
        int i = 0;
        listNode* p;
    
        printf("\n---PRINT\n");
    
        if(h == NULL) {
            printf("Nothing to print....\n");
            return;
        }
    
        p = h->rlink;
    
        while(p != NULL && p != h) {
            printf("[ [%d]=%d ] ", i, p->key);
            p = p->rlink;
            i++;
        }
        printf("  items = %d\n", i);
    
    
        /* print addresses */
        printf("\n---checking addresses of links\n");
        printf("-------------------------------\n");
        printf("head node: [llink]=%p, [head]=%p, [rlink]=%p\n", h->llink, h, h->rlink);
    
        i = 0;
        p = h->rlink;
        while(p != NULL && p != h) {
            printf("[ [%d]=%d ] [llink]=%p, [node]=%p, [rlink]=%p\n", i, p->key, p->llink, p, p->rlink);
            p = p->rlink;
            i++;
        }
    
    }
    
    
    
    /**
     * list에 key에 대한 노드하나를 추가
     */
    int insertLast(listNode* h, int key) {
        listNode* node;
        listNode* temp;
        node = (listNode*)malloc(sizeof(listNode));
        node -> llink = NULL;
        if(h -> rlink == NULL){
        h -> rlink = node;
        }
        temp = h -> rlink;
        while(temp -> llink != NULL)
        temp = temp -> llink;
        temp -> llink = node;
        return 1;
    }
    
    
    /**
     * list의 마지막 노드 삭제
     */
    int deleteLast(listNode* h) {
        listNode* prevNode;
        listNode* delNode;
        if(h -> rlink == NULL) return 0;
        if(h -> rlink -> llink == NULL) {
            free(h -> rlink);
            h -> rlink = NULL;
        }
         else {                //리스트에 노드가 2개 이상인 경우
            prevNode = h -> rlink;
            delNode = h -> rlink -> llink;
            while(delNode -> llink != NULL) {
                prevNode = delNode;
                delNode = delNode -> llink;
            }
            free(delNode);
            prevNode -> llink = NULL;
        }
    
        return 1;
    }
    
    
    /**
     * list 처음에 key에 대한 노드하나를 추가
     */
    int insertFirst(listNode* h, int key) {
        listNode* node = (listNode*)malloc(sizeof(listNode));
        node->key = key;
    
        node->llink = h->rlink;
        h->rlink = node;
        return 1;
    }
    
    /**
     * list의 첫번째 노드 삭제
     */
    int deleteFirst(listNode* h) {
        free(h);
    
        return 1;
    
    }
    
    
    /**
     * 리스트의 링크를 역순으로 재 배치
     */
    int invertList(listNode* h) {
        listNode* p;
        listNode* q;
        listNode* r;
    
        p = h -> rlink;
        q = NULL;
        r = NULL;
    
        while (p !=NULL){
            r = q;
            q = p;
            p = p -> llink;
            q -> llink = r;
        }
        h -> rlink = q;
    
        return 0;
    }
    
    
    
    /**
     *  리스트를 검색하여, 입력받은 key보다 큰값이 나오는 노드 바로 앞에 삽입 
     **/
    int insertNode(listNode* h, int key) {
        listNode* newNode;
        newNode = (listNode*)malloc(sizeof(listNode));
        if(h -> rlink == NULL){
            newNode -> rlink = NULL;
            newNode -> llink = NULL;
            h -> rlink = newNode;
        }
        else{
            newNode -> rlink;
            newNode -> llink;
            if(newNode -> rlink != NULL)
            newNode -> rlink -> llink = newNode;
        }
        return 0;
    }
    
    
    /**
     * list에서 key에 대한 노드 삭제
     */
    int deleteNode(listNode* h, int key) {
        listNode* pre;
        if(h -> rlink == NULL)
        if(h -> rlink -> llink == NULL){
            free(h -> rlink);
            h -> rlink = NULL;
        }
        else {
            pre = h -> rlink;
            pre = pre -> llink;
        }
        pre -> llink;
        h -> rlink; 
        return 0;
    }
    

    이미지

    실행하고 초기화해준 다음 프린트하고 i키를 눌러서 i값을 삽입해주면 바로 프로그램이 종료되어버립니다. 왜 이럴까요?

  • 프로필 알 수 없는 사용자님의 편집
    날짜2021.04.27

    원형연결리스트 질문입니다! 노드값을 삽입하니 프로그램종료가 되어버립니다 ㅠㅠ


    /*

    • doubly circular linked list *
    • Data Structures *
    • Department of Computer Science
    • at Chungbuk National University * */

    include

    include

    include

    /* 필요한 헤더파일 추가 */

    typedef struct Node { int key; char data[4]; struct Node* llink; struct Node* rlink; } listNode;

    /* 함수 리스트 / int initialize(listNode* h); int freeList(listNode* h); int insertLast(listNode* h, int key); int deleteLast(listNode* h); int insertFirst(listNode* h, int key); int deleteFirst(listNode* h); int invertList(listNode* h);

    int insertNode(listNode* h, int key); int deleteNode(listNode* h, int key);

    void printList(listNode* h);

    int main() { char command; int key; listNode* headnode=NULL;

    do{
        printf("----------------------------------------------------------------\n");
        printf("                  Doubly Circular Linked List                   \n");
        printf("----------------------------------------------------------------\n");
        printf(" Initialize    = z           Print         = p \n");
        printf(" Insert Node   = i           Delete Node   = d \n");
        printf(" Insert Last   = n           Delete Last   = e\n");
        printf(" Insert First  = f           Delete First  = t\n");
        printf(" Invert List   = r           Quit          = q\n");
        printf("----------------------------------------------------------------\n");
    
        printf("성명: 신태양\n");
        printf("학번: 2017038096\n");
        printf("Command = ");
        scanf(" %c", &command);
    
        switch(command) {
        case 'z': case 'Z':
            initialize(&headnode);
            break;
        case 'p': case 'P':
            printList(headnode);
            break;
        case 'i': case 'I':
            printf("Your Key = ");
            scanf("%d", &key);
            insertNode(headnode, key);
            break;
        case 'd': case 'D':
            printf("Your Key = ");
            scanf("%d", &key);
            deleteNode(headnode, key);
            break;
        case 'n': case 'N':
            printf("Your Key = ");
            scanf("%d", &key);
            insertLast(headnode, key);
            break;
        case 'e': case 'E':
            deleteLast(headnode);
            break;
        case 'f': case 'F':
            printf("Your Key = ");
            scanf("%d", &key);
            insertFirst(headnode, key);
            break;
        case 't': case 'T':
            deleteFirst(headnode);
            break;
        case 'r': case 'R':
            invertList(headnode);
            break;
        case 'q': case 'Q':
            freeList(headnode);
            break;
        default:
            printf("\n       >>>>>   Concentration!!   <<<<<     \n");
            break;
        }
    
    }while(command != 'q' && command != 'Q');
    
    return 1;
    

    }

    int initialize(listNode** h) {

    /* headNode가 NULL이 아니면, freeNode를 호출하여 할당된 메모리 모두 해제 */
    if(*h != NULL)
        freeList(*h);
    
    /* headNode에 대한 메모리를 할당하여 리턴 */
    *h = (listNode*)malloc(sizeof(listNode));
    (*h)->rlink = *h;
    (*h)->llink = *h;
    (*h)->key = -9999;
    return 1;
    

    }

    /* 메모리 해제 / int freeList(listNode h){ listNode* p = h->rlink;

    listNode* prev = NULL;
    while(p != NULL) {
        prev = p;
        p = p->llink;
        free(prev);
    }
    free(h);
    return 0;
    

    }

    void printList(listNode* h) { int i = 0; listNode* p;

    printf("\n---PRINT\n");
    
    if(h == NULL) {
        printf("Nothing to print....\n");
        return;
    }
    
    p = h->rlink;
    
    while(p != NULL && p != h) {
        printf("[ [%d]=%d ] ", i, p->key);
        p = p->rlink;
        i++;
    }
    printf("  items = %d\n", i);
    
    
    /* print addresses */
    printf("\n---checking addresses of links\n");
    printf("-------------------------------\n");
    printf("head node: [llink]=%p, [head]=%p, [rlink]=%p\n", h->llink, h, h->rlink);
    
    i = 0;
    p = h->rlink;
    while(p != NULL && p != h) {
        printf("[ [%d]=%d ] [llink]=%p, [node]=%p, [rlink]=%p\n", i, p->key, p->llink, p, p->rlink);
        p = p->rlink;
        i++;
    }
    

    }

    /**

    • list에 key에 대한 노드하나를 추가 / int insertLast(listNode h, int key) { listNode* node; listNode* temp; node = (listNode*)malloc(sizeof(listNode)); node -> llink = NULL; if(h -> rlink == NULL){ h -> rlink = node; } temp = h -> rlink; while(temp -> llink != NULL) temp = temp -> llink; temp -> llink = node; return 1; }

    /**

    • list의 마지막 노드 삭제 / int deleteLast(listNode h) { listNode* prevNode; listNode* delNode; if(h -> rlink == NULL) return 0; if(h -> rlink -> llink == NULL) { free(h -> rlink); h -> rlink = NULL; } else { //리스트에 노드가 2개 이상인 경우 prevNode = h -> rlink; delNode = h -> rlink -> llink; while(delNode -> llink != NULL) { prevNode = delNode; delNode = delNode -> llink; } free(delNode); prevNode -> llink = NULL; }

      return 1; }

    /**

    • list 처음에 key에 대한 노드하나를 추가 / int insertFirst(listNode h, int key) { listNode* node = (listNode*)malloc(sizeof(listNode)); node->key = key;

      node->llink = h->rlink; h->rlink = node; return 1; }

    /**

    • list의 첫번째 노드 삭제 / int deleteFirst(listNode h) { free(h);

      return 1;

    }

    /**

    • 리스트의 링크를 역순으로 재 배치 / int invertList(listNode h) { listNode* p; listNode* q; listNode* r;

      p = h -> rlink; q = NULL; r = NULL;

      while (p !=NULL){ r = q; q = p; p = p -> llink; q -> llink = r; } h -> rlink = q;

      return 0; }

    /**

    • 리스트를 검색하여, 입력받은 key보다 큰값이 나오는 노드 바로 앞에 삽입 */ int insertNode(listNode h, int key) { listNode* newNode; newNode = (listNode*)malloc(sizeof(listNode)); if(h -> rlink == NULL){ newNode -> rlink = NULL; newNode -> llink = NULL; h -> rlink = newNode; } else{ newNode -> rlink; newNode -> llink; if(newNode -> rlink != NULL) newNode -> rlink -> llink = newNode; } return 0; }

    /**

    • list에서 key에 대한 노드 삭제 / int deleteNode(listNode h, int key) { listNode* pre; if(h -> rlink == NULL) if(h -> rlink -> llink == NULL){ free(h -> rlink); h -> rlink = NULL; } else { pre = h -> rlink; pre = pre -> llink; } pre -> llink; h -> rlink; return 0; }

    이미지

    실행하고 초기화해준다음 프린트하고 i키를 눌러서 i값을 삽입해주면 바로 프로그램이 종료되어버립니다 ... 왜이럴까요?