A sentimental robot

Double LinkedList 본문

Data Structure

Double LinkedList

GOD03219 2018. 1. 3. 14:13

#include <stdio.h>
#include<stdlib.h>
#define ASSERT(exp) if(!(exp)){puts("Err\n");}
#define ASSERT2(exp) if((exp)){puts("Err\n");}
#define ASSERTa(exp) if(!(exp)){puts("Err1\n");}
#define ASSERTb(exp) if(!(exp)){puts("Err2\n");}
struct Node
{
 int data;
 struct Node* next;      // 뒤 노드 잡을 포인터
 struct Node * prev;      // 앞 노드 잡을 포인터
};
int Insert(struct Node* root)
{

 if(root->next==NULL)     // 노드가 없을 시 insert 실패
 {
  return 0;

 }
 Node *new1=(Node* )malloc(sizeof(Node));
 new1->next=NULL;
 new1->prev=NULL;


 if(root->next->prev==NULL)     // 첫 노드 앞에 삽입
 {
  new1->next=root->next;
  root->next->prev=new1;
  new1->prev=NULL;


 }else{
  new1->next=root->next;
  new1->prev=new1->next->prev;
  new1->prev->next=new1;     // 앞 노드부터 연결 
  new1->next->prev=new1;

 }
 root->next=new1;     // 삽입 후 커서 이동
 return 1;
}
int Append(struct Node* root)
{
 Node *new1=(Node* )malloc(sizeof(Node));
 new1->next=NULL;
 new1->prev=NULL;

 if(root->next==NULL)
 {
  root->next = new1;
  root->data=root->data+1;

 }else{
  // Node*cur=root->next;
  while(root->next->next !=NULL){
   root->next=root->next->next;
   root->data = root->data+1;
  }
  root->next->next=new1;
  new1->prev=root->next;
  new1->next=NULL;
  root->next=new1;
  root->data=root->data+1;
 }

 return 1;
}
int Delete(struct Node* root)
{
 if(root->next==NULL) return 0;
 Node* del;
 del=root->next;


 if(del->prev==NULL){     // 첫번째를 지울 때
  root->next=del->next;
  if(root->next==NULL)     // 지우고 하나도 없을때
  {
   root->data= root->data-1;
  }else
  {
   root->data=0;
   root->next->prev=NULL;

  }

 }
 else{
  Node*cur=del->prev;
  cur->next=del->next;
  if(del->next !=NULL)     // 지우는 노드가 마지막이 아닐 때
       del->next->prev=cur;


  root->next = cur;
  root->data = root->data - 1;
 }
 del->next=NULL;
 del->prev=NULL;
 free(del);

 

 return 1;
}
int SetData(struct Node* root, int data)
{
 if(root->next==NULL) return 0;
 root->next->data=data;
 return 1;
}
int GetData(struct Node* root, int* data)
{
 if(root->next==NULL) return 0;
 *data=root->next->data;
 return 1;
}


int SetPosition(struct Node* root, int position)
{
 if(root->next==NULL)    return 0;
 if(position>root->data){      // 오른쪽으로 이동
  for(int i=0 ;i<position-root->data; i++)
  {
   if(root->next==NULL) return 0;
   root->next=root->next->next;

  }

 }else{     // 커서 왼쪽으로 이동
  for(int j=0; j<root->data-position ;j++)
  {
   root->next=root->next->prev;
   if(root->next==NULL)  return 0;
  }

 }
 root->data=position;

 

 return 1;
}
int GetPosition(struct Node* root, int* position)
{
 if(root->next==NULL)  return 0;
 *position = root->data;


 return 1;
}

void main(void)
{
 struct Node *root;
 root = (struct Node *) calloc (1,sizeof( struct Node));
 root->next = NULL;
 root->prev = NULL;
 root->data = -1;
 int what = 0;


 int r,n;     // 테스트케이스 시작


 r = Insert(root); ASSERT2(r);     // 첫 삽입

 r = Append(root); ASSERT(r);     // 1개 Append

 r = Insert(root); ASSERT(r);         // Error 발생하면 안됨

 r = Delete(root); ASSERT(r);     // 2개 모두 삭제

 r = Delete(root); ASSERT(r);


 for(int i=0; i<10; i++)     //1 0개 Append, 포지션 바꿔가며 SetData
 {
  r = Append(root); ASSERT(r);
  r = SetPosition(root,i); ASSERT(r);
  r = SetData(root,i);ASSERT(r);
 }

 

 for(int i=0; i<10 ;i++)     // 포지션 바꿔가며 GetData
 {
  r = SetPosition(root,i); ASSERT(r);
  r = GetData(root,&n);ASSERT(r);
 }


 for(int i=0; i<10 ;i++)     // 10개 다 지움
 {
  r = Delete(root); ASSERT(r);
 }

 

 for(int i=0; i<10 ;i++)     // 10개 Append, 10개 Insert
 {
  r = Append(root); ASSERT(r);
  r = Insert(root); ASSERT(r);
 }

 

 for(int i = 0; i < 20 ;i++)  // 20개 Position 바꿔가며, GetPosition, 1~20까지 SetData
 {
  r = SetPosition(root,i); ASSERT(r);
  r = SetData(root,i);ASSERTb(r);
  r = GetPosition(root,&n); ASSERTa(r);
 }

 

 for(int i=0; i<20 ;i++)     // 포지션 바꿔가며 GetData
 {
  r = SetPosition(root,i); ASSERT(r);
  r = GetData(root,&n);ASSERT(r);
 }


 for(int i=0; i<20 ;i++)     // 20개 다 지움
 {
  r = Delete(root); ASSERT(r);
 }

 

 r = SetPosition(root,100); ASSERT2(r);     // 범위를 벗어난 SetPosition


}

'Data Structure' 카테고리의 다른 글

콜라체의 수 / 우박수  (0) 2018.02.13
Bubble sort  (0) 2018.01.03
Single LinkedList Exercise3  (0) 2018.01.03
Map에 대하여..  (0) 2018.01.03
Stack  (0) 2018.01.03