[자료구조] - 연결 리스트

[]·Computer Science/Data Structure

1. 연결리스트(Linked List)란?

 - 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료구조이다.

연결리스트

 - 각 노드는 다음 노드를 가리키는 포인터를 포함한다. 다음 노드를 가리키는 포인터는 다음 노드의 주소 값을 갖고 있다. 각 포인터 변수의 주소도 따로 존재한다.

 

2. 단순연결리스트의 구현

 - 노드의 구성

typedef struct _Node
{
	int data;				//저장할 데이터
    struct _Node* next;		//다음 노드를 가리킬 포인터
}Node;

- 연결리스트의 초기화(Init)

Node* head;

void init()
{
	head = NULL;
}

- 연결리스트의 삽입(Insert)

void insert(int data)
{
	Node* ptr;
    Node* newNode = (Node*)malloc(sizeof(Node));	//newNode 할당
    newNode->data = data;	// 데이터 할당
    newNode->next = NULL;	// next 포인터 초기화
    
    if(head == NULL)
    {
    	head = newNode;
    }
    else
    {
    	if(head->data > newNode->data)
        {
        	newNode->next = head;
            head = newNode;
            return;
        }
        for(ptr = head; ptr->next; ptr=ptr->next)
        {
        	if(ptr->data < newNode->data && ptr->next->data > newNode->data)
            {
            	newNode->next = ptr->next;
                ptr->next = newNode;
                return;
            }
        }
        ptr->next = newNode;
    }
}

- 연결리스트의 삭제(Delete)

int deleteNode(int data){
    Node *cur, *prev;
    cur = prev = head;
    
    if(head == NULL){    // empty list 
        printf("error: list is empty!\n");
        return -1;
    }        
    
    if(head->data == data){    // 가장 앞의 노드 삭제
        head = cur->next;
        cur->next = NULL;
        free(cur);
        return 1;
    }
    
    for(; cur; cur= cur->next){    // 중간 혹은 마지막 노드 삭제
        if(cur->data == data){
            prev->next = cur->next;
            cur->next = NULL;
            free(cur);
            return 1;
        }
        prev = cur;
    }
    
    printf("error : there is no %d!\n", data);
    return -1;    // 해당 데이터가 리스트에 존재하지 않음 
}

- 연결리스트의 탐색(Search)

int search(int data)
{
	Node* ptr;
    for(ptr = head; ptr; ptr=ptr->next)
    {
    	if(ptr->data == data)	// 데이터 발견
        {
        	return 1;
        }
    }
    
    return -1;	// 데이터 미 발견
}

- 전체 소스코드

#include <stdio.h>
#include <stdlib.h>
typedef struct _Node{
    int data;            /* 저장할 데이터 */
    struct _Node* next;    /* 다음 노드를 가리킬 포인터*/
}Node;
Node* head;
void init(){
    head = NULL;
}
void insert(int data){
    Node* ptr;
    Node* newNode = (Node*)malloc(sizeof(Node)); 
    newNode->data = data;    // 데이터 할당 
    newNode->next = NULL;    // next 포인터 초기화 
    
    if(head == NULL){    // empty
        head = newNode;
    }else{
		// not empty, 가장 앞에 노드 추가 
        if(head->data > newNode->data){    
            newNode->next = head;
            head = newNode;
            return;
        }
		 // 중간에 노드 추가 
        for(ptr = head; ptr->next; ptr=ptr->next){   
            if(ptr->data < newNode->data && ptr->next->data > newNode->data){
                newNode->next = ptr->next;
                ptr->next = newNode;
                return;
            }
        }
        
        ptr->next = newNode;    // 마지막에 노드 추가  
    }
    
}
int deleteNode(int data){
    Node *cur, *prev;
    cur = prev = head;
    
    if(head == NULL){    // empty list 
        printf("error: list is empty!\n");
        return -1;
    }        
    
    if(head->data == data){    // 가장 앞의 노드 삭
        head = cur->next;
        cur->next = NULL;
        free(cur);
        return 1;
    }
    
    for(; cur; cur= cur->next){    // 중간 혹은 마지막 노드 삭제
        if(cur->data == data){
            prev->next = cur->next;
            cur->next = NULL;
            free(cur);
            return 1;
        }
        prev = cur;
    }
    
    printf("error : there is no %d!\n", data);
    return -1;    // 해당 데이터가 리스트에 존재하지 않음 
}
int search_list(int data){
    Node* ptr;
    for(ptr = head ; ptr ; ptr=ptr->next){
        if(ptr->data == data){    // data 발견  
            return 1;
        }
    }
    
    return -1; // 데이터 미 발견 
}
void printList(){
    Node* ptr;
    for(ptr=head; ptr->next; ptr= ptr->next){
        printf("%d->", ptr->data);
    }
    printf("%d\n", ptr->data);
}
int main(){
    int data;
    
    init();
    insert(100);
    insert(300);
    insert(50);
    insert(200);
    printList();
    deleteNode(50);
    printList();
    deleteNode(200);
    printList();
         
    return 0;
}

'Computer Science > Data Structure' 카테고리의 다른 글

[자료구조] - 해쉬테이블  (0) 2023.07.16
'Computer Science/Data Structure' 카테고리의 다른 글
  • [자료구조] - 해쉬테이블
yjhan1999
yjhan1999
백엔드 개발자가 되고 싶어요
  • yjhan1999
    YJ 개발일기
    yjhan1999
  • 전체
    오늘
    어제
    • 분류 전체보기 (27)
      • 개발 일기 (6)
        • 카카오테크캠퍼스 2기 (2)
        • JAVA (0)
        • Git|Github (0)
        • Spring (1)
      • 프로젝트 (6)
        • TALKAK (5)
        • GreenTalk (1)
      • Computer Science (3)
        • Algorithm (3)
        • Data Structure (2)
      • 자격증 (7)
        • 정보처리기사 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    기사
    자격증
    운영체제
    개발자
    개발
    코딩
    취업
    Spring
    카테캠
    카카오
    Redis
    백엔드
    OS
    CS
    ehcache
    정보처리기사
    해시테이블
    프로젝트
    캐시
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
yjhan1999
[자료구조] - 연결 리스트
상단으로

티스토리툴바