KU COSE101 2017기말고사 4번 문제
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