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

조회수 996회
#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;
    }
}

에러가 수정이 안돼요 ㅠㅠ

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

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

(ಠ_ಠ)
(ಠ‿ಠ)