이게 뭐지
// Doubly linked list in C
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
struct node* prev; // prev(ious)
int num;
char name[20];
struct node* next; // next
} nodePointer;
int count=0;
void dinsert(nodePointer* node, nodePointer *newnode); //삽입
void ddelete(nodePointer *node, nodePointer *deleted,nodePointer *avail); //삭제
//탐색
//전체 읽기
//작업 종료
int main(void)
{
char choice;
nodePointer *header,*avail,*newnod,*current,*cur2;
int num;
header = (nodePointer*) malloc(sizeof(nodePointer));
avail = (nodePointer*) malloc(sizeof(nodePointer));
current = header;
avail -> prev = NULL;
avail -> next = NULL;
header->next = NULL;
for(;;)
{
printf("i(삽입), d(삭제), f(탐색), r(전체 읽기), q(작업종료)를 선택하시오:");
scanf("%c",&choice);
if(choice == 'i')
{
for(;;)
{
if(avail->next==NULL)
newnod = (nodePointer*) malloc(sizeof(nodePointer));
else {
for(current = avail; count ; current = current->next)
if(current->next == NULL)
break;
for(cur2 = avail; count ; cur2 = cur2->next)
if(cur2->next == current)
break;
newnod = current;
cur2->next=0;
count--;
}
printf("삽입할 자료(학번,이름)을 입력하시오:");
scanf("%d",&newnod->num);
if(feof(stdin)) break;
scanf("%s",&newnod->name);
if(header->next == NULL)
{
newnod->prev = header;
newnod->next = header;
header->prev = newnod;
header->next = newnod;
}
else {
for(current=header->next ; current->num < newnod->num; current = current->next )
{
if(current==header)
break;
}
dinsert(current->prev,newnod);
}
}
}
if(choice == 'f')
{
printf("탐색할 자료의 학번을 입력하시오:");
scanf("%d",&num);
printf("<학번,이름> = ");
for(current=header->next ; current->num <= num; current = current->next )
{
if(current->num == num)
printf("<%d,%s>",current->num,current->name);
if(current==header)
break;
}
printf("\n");
}
if(choice == 'r')
{
printf("<학번,이름> = ");
for(current=header->next ; ; current = current->next )
{
if(current==header)
break;
printf("<%d,%s>",current->num,current->name);
}
printf("\n");
}
if(choice == 'd')
{
printf("삭제할 자료의 학번을 입력하시오:");
scanf("%d",&num);
for(current=header->next ; ; current = current->next )
{
if(current->num==num)
{
ddelete(header,current,avail);
printf("<학번, 이름> = <%d, %s>이 삭제되었습니다.\n",num,current->name);
break;
}
if(current==header)
{
printf("<학번, 이름> = <%d, null>는 없는 자료입니다.\n",num);
break;
}
}
}
if(choice=='q') //작업 종료
return 0;
}
return 0;
}
void dinsert(nodePointer *node, nodePointer *newnode)
{/* insert newnode to the right of node */
newnode->prev = node;
newnode->next = node->next;
node->next->prev = newnode;
node->next = newnode;
}
void ddelete(nodePointer *node, nodePointer* deleted,nodePointer *avail)
{
nodePointer *cur;
cur = avail;
if (node == deleted)
printf("Deletion of header node not permitted.\n");
else {
deleted->prev->next = deleted->next;
deleted->next->prev = deleted->prev;
deleted->next = NULL;
for(cur = avail; cur->next!=NULL ;cur = cur->next);
cur->next = deleted;
cur->next->next=NULL;
count++;
}
}