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부분이 맨 뒤를 가리킨다면 맨 앞에있는 노드는 주소를 잃어버려 오류처리가 되지 않을까?




Related Posts:

  • C언어 자료구조 연결리스트(4) LinkedList o오늘 배울 것들  1) 연결리스트의 index번째 노드의 주소를 반환한다.  2)index번째 위치에 새로운노드를 만들어서 삽입한다.  3)index번째 노드를 삭제하고, 그 노드에 저장된 데이터를 반환한다.  4)입력된 스트링… Read More
  • C언어 자료구조 연결리스트(1) LinkedList기본언어 C언어를 기본으로 설명하겠습니다. 저도 현재 배우는 입장이지만 같이 스터디를 하는 마음으로 권오흠 교수님의 강의를 참고하여 공부하겠습니다. 그럼 시작합니다.! 하나가 아닌 여러개가 일렬로 나열되어있을 때 리스트라고 합니다. 리스트와 집합이 있는데 , 집합은 … Read More
  • C언어 자료구조 연결리스트(2) LinkedList 오늘 배워야 할것:         지난 시간 배운 연결리스트의 기초 개념을 숙지하여      기본 동작방식에 대해서 공부해보겠습니다. 첫번째 노드를 가리키는 포인터 Head가 전역변수인… Read More
  • C언어 자료구조 연결리스트(3) LinkedList저번시간에 이어서 이번시간은  1)어떤 노드 뒤에 새로운 노드 삽입하기 2)첫번째 노드의 삭제 3)어떤 노드의 다음 노드 삭제하기 4)연결리스트 순회란 그리고 목적 1)어떤 노드 뒤에 새로운 노드 삽입하기 순서를 명확히… Read More

0 comments:

Post a Comment