KU COSE101 2017기말고사 4번 문제

2 minute read

             
2016 기출 1번 2번 3번 4번 5번  
2017 기출 1번 2번 3번 4번 5번  
2018 기출 1번 2번 3번 4번 5번 6번

void insert(NodePtr, int) 함수도 만들어서 값을 넣어봅시다.

void showlist(NodePtr) 함수도 만들어서 insert, remove_dup, merge 함수가 제대로 작동하는지 확인해봅시다.

다음과 같이 정의된 linked list에 대해 다음 물음에 답하시오. (리스트의 마지막은 NULL로 표시함.)

typedef struct node{
  int val;
  struct node* next;
} Node, *NodePtr;

(a) 주어진 linked list가 오름차순으로 정렬되어있는지 확인하는 함수 is_sorted()를 작성하시오.

int is_sorted(NodePtr head) {

}

(b) 오름차순으로 정렬된 list에서 중복된 값이 있을 경우, 하나만 남겨두고 나머지는 모두 제거하는 함수 remove_dup()을 작성하시오. 예를 들어 1, 2, 2, 2, 3, 3은 1, 2, 3으로 변환한다. 제거되는 모든 node들은 free 되어야 한다.

NodePtr remove_dup(NodePtr x) {

}

(c) 두 개의 정렬된 linked list가 있을 때 이들을 정렬된 형태로 결합하는 함수 merge()를 작성하시오. 중복이 있는 경우, 중복을 포함하도록 하시오. 예를 들어 두 개의 linked list 0, 1, 3, 3, 4, 5와 2, 3, 4, 4, 5가 주어진다면 이 둘을 합한 linked list는 0, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5 가 된다.

NodePtr merge(NodePtr x, NodePtr y) {

}

예시답안
#include<stdio.h>
#include<stdlib.h>

typedef struct node{
	int val;
	struct node* next;
} Node, *NodePtr;

void insert(NodePtr head, int value) {
	NodePtr newPtr = (NodePtr)malloc(sizeof(Node));
	newPtr->val = value;
	newPtr->next = NULL;
	
	NodePtr curPtr = head;
	while(curPtr != NULL){
		if(curPtr->next == NULL){
			curPtr->next = newPtr;
			break;
		}
		curPtr = curPtr->next;
	}
}

int is_sorted(NodePtr head) {
	NodePtr prevPtr = head -> next;
	NodePtr curPtr = prevPtr -> next;
	
	while(curPtr != NULL){
		if(prevPtr->val > curPtr->val){
			return 0;
		}
		prevPtr = curPtr;
		curPtr = curPtr->next;
	}
	
	return 1;
}

NodePtr remove_dup(NodePtr x) {
	NodePtr prevPtr = x -> next;
	NodePtr curPtr = prevPtr -> next;
	
	while(curPtr != NULL) {
		if(curPtr->val == prevPtr->val) {
			prevPtr->next = curPtr->next;
			free(curPtr);
			curPtr = prevPtr->next;
		}
		else{
			prevPtr = curPtr;
			curPtr = curPtr->next;
		}
	}
	
	return x;
}

NodePtr merge(NodePtr x, NodePtr y) {
	NodePtr head = (NodePtr)malloc(sizeof(Node));
	NodePtr p;
	head->next = NULL;
	
	x = x->next;
	y = y->next;
	while(x!=NULL && y!=NULL){
		if(x->val > y->val){
			if(head->next==NULL) head->next=y;
			else p->next = y;
			p = y;
			y = y->next;
		}
		else{
			if(head->next==NULL) head->next=x;
			else p->next = x;
			p = x;
			x = x->next;
		}
	}
	if(x!=NULL) p->next = x;
	else p->next = y;
	
	return head;
}

void showlist(NodePtr head) {
	head = head->next;
	while(head != NULL){
		printf("%d --> ", head->val);
		head = head->next;
	}
	printf("NULL\n");
}

int main()
{
	int n,m,t;
	int i;
	NodePtr list1 = (NodePtr)malloc(sizeof(Node));
	NodePtr list2 = (NodePtr)malloc(sizeof(Node));
	list1->next = NULL;
	list2->next = NULL;
	
	scanf("%d",&n);
	for(i=0 ; i<n ; i++){
		scanf("%d",&t);
		insert(list1, t);
	}
	
	scanf("%d",&m);
	for(i=0 ; i<m ; i++){
		scanf("%d",&t);
		insert(list2, t);
	}
	
	NodePtr list = merge(list1, list2);
	showlist(list);
}

Comments