편집 기록

편집 기록
  • 프로필 유동욱님의 편집
    날짜2018.11.03

    c언어 단순연결리스트 질문


    #include <stdio.h>
    #include <stdlib.h>
    typedef struct node {
        int data;
        struct node *link;
    }node; //노드 타입 정의
    void makeList(node **); // 리스트 생성 함수. 전달인자: 헤더 포인터의 포인터
    void viewList(node *); // 리스트 출력 함수
    node * findLast(node *); /* 리스트 마지막 노드를 찾는 함수로 그 노드의 포인터 리턴
                             전달인자 : 헤더 포인터 값 */
    int findPosition(node *, node **, node **, int);
    /* 입력 데이터와 같은 데이터를 포함하는 노드의 포인터 및 그 이전 노드의 포인터를 찾는 함수.
    전달인자: 헤더포인터, 이전노드 포인터, 타깃 포인터, 찾기 원하는 데이터 */
    void insertList(node **, node *, int);
    /* 리스트 삽입함수 전달인자: 헤터 포인터의 포인터, 타깃 포인터, 삽입데이터 */
    void deleteList(node **, node *, node *);
    /* 리스트 삭제함수 전달인자: 헤더 포인터의 포인터, 이전포인터, 타깃포인터 */
    void main() {
        node *head = NULL;
        node *pre = NULL;
        node *targetPtr = NULL;
        int newData, target;
        int found;
        // 노드 생성
        makeList(&head);
        // 생성된 리스트 출력
        viewList(head);
        fflush(stdin);
        // 데이터 삽입
        printf("Enter data to insert :\n");
        scanf_s("%d", &newData);
        printf("어디 다음에 삽입할까요 : < 첫음에 입력을 원하면 -1 입력>\n");
        scanf_s("%d", &target);
        if (target == -1) {
            targetPtr == NULL;
            insertList(&head, targetPtr, newData);
        }
        else {
            found = 0;
            found = findPosition(head, &pre, &targetPtr, target);
            if (found == 1)
                insertList(&head, targetPtr, newData);
            else
                printf("There is no %d in the list\n", target);
        }
        viewList(head);
        // delete list
        printf("Enter data to delete from list\n");
        scanf_s("%d", &target);
        printf("targeted data is %d\n", target);
        found = 0;
        found = findPosition(head, &pre, &targetPtr, target);
        printf("data is %d in the list", found);
        printf("found data is %d\n", targetPtr->data);
        if (found == 1)
            deleteList(&head, pre, targetPtr);
        else
            printf("There is no %d in the list\n", target);
        // View list data
        viewList(head);
    }
    node * findLast(node *hptr) {
        if (hptr != NULL) { hptr = hptr->link; findLast(hptr); }//만약 헤더가 널이 아니면 마지막 노드까지 포인터 이동//
        return hptr;//리턴 hptr
    }
    int findPosition(node *hptr, node ** pre, node **targetPtr, int data) {
        *pre = NULL;
        *targetPtr = NULL;
        while (hptr != NULL && hptr->data != data) { //hptr값이 널이 아니고 hptr->data값이 찾는 데이터가 아닐동안
            *pre = hptr;//*pre값 = hptr값
            hptr = hptr->link;//hptr은 다음 노드로 이동
            if (hptr->data == data) {//만약 hptr->data와 data의 값이 같으면
                *targetPtr = hptr;//*targetPtr값 = hptr
                return 1;
            }//리턴 1
            else {
                return 0;
            }//그렇지 않으면
            //리턴 0
        }
    }
    void insertList(node **hptr, node *pptr, int data) {
        node * new;
        new->data = data; new->link = NULL;//새로운 노드 생성
        if (*hptr == NULL) {//만약 *hptr 값이 널이면 현재 empty 이므로
            *hptr = new->link;//*hptr이 new를 가리키게 함
        }
    
        else if (pptr == NULL) {//만약 pptr값이 널이면 처음에 입력해야 함으로
            new->link = *hptr;//새로운 노드의링크, 즉 new->link는 *hptr값으로 함
            *hptr = new;
        }
        else {//그렇지 않다면, 즉 리스트 중간에 삽입해야 함으로
            new->link = pptr->link;//new->link 의 값은 pptr의 링크 값이며
            pptr->link = new;//pptr->link 는 new의 값으로 함
    
        }
    }
    void deleteList(node **hptr, node *pre, node *target) {
        if (pre == NULL) {
            *hptr = target->link;
        }
        else {
            pre->link = target->link;
        }
        free(target);
    }
    void makeList(node **hptr) {
        node *pre = NULL;
        node *new = NULL;
        int data;
        findLast(node *pre);//findLast를 이용하여 리스트 마지막 노드 포인터값을 pre에 저장
        printf("입력할 데이터 는 < enter -1 to end>\n");
        scanf("%d", &data);
        while (data != -1) {
            insertList(hptr, pre, data);
            if (pre->link == NULL) {//리스트 마지막 노드 포인터 확인
                printf("Enter data again\n");
                scanf("%d", &data);
            }
        }
    }
    void viewList(node *ptr) {
        while (ptr != NULL) {
            printf("%d ", ptr->data);
            ptr = ptr->link;
        }
    }
    

    에러가 수정이 안돼요 ㅠㅠ

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

    c언어 단순연결리스트 질문


    include

    include

    typedef struct node { int data; struct node link; }node; //노드 타입 정의 void makeList(node *); // 리스트 생성 함수. 전달인자: 헤더 포인터의 포인터 void viewList(node ); // 리스트 출력 함수 node * findLast(node *); / 리스트 마지막 노드를 찾는 함수로 그 노드의 포인터 리턴 전달인자 : 헤더 포인터 값 / int findPosition(node *, node *, node *, int); / 입력 데이터와 같은 데이터를 포함하는 노드의 포인터 및 그 이전 노드의 포인터를 찾는 함수. 전달인자: 헤더포인터, 이전노드 포인터, 타깃 포인터, 찾기 원하는 데이터 / void insertList(node *, node , int); / 리스트 삽입함수 전달인자: 헤터 포인터의 포인터, 타깃 포인터, 삽입데이터 / void deleteList(node *, node , node *); / 리스트 삭제함수 전달인자: 헤더 포인터의 포인터, 이전포인터, 타깃포인터 / void main() { node *head = NULL; node *pre = NULL; node *targetPtr = NULL; int newData, target; int found; // 노드 생성 makeList(&head); // 생성된 리스트 출력 viewList(head); fflush(stdin); // 데이터 삽입 printf("Enter data to insert :\n"); scanf_s("%d", &newData); printf("어디 다음에 삽입할까요 : < 첫음에 입력을 원하면 -1 입력>\n"); scanf_s("%d", &target); if (target == -1) { targetPtr == NULL; insertList(&head, targetPtr, newData); } else { found = 0; found = findPosition(head, &pre, &targetPtr, target); if (found == 1) insertList(&head, targetPtr, newData); else printf("There is no %d in the list\n", target); } viewList(head); // delete list printf("Enter data to delete from list\n"); scanf_s("%d", &target); printf("targeted data is %d\n", target); found = 0; found = findPosition(head, &pre, &targetPtr, target); printf("data is %d in the list", found); printf("found data is %d\n", targetPtr->data); if (found == 1) deleteList(&head, pre, targetPtr); else printf("There is no %d in the list\n", target); // View list data viewList(head); } node * findLast(node *hptr) { if (hptr != NULL) { hptr = hptr->link; findLast(hptr); }//만약 헤더가 널이 아니면 마지막 노드까지 포인터 이동// return hptr;//리턴 hptr } int findPosition(node *hptr, node * pre, node **targetPtr, int data) { *pre = NULL; *targetPtr = NULL; while (hptr != NULL && hptr->data != data) { //hptr값이 널이 아니고 hptr->data값이 찾는 데이터가 아닐동안 *pre = hptr;//*pre값 = hptr값 hptr = hptr->link;//hptr은 다음 노드로 이동 if (hptr->data == data) {//만약 hptr->data와 data의 값이 같으면 *targetPtr = hptr;//*targetPtr값 = hptr return 1; }//리턴 1 else { return 0; }//그렇지 않으면 //리턴 0 } } void insertList(node **hptr, node *pptr, int data) { node * new; new->data = data; new->link = NULL;//새로운 노드 생성 if (*hptr == NULL) {//만약 *hptr 값이 널이면 현재 empty 이므로 *hptr = new->link;//*hptr이 new를 가리키게 함 }

    else if (pptr == NULL) {//만약 pptr값이 널이면 처음에 입력해야 함으로
        new->link = *hptr;//새로운 노드의링크, 즉 new->link는 *hptr값으로 함
        *hptr = new;
    }
    else {//그렇지 않다면, 즉 리스트 중간에 삽입해야 함으로
        new->link = pptr->link;//new->link 의 값은 pptr의 링크 값이며
        pptr->link = new;//pptr->link 는 new의 값으로 함
    
    }
    

    } void deleteList(node **hptr, node *pre, node *target) { if (pre == NULL) { *hptr = target->link; } else { pre->link = target->link; } free(target); } void makeList(node **hptr) { node *pre = NULL; node *new = NULL; int data; findLast(node *pre);//findLast를 이용하여 리스트 마지막 노드 포인터값을 pre에 저장 printf("입력할 데이터 는 < enter -1 to end>\n"); scanf("%d", &data); while (data != -1) { insertList(hptr, pre, data); if (pre->link == NULL) {//리스트 마지막 노드 포인터 확인 printf("Enter data again\n"); scanf("%d", &data); } } } void viewList(node *ptr) { while (ptr != NULL) { printf("%d ", ptr->data); ptr = ptr->link; } }

    에러가 수정이 안돼요 ㅠㅠ