빈 리스트, 길이, 초기화 연산 구현
빈 리스트
int is_empty(ListType *list){
if(list->head == NULL)
return 1;
else
return 0;
}
길이
int get_length(ListType *list){
return list->length;
}
초기화
void init(ListType *list){
if(list == NULL)
return;
list->length = 0;
list->head = NULL;
}
삽입 연산 코드
void insert_node(ListNode **phead, ListNode *p, ListNode *new_node){
if( *phead == NULL){
*phead = new_node;
}
else if( p == NULL){
new_node->link = *phead;
*phead = new_node;
}
else{
new_node->link = p->link;
p->link = new_node;
}
}
add 연산
- 새로운 데이터를 임의의 위치에 삽입
- get_node_at()가 지정된 위치의 노드 주소를 반환하면, 이 값을 이용
void add(ListType *list, int position, element data){
ListNode *p;
if ((position >= 0) && (position <= list->length)){
ListNode *node = (ListNode *)malloc(sizeof(ListNode));
node->data = data;
node->link = NULL;
p = get_node_at(list, position-1);
insert_node(&(list->head), p, node);
list->length++;
}
}
- 새로운 데이터를 임의의 위치에 삽입
- 항목의 위치를 노드 포인터로 변환해주는 함수 get_node_at 필요
ListNode *get_node_at(ListType *list, int pos){
int i;
ListNode *tmp_node = list->head;
if( pos < 0 ) return NULL;
for (i=0; i<pos; i++)
tmp_node = tmp_node->link;
return tmp_node;
}
delete 연산
- 임의의 위치의 데이터 삭제
- 항목의 위치를 노드 포인터로 변환해주는 함수 get_node_at 필요
void delete(ListType *list, int pos){
if (!is_empty(list) && (pos >= 0) && (pos < list->length)){
ListNode *p = get_node_at(list, pos-1);
ListNode *removed = get_node_at(list, pos);
remove_node(&(list->head), p, removed);
list->length--;
}
}
삭제 연산
void remove_node(ListNode **phead, ListNode *p, ListNode *removed){
if( p == NULL )
*phead = removed->link;
else
p->link = removed->link;
free(removed);
}
get_entry 연산
element get_entry(ListType *list, int pos){
ListNode *p;
if( pos < 0 || pos >= list->length)
printf("위치 오류");
p = get_node_at(list, pos);
return p->data;
}
display 연산
void display(ListType *list){
int i;
ListNode *node = list->head;
printf("(");
for(i=0; i < list->length; i++){
printf("%d ", node->data);
node = node->link;
}
printf(")\n");
}
is_in_list 연산
int is_in_list(ListType *list, element item){
ListNode *p;
p = list->head;
while((p != NULL)){
if( p->data == item)
break;
p = p->link;
}
if( p == NULL)
return fALSE;
else
return TRUE;
}