๋ฆฌ์คํธ๋ ์์๋ฅผ ๊ฐ์ง ํญ๋ชฉ๋ค์ ๋ชจ์์ด๋ค.
๋ฆฌ์คํธ ์ฐ์ฐ
์๋ก์ด ํญ๋ชฉ์ ๋ฆฌ์คํธ์ ์ฒ์, ์ค๊ฐ, ๋์ ์ถ๊ฐ
๊ธฐ์กด์ ํญ๋ชฉ or ๋ชจ๋ ํญ๋ชฉ ์ญ์
๊ธฐ์กด ํญ๋ชฉ ๋ณ๊ฒฝ(๋์น)
ํน์ ํญ๋ชฉ์ ๊ฐ์ง๊ณ ์๋์ง ๊ฒ์
ํน์ ์์น ํญ๋ชฉ ๋ฐํ
๋ฆฌ์คํธ๊ฐ ๋น์๋์ง ์ฐผ๋์ง
๋ฆฌ์คํธ ๊ตฌํ ๋ฐฉ๋ฒ
์์ฐจ์ ์ธ ๋ฐฐ์ด์ ์ด์ฉ
์ฝ์
๋๋ ์ญ์ ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๋ค.
ํญ๋ชฉ์ ๊ฐ์๊ฐ ์ ํ๋๋ค.
์ด๋ 1์ฐจ์ ๋ฐฐ์ด์ ํญ๋ชฉ๋ค์ ์์๋๋ก ์ ์ฅํด ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๋ค. ์ฝ์
/ ์ญ์ ์ ํญ๋ชฉ๋ค์ ์ด๋ํด์ผํ๋ค.
์ด๋ํ์ = ๋ง์ง๋ง ์์ ์ธ๋ฑ์ค - ์ฝ์
ํ ์๋ฆฌ ์ธ๋ฑ์ค +1
์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด์ฉ
ํ๋์ ๋
ธ๋๊ฐ ๋ฐ์ดํฐ์ ๋งํฌ๋ก ๊ตฌ์ฑ๋์ด์๊ณ ๋งํฌ๊ฐ ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ํํ๋ก ๊ตฌํํ๋ค.
๋
ธ๋(node ) = ๋ฐ์ดํฐํ๋ + ๋งํฌํ๋
๋ฐ์ดํฐ ํ๋ : ๋ฆฌ์คํธ์ ์์, ์ฆ ๋ฐ์ดํฐ ๊ฐ์ ์ ์ฅํ๋ ๊ณณ
๋งํฌ ํ๋ : ๋ค๋ฅธ ๋
ธ๋์ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ ์ฅ์(ํฌ์ธํฐ)
์ด๋ ๋ฉ๋ชจ๋ฆฌ์์์์ ๋
ธ๋์ ๋ฌผ๋ฆฌ์ ์์๊ฐ ๋ฆฌ์คํธ์ ๋
ผ๋ฆฌ์ ์์์ ์ผ์นํ ํ์๋ ์๋ค.
Head pointer : ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์
Tail : ๋ฆฌ์คํธ์ ๋ง์ง๋ง ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์
์ฅ์
์ฝ์
, ์ญ์ ๊ฐ ํจ์จ์ ์ด๋ค.
์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ์์๋ค.
๋จ์
์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๋ค.
์ฐ๊ฒฐ๋ฆฌ์คํธ ์ข
๋ฅ
๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
ํ๋์ ๋งํฌ ํ๋๋ฅผ ์ด์ฉํด์ ์ฐ๊ฒฐํ ๋ฆฌ์คํธ์ด๋ค.
๋ง์ง๋ง ๋
ธ๋์ ๋งํฌ ๊ฐ์ NULL
์ฝ์
void add_first(Node **head, int data){
Node *p = new_node();
p->data = data;
p->next = *head;
*head = p;
}
void add(Node *head, Node *tail, int data){
Node *p = head;
Node *new = NULL;
while(p->next->data <= data && p->next!=NULL)
p=p->next;
if(p->data == data){
printf("์ด๋ฏธ ์กด์ฌํ๋ ๋ฐ์ดํฐ ์
๋๋ค.");
return;
}
new = new_node();
new->next = p->next;
new->data = data;
p->next = new;
}
void add_last(Node **tail, int data){
Node *new = new_node();
Node *p = *tail;
new->data = data;
new->next = NULL;
p->next = new;
*tail = new;
}
void create_list(Node **head,Node **tail){
Node *p = *head;
int data;
while(1){
printf("๊ณ์์ ์ฐจ์๋ฅผ ์ฐจ๋ก๋๋ก ์
๋ ฅํด์ฃผ์ธ์.(0์ ์ข
๋ฃ) : ");
scanf("%d",&data);
if(!data)break;
if(p==NULL){
p=new_node(data);
(*head)=(*tail)=p;
}else{
while(p->next!=NULL)
p=p->next;
if(data<(*head)->data)add_first(head, data);
else if(data>(*tail)->data)add_last(tail, data);
else add(*head, data);
}
}
}
์ญ์
void delete_node(Node **head, Node **tail, int data){
Node *p = *head;
Node *tmp=NULL;
while(p!=NULL){
if(p->data == data)break;
tmp = p;
p = p->next;
}
if(p==NULL){
printf("๋ฆฌ์คํธ๊ฐ ๋น์ด์ ธ์๊ฑฐ๋ ์ญ์ ํ๊ณ ์ถ์ ๋ฐ์ดํฐ(%d)๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.\n",data);
return;
}
if( p == *head ){
*head = p->next;
free(p);
return;
}
tmp->next = p->next;
free(p);
if(tmp->next==NULL) *tail = tmp;
printf("๋ฐ์ดํฐ(%d)๋ฅผ ๋ฆฌ์คํธ์์ ์ญ์ ํ์ต๋๋ค. \n",data);
}
void delete_list(Node **head){
Node *p = *head;
Node *tmp = NULL;
while(p!=NULL){
tmp=p->next;
free(p);
p=tmp;
}
*head = NULL;
}
์ถ๋ ฅ
int print_node(Node *head){
Node *p = head;
int i=0;
while(p!=NULL){
i++;
printf("[%d] : %d ",i,p->data);
p=p->next;
}
printf("\n\n");
return i;
}
์์
void edit_node(Node **head,int before,int after){
Node *p = *head;
while(p!=NULL){
if(p->data==before){
p->data=after;
return;
}
}
printf("๋ฆฌ์คํธ๊ฐ ๋น์ด์ ธ์๊ฑฐ๋ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.\n");
}
์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ง์ง๋ง ๋
ธ๋์ ๋งํฌ๊ฐ ์ฒซ ๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฆฌ์คํธ์ด๋ค. ํ๋์ ๋
ธ๋์์ ๋ค๋ฅธ ๋ชจ๋ ๋
ธ๋๋ก์ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋ค.
๋ณดํต ํค๋ํฌ์ธํฐ๊ฐ ๋ง์ง๋ง ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๊ตฌ์ฑํ๋ฉด ๋ฆฌ์คํธ์ ์ฒ์์ด๋ ๋ง์ง๋ง์ ๋
ธ๋๋ฅผ ์ฝ์
ํ๋ ์ฐ์ฐ์ด ๋งค์ฐ ๊ฐ๋จํด์ง๋ค.
์ฝ์
๋ค๋ฅธ ์ฐ์ฐ์ ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฐ๋ค.
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
} Node;
Node *new_node(int data){
Node *new = (Node *)malloc(sizeof(Node));
new->data = data;
return new;
}
/*
* p->next = p;
* new->next = head
*/
// ์ํ์์๋ ํ์ฌ ๊ฐ๋ฆฌํค๊ณ ์๋ head์ ์์น๊ฐ ๋ง์ง๋ง ๋
ธ๋์ด๋ฉฐ, head->next๋ ๋งจ ์๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
int insert_node(Node *head, int data){
Node *p = NULL, *new;
p=head;
while(p->next->data <= data )
p=p->next;
if(data == p->data){
printf("์ด๋ฏธ ์กด์ฌํ๋ ๋ฐ์ดํฐ์
๋๋ค.\n");
return 0;
}
new = new_node(data);
new->next = p->next;
p->next = new;
return 1;
}
int push_back(Node **head, int data){
Node * new = new_node(data);
Node * p = *head;
if(p->data == data){
printf("์ด๋ฏธ ์กด์ฌํ๋ ๋ฐ์ดํฐ์
๋๋ค.\n");
return 0;
}
new->next = p->next;
p->next = new;
(*head)=new;
return 1;
}
void create_node(Node **head){
Node *p = NULL;
int data,i=0,j=0;
while(1){
printf("์ฝ์
ํ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์: (์ข
๋ฃ๋ 0)");
scanf("%d",&data);
if(!data)break;
if(p==NULL){
p=new_node(data);
p->next = p;
*head = p;
i++;
}else{
p=*head;
if (data >= (*head)->data) j=push_back(head,data);
else j=insert_node(*head, data);
}
i+=j;
}
return i;
}
์ฌ๊ธฐ์ head ํฌ์ธํฐ๊ฐ ๋ง์ง๋ง ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ง๋ค์ด์ ์ฝ์
ํจ์๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํํ์๋ค.
์ถ๋ ฅ
//๋ณด์ฌ์ค๋๋ length๋ฅผ ๋ณด๋ด์ค์ ๋ช๊ฐ์ ๋
ธ๋๊ฐ ์๋์ง ๋ฐ์ ํ์ ๋๋ ค์ผํ๋ค.
void show_node(Node *head, int length){
Node *p = head->next;
int i;
for(i=0;i<length;i++){
printf("[%d] : %d\n",i+1,p->data);
p=p->next;
}
}
์ญ์
void delete_node(Node **head,int data){
Node *p = (*head)->next , *tmp=NULL;
if(p==NULL){
printf("๋น์ด์๋ ์คํ์
๋๋ค.\n");
return;
}
while(p->data!=data){
tmp = p;
p=p->next;
}
if(p==(*head)->next){
if(p->data==data&&)tmp=(*head);
else{
printf("์ฐพ๋ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.\n");
return;
}
}
tmp->next = p->next;
if(p==*head)*head = tmp;
free(p);
count--;
}
void delete_list(Node **head){
Node *p = *head ,*tmp=NULL;
while(p->next!=*head){
tmp = p;
free(p);
count--;
p=tmp->next;
}
free(p);
(*head)=NULL;
}
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ ํ ๋
ธ๋(prev)๋ฅผ ์ฐพ๊ธฐ ํ๋ ๋จ์ ์ด ์๋ค. ์ฝ์
๋๋ ์ญ์ ์์๋ ๋ฐ๋์ ์ ํ ๋
ธ๋๊ฐ ํ์ํ๋ค.
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ํ๋์ ๋
ธ๋๊ฐ ์ ํ ๋
ธ๋์ ํ์ ๋
ธ๋์ ๋ํ ๋ ๊ฐ์ ๋งํฌ๋ฅผ ๊ฐ์ง๋ ๋ฆฌ์คํธ์ด๋ค. ๋งํฌ๊ฐ ์๋ฐฉํฅ์ด๋ฏ๋ก ์๋ฐฉํฅ ๊ฒ์์ด ๊ฐ๋ฅํ๋ค.
๋จ์
์ด์ ๋
ธ๋๋ฅผ ์ง์ ํ๊ธฐ ์ํด ๋ณ์๋ฅผ ํ๋ ๋ ์ฌ์ฉํด์ผํ๋ฏ๋ก ๊ทธ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
๊ตฌํ์ด ๋ณต์กํด์ง๋ค.
ํค๋๋
ธ๋ : ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง์ง ์๊ณ ๋จ์ง ์ฝ์
, ์ญ์ ์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค.(ํค๋ ํฌ์ธํฐ์ ๊ตฌ๋ณ์ด ํ์ํ๋ค.)
๋
ธ๋ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ
typedef struct node{
int data;
struct node * prev;
struct node * next;
}Node;
์ฝ์
void add_first(Node **head, int data){
Node *p = new_node();
p->data = data;
p->next = *head;
p->prev = NULL;
(*head)->prev = p;
*head = p;
}
//๋ฆฌ์คํธ์ ์ค๊ฐ์ ์ถ๊ฐ
void add(Node *head, Node *tail, int data){
Node *p = head;
Node *new = NULL;
while(p->next->data <= data)
p=p->next;
if(p->data == data){
printf("์ด๋ฏธ ์กด์ฌํ๋ ๋ฐ์ดํฐ ์
๋๋ค.\n");
return;
}
new = new_node();
new->next = p->next;
new->data = data;
new->prev = p;
p->next->prev = new;
p->next = new;
}
// ๋ฆฌ์คํธ์ ๋์ ์ถ๊ฐ
void add_last(Node **tail, int data){
Node *new = new_node();
Node *p = *tail;
new->data = data;
new->next = NULL;
new->prev = p;
p->next = new;
*tail = new;
}
์ญ์
void delete_node(Node **head, Node **tail, int data){
Node *p = *head;
Node *tmp=NULL;
while(p!=NULL){
if(p->data == data)break;
tmp = p;
p = p->next;
}
if(p==NULL){
printf("๋ฆฌ์คํธ๊ฐ ๋น์ด์ ธ์๊ฑฐ๋ ์ญ์ ํ๊ณ ์ถ์ ๋ฐ์ดํฐ(%d)๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.\n",data);
return;
}
if( p == *head ){
*head = p->next;
p->next->prev = NULL;
free(p);
return;
}
if(p==*tail){
(*tail)=tmp;
tmp->next=NULL;
free(p);
return;
}
tmp->next = p->next;
p->next->prev = tmp;
free(p);
printf("๋ฐ์ดํฐ(%d)๋ฅผ ๋ฆฌ์คํธ์์ ์ญ์ ํ์ต๋๋ค. \n",data);
}
์ถ๋ ฅ
//์ค๋ฆ์ฐจ์
int print_node(Node *head){
Node *p = head;
int i=0;
while(p!=NULL){
printf("[%d] : %d ",i,p->data);
p=p->next;
i++;
}
printf("\n\n");
return i;
}
//๋ด๋ฆผ์ฐจ์
int print_node2(Node *tail){
Node *p = tail;
int i=0;
while(p!=NULL){
printf("[%d] : %d ",i,p->data);
p=p->prev;
i++;
}
printf("\n\n");
return i;
}