문제 1. 파일(in.txt)에 저장된 서로 다른 양수들을 읽어 들여 차례대로 singly linked list 의 끝에
삽입하며, 삽입할 때마다 현재 구성된 singly linked list 를 방문하여 각 node 의 값을 처음부터 끝까지
화면 출력하라.
문제 2. (문제 1 에 성공한 뒤에 코딩하세요.)
문제 1 에서 생성한 singly linked list 에서 최대 값을 갖는 node x 를 발견한 뒤, node x 의 뒤에 -1 값을
갖는 node 를 삽입하라. 그 뒤, singly linked list 를 방문하여 각 node 의 값을 처음부터 끝까지 화면
출력하라
#include <iostream>
#include <fstream>
using namespace std;
typedef struct listNode *listPointer;
typedef struct listNode{
int data;
listPointer link;
};
listPointer concatenate(listPointer ptr1, listPointer ptr2) {
listPointer temp;
if (!ptr1) return ptr2; //ptr1이 null이면 ptr2 리턴
if (!ptr2) return ptr1; //ptr2이 null이면 ptr1 리턴
/*neither list is empty, find end of first list*/
/* 두 리스트 모두 비어있지 않으면 첫번째 리스트의 끝을 찾기*/
for (temp = ptr1; temp->link; temp = temp->link);
/*link end of first to start of second*/
/*temp를 temp->link == null일 때 까지 뒤로 이동*/
temp->link = ptr2; //ptr1의 끝에 ptr2 붙이기
}
listNode* first; listPointer save; // first 주솟값 저장(출력 위해서)
listPointer temp; int count = 0;
void P1() {
fstream in("in.txt");
temp = (listPointer)malloc(sizeof(*temp)); //쓰레기값
save = temp; //처음 주소 저장
first = temp; // temp의 주소를 first에 넣기
first->link = NULL;
while (!in.eof()) {
::count++;
temp = (listPointer)malloc(sizeof(*temp)); //쓰레기값
in >> temp->data;
temp->link = NULL;
concatenate(first, temp); //first가 NULL이 아니어야함
for (int i = 0; i < ::count; i++) {
first = first->link; //first는 dummy임 (과제 제출하고 처리하기)
printf("%d ", first->data);
}
first = save; //first 포인터 save로 초기화
printf("\n"); //줄띄우기
}
}
void P2() { // 15 20 10 1
listPointer dummy; listPointer insert;
dummy = first;
first = first->link;
free(dummy); //링크드리스트 first는 더이상 dummy 아님
insert = (listPointer)malloc(sizeof(*insert));
insert->data = -1;
insert->link = NULL; //삽입할 노드 생성
listPointer tempFirst = first;
int max = 0; listPointer maxIndex = NULL;
for (int i = 0; i < ::count; i++) {
if (tempFirst->data > max) {
max = tempFirst->data;
maxIndex = tempFirst;
tempFirst = tempFirst->link;
}
}
insert->link = maxIndex->link;
maxIndex -> link = insert;
for (int i = 0; i < ::count+1; i++) {
printf("%d ", first->data);
first = first->link;
}
}
int main() {
printf("문제 1: \n"); P1();
printf("문제 2: \n"); P2();
}
in.txt: 15 20 10 1 (화면 출력) 컴퓨터학부 201920394 홍길동 문제 1: 15 15 20 15 20 10 15 20 10 1 문제 2: 15 20 -1 10 1 in.txt 1 2 3 7 9 (화면 출력) 컴퓨터학부 201920394 홍길동 문제 1: 1 1 2 1 2 3 1 2 3 7 1 2 3 7 9 문제 2: 1 2 3 7 9 -1