c언어 동적 메모리 할당으로 순차 정렬

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

struct student {
        int id;
        char name[20];
    int score[4];
        struct student *next;
};

int main()
{

        int count = 0, id,sc[4];
        char name[20],line[200];
        struct student *p, *head, *node = NULL;
        printf("학번과  이름을 입력하세요\n");
        fgets(line, 200, stdin);
        while (fgets(line, 200, stdin) != NULL) {
            sscanf(line, "%d %s %d %d %d %d", &id, name,
               &sc[0],&sc[1],&sc[2],&sc[3]);
                p = (struct student *) malloc(sizeof(struct student));
                node = (struct student *) malloc(sizeof(struct student));
                if (head == NULL)
                        head = p;
                else
                        node->next = p;
                node = p;
                if (p == NULL) {
                        perror("malloc");
                        exit(1);
                }
                p->id = id;
                strcpy(p->name, name);
                node=p->next;
        for(int i=0; i< 4; i++)
           p->score[i]=sc[i];
        }

        printf("\n* 학생 정보 *\n");
        p = head;
        while (p != NULL) {
                count++;
                printf("학번: %d 이름: %s : ", p->id, p->name);
        for(int i=0; i< 4; i++)
           printf("%6d", p->score[i]);
        printf("\n");
                p = p->next;
        }

        printf("총 %d 명입니다.\n", count);
        exit(0);
}

//부분을 고쳐서 순차적으로? 정렬하는 건 어떻게 하나요??ㅠㅠㅠㅠ 파일 자체가 순차적으로 정렬이 되어있어서 노드로 이어주면서 출력을 하면 될 것 같은데 계속 안 돼서 질문 드립니다... 모바엑스텀에서 하는 걸로 txt 파일을 리다이렉션으로 실행 할 때 넣어주는 방법으로 실행시키고 있습니다. 이걸 실행시키면 세그멘테이션 오류나 39줄이 정렬 되어야하는데 한 줄만 나오는 그런 결과가 나와서 질문합니다ㅜㅜ

  • 코드를 github 같은 곳에 올리세요. 39줄짜리 파일도 있다는 의미인데...이걸 보는 사람이 그걸 알 수 있을까요? 그리고 이미지로 코드를 올리면 그걸 일일이 타이프해서 테스트하는 사람도 없습니다. github를 활용하세요. 정영훈 2019.9.29 04:00
  • 수정햇서용 김지선 2019.9.29 14:31

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    // 부분이 안보입니다.

    p = (struct student *) malloc(sizeof(struct student));
    node = (struct student *) malloc(sizeof(struct student));
    if (head == NULL)
          head = p;
    else
    node->next = p;
    node = p;
    f (p == NULL) {
            perror("malloc");
            exit(1);
    }
     p->id = id;
    strcpy(p->name, name);
     node=p->next;
    

    이 부분도 문제가 있는거 같네요. node를 현재 가르키고 있는 노드를 나타내는 포인터로 사용하실려고 하는거 같은데, 그러면 동적할당을 해줄 필요가 없습니다. node 포인터는 단지 리스트에 추가될때마다 움직여주면서 현재 노드를 가르키면 되겠네요.

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

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

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

(ಠ_ಠ)
(ಠ‿ಠ)