c언어 자꾸 오류가 뜨는데 못잡겠습니다 ㅠㅠ

조회수 630회
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node
{
    int number;
    char name[20];
    char gender;
    char address[80];

    struct node *next;
}NODE;

void remove_node(NODE **head, NODE *p, NODE *removed);
void add_node(NODE **head, NODE *p, NODE *new_node);
NODE *create_node(int number, char *name, char gender, char*address, NODE *next);
int search_node(NODE *head, int number);
NODE *sorting(NODE *head);
NODE *sorting_rev(NODE *head);

NODE *fr();

void print();
void add();
void remove_();

int main()
{
    int n = 1;

    while (n != 0)
    {
        printf("1 : 출력, 2 : 추가, 3 : 삭제, 0 : 종료\n");
        scanf("%d", &n);

        switch (n)
        {
        case 1:
            print();
            break;

        case 2:
            add();
            break;

        case 3:
            remove_();
            break;

        default:
            break;
        }
    }

    return 0;
}

void remove_()
{
    NODE *head = NULL, *temp1 = NULL, *temp2 = NULL, *p = NULL;

    p = sorting(head);
    head = p;

    temp1 = head;
    temp2 = head;

    int i, n = 0;

    printf("삭제할 항목의 번호를 입력하세요\n");
    scanf("%d", &n);

    if (n == 1) {
        remove_node(&head, NULL, temp2);
        temp1 = head;
    }
    else
    {
        for (i = 2; i < n; i++)
        {
            temp1 = temp1->next;
            temp2 = temp2->next;
        }
        temp2 = temp2->next;

        remove_node(&head, temp1, temp2);
        temp1 = temp1->next;

        while (head != NULL)
        {
            temp1->number = temp1->number - 1;
            temp1 = temp1->next;
        }

        FILE *file;
        file = fopen("C:\\Users\\xoghk\\Desktop\\bs_data.txt", "wt");

        while (head != NULL)
        {
            fprintf(file, "%d %s %c %s\n", head->number, head->name, head->gender, head->address);
            head = head->next;
        }

        fclose(file);
    }
}

void add()
{
    NODE *head = NULL, *p = NULL, *p1 = NULL;
    head = fr();
    p = sorting_rev(head);

    int number = 0;
    char name[20] = { 0 };
    char gender = NULL;
    char address[80] = { 0 };

    printf("번호,이름, 성별, 주소를 입력하세요 : ");
    scanf("%s %c %s", name, &gender, address);

    if (p == NULL)
    {
        p->number = 0;
    }

    add_node(&p, NULL, create_node(p->number + 1, name, gender, address, NULL));

    p1 = sorting(p);

    FILE *file;
    file = fopen("C:\\Users\\xoghk\\Desktop\\bs_data.txt", "wt");

    while (p1 != NULL)
    {
        fprintf("file", "%d %s %c %s\n", p1->number, p1->name, p1->gender, p1->address);
        p1 = p1->next;
    }

    fclose(file);
}

NODE *fr()
{
    FILE *file;
    file = fopen("D:\\db.txt.txt", "rt");

    NODE *head = NULL;
    int number = 0;
    char name[20] = { 0 };
    char gender = NULL;
    char address[80] = { 0 };

    while (1)
    {
        if (fscanf(file,"%d %s %c %s", &number, name, &gender, address) == -1)
        {
            break;
        }

        add_node(&head, NULL, create_node(number, name, gender, address, NULL));

    }

    fclose(file);

    return head;

}

void print()
{
    NODE *head = NULL, *p = NULL;
    head = fr();
    p = sorting(head);

    while (p != NULL)
    {
        printf("%d %s %c %s\n", p->number, p->name, p->gender, p->address);
        p = p->next;
    }

}

NODE *sorting_rev(NODE *head)
{
    NODE *temp1 = NULL, *temp2 = NULL, *temp3 = NULL, *sort = NULL;

    int i, count = 0;

    temp1 = head;
    temp3 = head;

    while (temp1 != NULL)
    {
        temp2 = temp1->next;
        while (temp2 != NULL)
        {
            if (temp1->number > temp2->number)
            {
                temp1 = temp2;
            }
            temp2 = temp2->next;
        }
        add_node(&sort, NULL, create_node(temp1->number, temp1->name, temp1->gender, temp1->address, NULL));

        count = search_node(head, temp1->number);

        for (i = 0; i < count - 1; i++)
        {
            temp3 = temp3->next;
        }

        if (count == 0)
        {
            remove_node(&head, NULL, temp1);
        }
        else
        {
            remove_node(&head, temp3, temp1);
        }

        temp1 = head;
        temp3 = head;
    }


    return sort;
}

NODE *sorting(NODE *head)
{
    NODE *temp1 = NULL, *temp2 = NULL, *temp3 = NULL, *sort = NULL;

    int i, count = 0;

    temp1 = head;
    temp3 = head;

    while (temp1 != NULL)
    {
        temp2 = temp1->next;
        while (temp2 != NULL)
        {
            if (temp1->number < temp2->number)
            {
                temp1 = temp2;
            }

            temp2 = temp2->next;
        }
        add_node(&sort, NULL, create_node(temp1->number, temp1->name, temp1->gender, temp1->address, NULL));

        count = search_node(head, temp1->number);

        for (i = 0; i < count - 1; i++)
        {
            temp3 = temp3->next;
        }

        if (count == 0)
        {
            remove_node(&head, NULL, temp1);
        }
        else
        {
            remove_node(&head, temp3, temp1);
        }

        temp1 = head;
        temp3 = head;
    }

    return sort;

}

int search_node(NODE *head, int number)
{
    int count = 0;
    NODE *p;
    p = head;

    while (p != NULL)
    {
        if (p->number == number)
        {
            return count;
        }

        p = p->next;
        count++;
    }

    return count;

}

void remove_node(NODE **head, NODE *p, NODE *removed)
{
    if (p == NULL)
    {
        *head = (*head)->next;
    }
    else
    {
        p->next = removed->next;
    }

    free(removed);
}

void add_node(NODE **head, NODE *p, NODE *new_node)
{
    if (*head == NULL)
    {
        new_node->next = NULL;
        *head = new_node;
    }
    else if (p == NULL)
    {
        new_node->next = *head;
        *head = new_node;
    }
    else
    {
        new_node->next = p->next;
        p->next = new_node;
    }
}

NODE *create_node(int number, char *name, char gender, char*address, NODE *next)
{
    NODE *new_node = NULL;
    new_node = (NODE *)malloc(sizeof(NODE));

    new_node->number = number;
    strcpy(new_node->name, name);
    new_node->gender = gender;
    strcpy(new_node->address, address);
    new_node->next = next;

    return new_node;
}

p == null 일때 p->number = 0 여기서 부터 nullptr이라고 오류가 뜨는데 잡지를 못하겠습니다 ㅠㅠ 도주세요...

1 답변

  • p == NULL

    이 참이면 p 는 허공을 가리키고 있는것과 같습니다.

    p 가 NODE 구조체를 가리키고 있어야 그 NODE 안의 number 에 접근할 수 있겠지요.

    첫 번째 NODE를 만드는 작업이 선결되어야 합니다.

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

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

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

(ಠ_ಠ)
(ಠ‿ಠ)