일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- html plug-in
- #CallByAddress
- #C++ 연산자함수오버로딩
- #2차원배열
- html5 new tag
- docker example
- #다차원포인터
- hyperledger transaction
- mac terminal command
- git flow
- #자바상속#자바이즈어#is~a
- html code
- html charset
- relative path
- #bubbleSort
- #1차원배열
- #binary
- 하이퍼레저패브릭
- #3차원배열
- #성적관리프로그램
- #JAVASCRIPT
- 토큰경제
- #C++ has~a
- html id
- html youtube
- html object
- html multimedia
- html video
- #android activity
- border-box
- Today
- Total
A sentimental robot
Double LinkedList 본문
#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 |