#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node
{
char elem;
struct Node * prev;
struct Node * next;
} Node; // 노드 정의
typedef struct List
{
struct Node * header;
struct Node * trailer;
} List; // 리스트 정의
void init_list( List* list) ;
void add( List list, int r, char e) ;
void delete( List list, int r) ;
void get_entry( List list, int r) ;
void print( List list) ;
int main( void )
{
List list; // 리스트 선언
char op, item; // 입력 연산의 종류, 아이템
int position; // 입력 위치
int num_op; // 연산의 개수
init_list( & list) ; // 리스트 초기화 (헤더, 트레일러 노드 할당 및 초기화)
scanf ( "%d" , & num_op
) ; // 연산 개수 입력
for ( int i = 0 ; i < num_op; ++ i)
{
scanf ( "%c" , & op
) ; // 연산 종류
switch ( op)
{
case 'A' : // 삽입
scanf ( "%d %c" , & position
, & item
) ; add( list, position, item) ;
break ;
case 'D' : // 삭제
delete( list, position) ;
break ;
case 'G' : // 참조
get_entry( list, position) ;
break ;
case 'P' : // 출력
print( list) ;
break ;
}
}
free ( list
) ; // 리스트의 노드 해제
return 0 ;
}
void init_list( List* list)
{
Node * H;
Node * T;
H
= ( Node
* ) malloc ( sizeof ( Node
) ) ; T
= ( Node
* ) malloc ( sizeof ( Node
) ) ;
list-> header = H;
H-> prev = NULL;
H-> next = T;
list-> trailer = T;
T-> prev = H;
T-> next = NULL;
}
void add( List list, int r, char e)
{
Node * p;
p = list.header ;
Node
* newp
= ( Node
* ) malloc ( sizeof ( Node
) ) ; newp-> elem = e;
int i;
for ( i= 0 ; i< r ; i++ )
{
p = p-> next;
}
if ( p-> elem == ' ' )
{
return ;
}
newp-> next = p;
newp-> prev = p-> prev;
p-> prev = newp;
newp-> prev-> next = newp;
}
void delete( List list, int r)
{
Node * p;
p = list.header ;
int i;
for ( i= 0 ; i< r ; i++ )
{
p = p-> next;
}
if ( p-> elem == ' ' )
{
return ;
}
p-> prev-> next = p-> next;
p-> next-> prev = p-> prev;
}
void get_entry( List list, int r)
{
Node * p;
p = list.header ;
int i;
for ( i= 0 ; i< r ; i++ )
{
p = p-> next;
}
if ( p-> elem == ' ' )
{
return ;
}
}
void print( List list)
{
Node * p;
p = list.header ;
while ( p-> elem != NULL)
{
p = p-> next;
}
}
I2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+Cgp0eXBlZGVmIHN0cnVjdCBOb2RlCnsKCWNoYXIgZWxlbTsKCXN0cnVjdCBOb2RlICpwcmV2OwoJc3RydWN0IE5vZGUgKm5leHQ7Cn1Ob2RlOyAvLyDrhbjrk5wg7KCV7J2YCgp0eXBlZGVmIHN0cnVjdCBMaXN0CnsKCXN0cnVjdCBOb2RlICpoZWFkZXI7CglzdHJ1Y3QgTm9kZSAqdHJhaWxlcjsKfUxpc3Q7IC8vIOumrOyKpO2KuCDsoJXsnZgKCnZvaWQgaW5pdF9saXN0KExpc3QqIGxpc3QpOwp2b2lkIGFkZChMaXN0IGxpc3QsIGludCByLCBjaGFyIGUpOwp2b2lkIGRlbGV0ZShMaXN0IGxpc3QsIGludCByKTsKdm9pZCBnZXRfZW50cnkoTGlzdCBsaXN0LCBpbnQgcik7CnZvaWQgcHJpbnQoTGlzdCBsaXN0KTsKCmludCBtYWluKHZvaWQpCnsKCUxpc3QgbGlzdDsgLy8g66as7Iqk7Yq4IOyEoOyWuAoKCWNoYXIgb3AsIGl0ZW07IC8vIOyeheugpSDsl7DsgrDsnZgg7KKF66WYLCDslYTsnbTthZwKCWludCBwb3NpdGlvbjsgLy8g7J6F66ClIOychOy5mAoJaW50IG51bV9vcDsgLy8g7Jew7IKw7J2YIOqwnOyImAoKCWluaXRfbGlzdCgmbGlzdCk7IC8vIOumrOyKpO2KuCDstIjquLDtmZQgKO2XpOuNlCwg7Yq466CI7J2865+sIOuFuOuTnCDtlaDri7kg67CPIOy0iOq4sO2ZlCkKCglzY2FuZigiJWQiLCAmbnVtX29wKTsgLy8g7Jew7IKwIOqwnOyImCDsnoXroKUKCglmb3IgKGludCBpID0gMDsgaSA8IG51bV9vcDsgKytpKQoJewoJCWdldGNoYXIoKTsgLy8g6rO167CxIOuYkOuKlCDqsJztlonrrLjsnpAg7J296riwCgkJc2NhbmYoIiVjIiwgJm9wKTsgLy8g7Jew7IKwIOyiheulmAoKCQlzd2l0Y2ggKG9wKQoJCXsKCQljYXNlICdBJzogLy8g7IK97J6FCgkJCXNjYW5mKCIlZCAlYyIsICZwb3NpdGlvbiwgJml0ZW0pOwoJCQlhZGQobGlzdCwgcG9zaXRpb24sIGl0ZW0pOwoJCQlicmVhazsKCQljYXNlICdEJzogLy8g7IKt7KCcCgkJCXNjYW5mKCIlZCIsICZwb3NpdGlvbik7CgkJCWRlbGV0ZShsaXN0LCBwb3NpdGlvbik7CgkJCWJyZWFrOwoJCWNhc2UgJ0cnOiAvLyDssLjsobAKCQkJc2NhbmYoIiVkIiwgJnBvc2l0aW9uKTsKCQkJZ2V0X2VudHJ5KGxpc3QsIHBvc2l0aW9uKTsKCQkJYnJlYWs7CgkJY2FzZSAnUCc6IC8vIOy2nOugpQoJCQlwcmludChsaXN0KTsKCQkJYnJlYWs7CgkJfQoJfQoKCWZyZWUobGlzdCk7IC8vIOumrOyKpO2KuOydmCDrhbjrk5wg7ZW07KCcCgoJcmV0dXJuIDA7Cn0KCnZvaWQgaW5pdF9saXN0KExpc3QqIGxpc3QpCnsKCU5vZGUgKkg7CglOb2RlICpUOwoJSCA9IChOb2RlKiltYWxsb2Moc2l6ZW9mKE5vZGUpKTsKCVQgPSAoTm9kZSopbWFsbG9jKHNpemVvZihOb2RlKSk7CgkKCWxpc3QtPmhlYWRlciA9IEg7CglILT5wcmV2ID0gTlVMTDsKCUgtPm5leHQgPSBUOwoJCglsaXN0LT50cmFpbGVyID0gVDsKCVQtPnByZXYgPSBIOwoJVC0+bmV4dCA9IE5VTEw7Cn0KCnZvaWQgYWRkKExpc3QgbGlzdCwgaW50IHIsIGNoYXIgZSkKewoJTm9kZSAqcDsKCXAgPSBsaXN0LmhlYWRlcjsKCQoJTm9kZSAqbmV3cCA9IChOb2RlKiltYWxsb2Moc2l6ZW9mKE5vZGUpKTsKCW5ld3AtPmVsZW0gPSBlOwoJCglpbnQgaTsKCWZvcihpPTA7IGk8ciA7IGkrKykKCXsKCQlwID0gcC0+bmV4dDsKCX0KCWlmKHAtPmVsZW0gPT0gJyAnKQoJewoJCXByaW50ZigiaW52YWxpZCBwb3NpdGlvblxuIik7CgkJcmV0dXJuOwoJfQoJbmV3cC0+bmV4dCA9IHA7CgluZXdwLT5wcmV2ID0gcC0+cHJldjsKCXAtPnByZXYgPSBuZXdwOwoJbmV3cC0+cHJldi0+bmV4dCA9IG5ld3A7Cn0KCnZvaWQgZGVsZXRlKExpc3QgbGlzdCwgaW50IHIpCnsKCU5vZGUgKnA7CglwID0gbGlzdC5oZWFkZXI7CgkKCWludCBpOwoJZm9yKGk9MDsgaTxyIDsgaSsrKQoJewoJCXAgPSBwLT5uZXh0OwoJfQoJaWYocC0+ZWxlbSA9PSAnICcpCgl7CgkJcHJpbnRmKCJpbnZhbGlkIHBvc2l0aW9uXG4iKTsKCQlyZXR1cm47Cgl9CglwLT5wcmV2LT5uZXh0ID0gcC0+bmV4dDsKCXAtPm5leHQtPnByZXYgPSBwLT5wcmV2OwoJZnJlZShwKTsKfQoKdm9pZCBnZXRfZW50cnkoTGlzdCBsaXN0LCBpbnQgcikKewoJTm9kZSAqcDsKCXAgPSBsaXN0LmhlYWRlcjsKCQoJaW50IGk7Cglmb3IoaT0wOyBpPHIgOyBpKyspCgl7CgkJcCA9IHAtPm5leHQ7Cgl9CglpZihwLT5lbGVtID09ICcgJykKCXsKCQlwcmludGYoImludmFsaWQgcG9zaXRpb25cbiIpOwoJCXJldHVybjsKCX0KCXByaW50ZigiJWNcbiIsIHAtPmVsZW0pOwp9Cgp2b2lkIHByaW50KExpc3QgbGlzdCkKewoJTm9kZSAqcDsKCXAgPSBsaXN0LmhlYWRlcjsKCQoJd2hpbGUocC0+ZWxlbSAhPSBOVUxMKQoJewoJCXAgPSBwLT5uZXh0OwoJCXByaW50ZigiJWMiLCBwLT5lbGVtKTsKCX0KCXByaW50ZigiXG4iKTsKfQ==
compilation info
prog.c: In function ‘main’:
prog.c:62:7: error: incompatible type for argument 1 of ‘free’
free(list); // 리스트의 노드 해제
^~~~
In file included from prog.c:4:
/usr/include/stdlib.h:563:25: note: expected ‘void *’ but argument is of type ‘List’ {aka ‘struct List’}
extern void free (void *__ptr) __THROW;
~~~~~~^~~~~
prog.c: In function ‘print’:
prog.c:150:16: warning: comparison between pointer and integer
while(p->elem != NULL)
^~
prog.c: In function ‘main’:
prog.c:35:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &num_op); // 연산 개수 입력
^~~~~~~~~~~~~~~~~~~~
prog.c:40:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%c", &op); // 연산 종류
^~~~~~~~~~~~~~~~
prog.c:45:4: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %c", &position, &item);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.c:49:4: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &position);
^~~~~~~~~~~~~~~~~~~~~~
prog.c:53:4: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &position);
^~~~~~~~~~~~~~~~~~~~~~
stdout