School Lecture Study/과제를 해보자

[알고리즘] 연결리스트 문자열 삽입

vㅔ로 2021. 6. 26. 21:28
728x90

계절 알고리즘 수업을 듣는데, 2일 간은 자료 구조 수업을 한다고 하셔서 이번 주 과제는 연결리스트였다. 

지금까지 연결리스트 입력을 숫자로만 받아봤는데, 이번에는 문자열을 받는 과제였다. 

 

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
   char* name;
   char* depart;
   char* grade;
   char* gender;
   struct Node* next;
} Node;


void insertNode(Node *student, char*name, char*depart, char*grade, char*gender ) {
   Node* nextStudent = (Node*)malloc(sizeof(Node));
   nextStudent->name = name;
   nextStudent->depart = depart;
   nextStudent->grade = grade;
   nextStudent->gender = gender;
   nextStudent->next = student->next;
   student->next = nextStudent;
   
}

int main()
{
   Node* student = (Node*)malloc(sizeof(Node));
   student->next = NULL;
   int i;
   for (i = 0; i < 6; i++) {
      char name[20], depart[100], grade[20], gender[20];
      scanf_s("%s", name, sizeof(name));
      scanf_s("%s", depart, sizeof(depart));
      scanf_s("%s", grade, sizeof(grade));
      scanf_s("%s", gender, sizeof(gender));
      insertNode(student, name, depart, grade, gender);
   }
   Node* curr = student->next;
   while (curr != NULL) {
      printf("%s %s %s %s\n", curr->name, curr->depart, curr->grade, curr->gender);
      curr = curr->next;
   }
}

처음 코드이다. 이렇게 하면 반복문에서 새롭게 배열들을 선언하니, 변수의 주소가 계속 바뀔 줄 알았는데, 전혀 아니었다. 변수의 주소가 바뀌지 않아서 계속 입력받을 때마다 첫 노드인 student의 이름, 과 등이 바뀌었다. 반복문 안에서 변수를 새롭게 선언한다고 해서 주소가 변하는 건 아니라는 것을 알게 되었다. 

 

이를 해결하기 위해서는 직접 변수를 구조체 변수에 대입하지 않고, 복사해서 넣어야 한다. 

 

해결한 코드는 다음과 같다. 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node {
    char name[20];
    char depart[100];
    char grade[20];
    char gender[20];
} Node;

Node* student[6];

int main()
{
    int i;
    for (i = 0; i < 6; i++) {
        char name[20], depart[100], grade[20], gender[20];
        scanf_s("%s", name, sizeof(name));
        scanf_s("%s", depart, sizeof(depart));
        scanf_s("%s", grade, sizeof(grade));
        scanf_s("%s", gender, sizeof(gender));
        Node* newStudent = (Node*)malloc(sizeof(Node));
        strcpy(newStudent->name, name);
        strcpy(newStudent->depart, depart);
        strcpy(newStudent->grade, grade);
        strcpy(newStudent->gender, gender);
        student[i] = newStudent;
    }
    for (i = 0; i < 6; i++) {
        printf("%s %s %s %s\n", student[i]->name, student[i]->depart, student[i]->grade, student[i]->gender);
    }
}

strcpy로 값을 넣어주면 주소가 같아서 발생하는 문제가 일어나지 않는다. 

728x90