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