링크드리스트 짜기 라이브?코딩. 인터넷 안 보구 짜기. 사실은 한 번에 녹화한건 아니고 중간에 버벅거림이 한 번 있어서 다시 녹화했다..
이 글을 보고 문득 생각나서 해본 것이다. 나도 사실 패턴 같은 것 잘 모른다. 넘의 좋은 소스 나쁜 소스 보면서 짬통으로 체득한 것에 훗날 이름이 있었다는 것을 알게 된 것이 많다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node_t {
int key;
int value;
} my_data_t;
typedef struct list_t {
struct node_t my_data;
struct list_t *next;
} my_list_t;
my_list_t *head = NULL;
my_list_t *find(int key)
{
my_list_t *p;
if (!head) {
return NULL;
}
p = head;
while (p) {
if (p->my_data.key == key) {
return p;
}
p = p->next;
};
return NULL;
}
void insert(int key, int value)
{
my_list_t *n, *p;
p = find(key);
if (p) {
p->my_data.value = value;
return;
}
n = (my_list_t *)malloc(sizeof(my_list_t));
// 에러는 나몰랑.
n->my_data.key = key;
n->my_data.value = value;
n->next = NULL;
if (!head) {
head = n;
return;
}
p = head;
while (p->next) {
p = p->next;
}
p->next = n;
}
void dump_all(void)
{
my_list_t *p;
p = head;
while (p) {
printf("k = %d, v = %d\n", p->my_data.key, p->my_data.value);
p = p->next;
};
}
void delete(int key)
{
my_list_t *p, *p2;
if (!head) {
return;
}
p = head;
if (p->my_data.key == key) {
head = p->next;
free(p);
return;
}
while (p->next) {
if (p->next->my_data.key == key) {
p2 = p->next->next;
free(p->next);
p->next = p2;
return;
}
p = p->next;
};
return;
}
int main()
{
my_list_t *tt;
printf("hell world!\n");
insert(100, 200);
insert(100, 500);
insert(101, 300);
insert(102, 300);
insert(103, 300);
insert(101, 700);
insert(104, 300);
insert(104, 301);
dump_all();
tt = find(104);
if (!tt)
printf("없다\n");
else
printf("find : k = %d, v = %d\n", tt->my_data.key, tt->my_data.value);
delete(103);
dump_all();
delete(104);
delete(100);
delete(101);
delete(102);
dump_all();
tt = find(104);
if (!tt)
printf("없다\n");
else
printf("find : k = %d, v = %d\n", tt->my_data.key, tt->my_data.value);
printf("끝났다\n");
}