본문 바로가기

Programings/Data Structs

[Data Struct] 이중 링크드 리스트

반응형
#include <stdio.h>
#include <stdlib.h> //malloc 함수를 쓰기 위해 포함

typedef struct _NODE
{
	char Data;
	struct _NODE *Next;
	struct _NODE *Prev;
} NODE;

NODE *head, *end, *temp;
NODE *temp1, *temp2, *temp3, *temp4;

void Initialize(void);
void InsertNode(NODE *);
void DeleteNode(NODE *);

void main()
{
	NODE *ptr;

	int i=0;
	Initialize();

	ptr=head->Next;
	for(i=0; i<4; i++)
	{
		printf("%2c", ptr->Data);
		ptr=ptr->Next;
	}

	/* 새로운 노드 생성 */
	printf("\n");
	temp=(NODE *)malloc(sizeof(NODE));
	temp->Data='C';

	/* 새로 생성한 노드의 삽입 */
	InsertNode(temp);

	/* 연결 리스트의 노드에 저장한 데이터의 출력 */
	printf("\n\n노드 C의 삭제 전 \n");
	ptr=head->Next;
	for(i=0; i<5; i++)
	{
		printf("%2c", ptr->Data);
		ptr=ptr->Next;
	}

	/* 노드의 삭제 */
	DeleteNode(temp);
	/* 연결 리스트의 노드에 저장된 데이터 출력 */
	printf("\n\n노드 C의 삭제 후 \n");
	ptr = head ->Next;
	for(i=0; i<4; i++)
	{
		printf("%2c", ptr->Data);
		ptr=ptr->Next;
	}
}

void Initialize(void)
{
	NODE *ptr;
	head=(NODE *)malloc(sizeof(NODE));
	end=(NODE *)malloc(sizeof(NODE));

	temp1=(NODE *)malloc(sizeof(NODE));
	temp1->Data='A';
	head->Next=temp1;
	temp1->Next=end;
	temp1->Prev=head;
	end->Next=end;
	ptr=temp1;

	temp2=(NODE *)malloc(sizeof(NODE));
	temp2->Data='B';
	ptr->Next=temp2;
	temp2->Next=end;
	temp2->Prev=ptr;
	ptr=temp2;

	temp3=(NODE *)malloc(sizeof(NODE));
	temp3->Data='D';
	ptr->Next=temp3;
	temp3->Next=end;
	temp3->Prev=ptr;
	ptr=temp3;

	temp4=(NODE *)malloc(sizeof(NODE));
	temp4->Data='E';
	ptr->Next=temp4;
	temp4->Next=end;
	temp4->Prev=ptr;
	ptr=temp4;
}

void InsertNode(NODE *ptr)
{
	NODE *indexptr;
	for(indexptr=head; indexptr !=end; indexptr=indexptr->Next)
	{
		if(indexptr->Data < ptr->Data && indexptr->Next->Data > ptr->Data)
		break;
	}
	ptr ->Next=indexptr->Next;
	indexptr->Next->Prev=ptr;
	indexptr->Next=ptr;
	ptr->Prev=indexptr;

}

void DeleteNode(NODE *ptr)
{
	NODE *indexptr;
	NODE *deleteptr;

	for(indexptr=head; indexptr !=end; indexptr=indexptr->Next)
	{
		if(indexptr -> Next ->Data == ptr->Data)
		{
			deleteptr=indexptr->Next;
			break;
		}
	}
	indexptr ->Next=indexptr->Next->Next;
	indexptr->Next->Next->Prev=indexptr;

	free(deleteptr);
}
반응형