단순연결리스트에서...
단순연결리스트인데, main함수에서 for문으로 데이터값을 10부터
넣어주었습니다. 그렇다면 분명 첫번째 노드에는 10이 들어가
있어야 하는데 출력해 보면 1부터 나오네요. 음.. 왜이런지...
정말 이해가 안갑니다. 도와주셔요.
typedef struct ListElmt_ {
void *data;
struct ListElmt_ *next;
} ListElmt;
typedef struct List_ {
int size;
int (*match)(const void *key1, const void *key2);
void (*destroy)(void *data);
ListElmt *head;
ListElmt *tail;
} List;
void list_init(List *list, void (*destroy)(void *data));
void list_destroy(List *list);
int list_ins_next(List *list, ListElmt *element, const void *data);
int list_rem_next(List *list, ListElmt *element, void **data);
#define list_size(list) ((list)->size)
#define list_head(list) ((list)->head)
#define list_tail(list) ((list)->tail)
#define list_is_head(list, element) ((element) == (list)->head ? 1
0)
#define list_is_tail(element) ((element)->next == NULL ? 1 0)
#define list_data(element) ((element)->data)
#define list_next(element) ((element)->next)
#endif
#include
#include
#include "list.h"
void list_init(List *list, void (*destroy)(void *data)) {
list->size = 0;
list->destroy = destroy;
list->head = NULL;
list->tail = NULL;
return;
}
void list_destroy(List *list) {
void *data;
while (list_size(list) > 0) {
if (list_rem_next(list, NULL, (void **)&data) == 0 && list-
>destroy !=
NULL) {
list->destroy(data);
}
}
memset(list, 0, sizeof(List));
return;
}
int list_ins_next(List *list, ListElmt *element, const void *data) {
ListElmt *new_element;
if ((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL)
return -1;
new_element->data = (void *)data;
if (element == NULL) {
if (list_size(list) == 0)
list->tail = new_element;
new_element->next = list->head;
list->head = new_element;
}
else {
if (element->next == NULL)
list->tail = new_element;
new_element->next = element->next;
element->next = new_element;
}
list->size++;
return 0;
}
#include #include #include "list.h"
static void print_list(const List *list) {
ListElmt *element;
int *data, i;
fprintf(stdout, "List size is %d\n", list_size(list));
i = 0;
element = list_head(list);
while (1) {
data = list_data(element);
fprintf(stdout, "list[%03d]=%03d\n", i, *data);
i++;
if (list_is_tail(element))
break;
else
element = list_next(element);
}
return;
}
int main(int argc, char **argv) {
List list;
ListElmt *element;
int *data, i;
list_init(&list, free);
element = list_head(&list);
for (i = 10; i > 0; i--) {
if ((data = (int *)malloc(sizeof(int))) == NULL)
return 1;
*data = i;
if (list_ins_next(&list, NULL, data) != 0)
return 1;
}
print_list(&list);
list_destroy(&list);
return 0;
}
Re: 단순연결리스트에서...
main함수의
if(list_ins_next(&list, NULL, data) != 0)
부분을 보면 element 매개변수 항목에 NULL이 들어가네요.
고로 처음 추가된 노드는 나중에 다음 노드가 삽입되면 뒤로
물러나게 되는거군요. 즉, 제일 처음 삽입된 노드가 tail이 NULL이
되는 노드가 되는 겁니다. 고로, 제일 나중에 삽입된 노드가
head가 되는 노드가 되구요. 오케이?
댓글 달기