C언어 자료구조 연결리스트(1) LinkedList

기본언어 C언어를 기본으로 설명하겠습니다.
저도 현재 배우는 입장이지만 같이 스터디를 하는 마음으로
권오흠 교수님의 강의를 참고하여 공부하겠습니다. 그럼 시작합니다.!

하나가 아닌 여러개가 일렬로 나열되어있을 때 리스트라고 합니다.
리스트와 집합이 있는데 , 집합은 순서와 상관없이
동일한 데이터들이 있으면 순서상관없이
{1,2,3} == {3,2,1} 같다고 정의하지만

리스트에서는 [0,1,2] != [2,1,0]은 같지 않습니다.
순서의 영향을 받냐 안받냐에 따라 구분됩니다

o리스트
     :기본적인 연산: 삽입(insert), 삭제(remove), 검색(search)등
      대표적인 예로 배열과 연결리스트가 있습니다.

o배열
      :랜덤접근이 가능하고 크기가 고정 - reallocation
      reallocation으로 크기를  해당 배열이 꽉차면 늘릴 필요가 있습니다.
      리스트의 중간에 원소를 삽입,삭제할 경우 데이터를
      새로운 배열을 만들어 (strcpy) 데이터를 옮깁니다.

o연결리스트
      :다른데이터의 이동없이 리스트 중간에 삽입,삭제가 가능하고,
      길이의 제한이 없다, 하지만 연속적인 자료이기 때문에 랜덤 엑세스가 불가능합니다.





 Linked List

*node    *node
head      -> data Monday    data Tuseday       data Friday     Saturday
next 105      next 102      -> next 107       ->  next 103    ->  next null







그림보며 머리속으로 그려보면 도움이 됩니다.





데이터를 여러개 저장하고 싶으면 데이터필드를 여러개 만들어서 저장합니다
지켜야 할것은 링크 필드는 다음 노드의 주소를 저장해야 합니다.

만약에 연결리스트에 맨 앞에 새로운 노드를 삽입할 때는
순서를 지켜서 노드를 삽입 해야합니다.
1 , 2 , 3이라는 순서가 있으면.
       1. 새로운 노드를 생성한다
       2. 그 노드는 다음 노드의 주소를 저장한다
       3. 헤드는 링크필드의 주소를 새로운 노드를 가리킨다.




#include <stdio.h>
#include <stdlib.h>

strcut node{             /*각 노드 저장될 데이터는 하나의 문자열이라 가정한다*/
char *data;
struct node *next;   /*다음 노드 주소를 저장할 필드.
                           자신과 동일한 구조체에 대한 포인터를 가진다는 의미에서
                          "자기참조형 구조체"라고 부르기도 한다.*/
}
typedef struct node Node;
Node *head = NULL;       //첫번째 노드의 주소를 저장할 포인터이다.


int main()
{
head = (Node *)malloc(sizeof(Node));
head->data = "Tuseday";
head->next = NULL;

Node *q = (Node *)malloc(sizeof(Node));
q->data = "Thursday";
q->next = NULL;
head -> next = q;

q = (Node *)malloc(sizeof(Node));
q->data = "Monday";
q->next = head;
head = q;

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

}







만약 순서를 지키지 않는다면 현재의 next 노드주소를 잊어버려 찾을 수 없게된다.
그래서 새로운 노드를 만들고 데이터를 저장하는데 거기에  현재의 head노드를 가리키도록해야 한다. 그다음 Head노드는 새로운 노드를 가리킨다


1)오늘 배운 내용 :
:연결리스트의 기초개념과 프로그램 작성할 때 주의사항,
교수님이 알려주신 부분에는 연결리스트를 다루는 프로그램에서 가장 주의할 점은
내가 작성한 코드가 일반적인 경우만이 아니라 특수한 경우에도 문제 없이 작동하는지
확인하는 것이다. 이 경우에는 기존의 연결 리스트의 길이가 0인 경우, 즉 head가 NULL인 경우에도 문제가 없는지 확인해야한다.
나도 가끔 코드를 작성하다보면 예외처리를 제대로 안해줘서 버그를 일으키는 경우가 많다. 이런점을 인지해서 작성해서 더 나은 코드를 만들도록 해야겠다.

2)미흡한 부분:
:연결리스트를 헷깔리는게 아니라 포인터 개념이 아직 익숙치 않아서 어떤 노드가 어떤 노드를 가르키는지 불분명할 때가 있다.

3)오늘 파트에 대해서 궁금한 부분?
:head 부분이 만약 NULL이라면 어떻게 처리 될것인가?
만약에 head부분이 맨 뒤를 가리킨다면 맨 앞에있는 노드는 주소를 잃어버려 오류처리가 되지 않을까?




0 comments:

Post a Comment