링크드 리스트 값 삽입

SangJun·2022년 10월 25일
1

자료구조

목록 보기
15/18

문제 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

profile
Let there be bit.

0개의 댓글