연결 리스트

mtak·2021년 1월 26일
0

42Seoul

목록 보기
8/13
typedef struct s_사람
{
    char *name;
    int age;
}   t_사람;
int main()
{
	t_사람 배열[몇 명];
}


🔽call by value (copy)

void 함수(t_사람 친구) //값만 복사해서 메모리가 한번 더 할당되는것
{
    친구.name
}

t_사람 베프찾는함수(entj)
{
	return 배열[n번째] //이름 없는 임시 객체
}

배열 사이의 구조체 추가가 어렵다.
i.e. 한 종이에 빡빡하게 순서대로 썼는데 중간에 뭐 넣으래 💢

💡한 장에[ 구조체 하나만 적어서 사방에 숨겨놨다가 그 위치만 종이 한장에 적어 두면 되겠다!

Case 1.

t_사람 *주소배열[몇명];

 void 함수(t_사람 *친구)
 {
    (*친구).name;
    or
    친구 -> name;
  }
  
t_사람 *베프찾는함수(ENTJ)
{
    return 주소배열[n번째];
}

Case 2.

t_사람 **주소배열;
주소배열 = (t_사람)malloc(sizeof(t_사람 *) * 사람 수);
주소배열[n번째] = (t_사람 *)malloc(sizeof(t_사람));

# 연결 리스트 삽입x삭제x검색

첫 번째 데이터 주소(.//. 배열이름) 따로 보관

  • 각 node 에 다음노드주소 저장
  • node = data field + link field
  • 연결리스트 첫 주소는 포인터 변수를 만들어서 따로 저장
typedef struct node
{
    char *data; //data field
    struct node *next; // link field
}   t_node;

t_node *head = NULL;
//head: 첫번쨰 노드 주소 따로 저장하는 역할
// 현재 상태는 node 개수가 0
//i.e. head는 node에 안들어감.

example for you comprehension.

head = (t_node *)malloc(sizeof(t_node));
head->data = "화요일";
head->next = NULL;

t_node *q = (t_node *)malloc(sizeof(t_node));
q->data = "목요일";
q->next = NULL;
head->next = q;

q = (t_node *)malloc(sizeof(t_node));
//같은 변수라도 메모리 새로 할당해주면 빈 땅에 새롭게 메모리가 할당됨.
q->data = "월요일";
q->next = head;
head = q;

t_node *iter = head;
while(!iter)
{
    printf("%s\n", iter->data);
    iter = iter->next;
}

# 연결리스트의 맨 앞에 새 노드 삽입

t_node *tmp = (t_node)malloc(sizeof(t_node));
tmp->data = "Ann";
tmp->next = head;
head = tmp;

⚠️head가 NULL이어도 문제가 없는지 확인!(i.e. node 개수가 0)

  1. head가 전역인 경우

    t_node *tmp = (t_node)malloc(sizeof(t_node));
    tmp->data = "Ann";
    tmp->next = head;
    head = tmp;

    head가 전역이 아닌데 위와같이 쓸 경우

    func1()
    {func2("Ann", head);}
    func2(char *data, t_node head)
    {
        t_node *tmp = (t_node)malloc(sizeof(t_node));
        tmp->data = data;
        tmp->next = head;
        head = tmp; //여기가 문제
    }

    func2에선 head가 바뀌겠지만 func1에선 안바뀐다.

    ⚠️head를 매개변수로 받을 땐 t_node *로 받지마라. t_node **로 받아라.

  2. head가 전역이 아닌 경우

    func2(char *data, t_node **ptr_head)
    {
        t_node *tmp = (t_node *)malloc(sizeof(node));
        tmp->data = data;
        tmp->next = *ptr_head;
        *ptr_head = tmp;
    }
    

    # 연결리스트의 어떤 노드 뒤에 새로운 노드 삽입하기

func(t_node *prev, char *data)
{
    if(prev == NULL)
        return NULL;
    t_node *tmp = (t_node)malloc(sizeof(t_node));
    tmp->data = "Jim";
    tmp->next = prev->next;
    prev->next = tmp;
}

# 첫번째 노드의 삭제

#어떤 노드의 다음 노드 삭제하기

if(!prev)
{
    prev->next = prev->next->next;
}

# 연결리스트 순회하기

t_node *find(char *word)
{
    t_node *p  = head;
    while(p)
    {
        if(strcmp(p->data, word) == 0)
            return p;
        p = p->next;
    }
    return NULL;
}

연결리스트의 index번째 노드의 주소를 반환한다.

profile
노는게 젤 조아. 친구들 모여라!!

0개의 댓글