////이중연결리스트////
구조체 포인터 llink, rlink
view, add, del, serach
add: 먼저 새로운 노드 p, data 형성
1. new의 rlink가 b노드(=a노드의 r링크)
2. a노드의 rlink가 new.
3. new의 llink가 a노드
4. new의 r링크(b노드)의 llink가 new.
[예시]
addNode(head, 10);
addNode(head, 20);
addNode(head, 30);
addNode(head, 40);
del: a-old-b 상태
old의 llink의 rlink를 old의 rlink가 가리키는 노드로 바꾸기
old의 rlink의 llink는 old의 llink가 가리키는 노드로 바꾸면 끝.
그다음 free()
[예시]
delNode(head->rlink);
*/
/*
#include <stdio.h>
#include <memory.h>
typedef struct _node
{
int data;
struct _node* llink;
struct _node* rlink;
} node;
node* newNode()
{
node* n= (node*)malloc(sizeof(node));
n->rlink=NULL;
n->llink=NULL;// 포인터 값 모두 초기값을 NULL로 해줘야 함.]
n->data=0;
return n;
}
void view(node* head)
{
node* tmp=head->rlink;
while(tmp!=NULL)
{
printf("%d ", tmp->data);
tmp=tmp->rlink;
}
printf("\n");
}
void addNode(node* prev, int data)
{
node* p= newNode();
p->data=data;
p->rlink=prev->rlink;
prev->rlink=p;
p->llink=prev;
if(p->rlink!=NULL)
p->rlink->llink=p; // p다음 노드가 NULL이면 NULL의 llink를 p로 지정할 수 없음. 그러니 조건 필요.
}
void delNode(node* old)
{
if(old->rlink==NULL)
return -1;// ==으로 써야지..
old->llink->rlink=old->rlink;
old->rlink->llink=old->llink;
free(old);
}
/*
int search_node(node* head, int data) // 노드 위치 찾기
{
node* tmp= head->rlink;
for(int i=1; tmp!=NULL; i++)
{
if(tmp->data==data)
return i;
tmp=tmp->rlink; // tmp 계속 바뀌어야 함.
}
return -1;
}
*/
node* find_node(node* head, int data) // 노드찾기.
{
node* tmp= head->rlink;
for(int i=1; tmp!=NULL; i++)
{
if(tmp->data==data)
return tmp; // tmp가 노드니까.
tmp=tmp->rlink; // tmp 계속 바뀌어야 함.
}
return -1;
}
int main()
{
int b, c, d, e, k;
node* head=newNode();
addNode(head, 1);
addNode(head, 2);
addNode(head, 3);
addNode(head, 4);
node* s=find_node(head->rlink, 2);
addNode(s, 50);
view(head);
/*
while(1)
{
printf("번호를 입력하십시오: ");
scanf("%d", &k);
if(k==1)
{
view(head);
}
else if(k==2)
{
printf("추가할 데이터: ");
scanf("%d", &a);
addNode(head, a);
view(head);
}
else if(k==3)
{
delNode(head->rlink->rlink->rlink);
view(head);
}
else if(k==4)
{
printf("탐색할 데이터: ");
scanf("%d", &b);
printf("%d", search_node(head->rlink, b));
printf("\n");
}
else
{
printf("종료");
return;
}
}
*/
////[특정 데이터 위치 탐색, 그리고 그 노드에 새 노드 추가or 노드 삭제]
/*탐색해서 위치 찾고
그 다음에 해당 위치에 맞는 주소=node를 반환받고
그거 prev로 삼고 addNode 하면 됨.
}
/*
숙제.
스택을 malloc(쌓을 때마다 new스택), push, pop, view,



