#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

struct node {
	int item;
	struct node* llink;
	struct node* rlink;
};

struct node* avail = NULL;

void addq(struct node*, int);
void deleteq(struct node*);
void listprintf(struct node*);
void erase(struct node*, struct node*);

int main()
{
	struct node* head;
	int cond, item;


	// dummy-node 생성
	head = (struct node*)malloc(sizeof(struct node));
	if (head == NULL)
	{
		fprintf(stderr, "The memory is full\n");
		exit(1);
	}

	//Queue 초기화
	head->llink = head;
	head->rlink = head;
	/*head->item = 0;*/

	while (1)
	{
		printf("1:insert\t2:delete\t3:output\t4:exit\n");
		scanf("%d", &cond);
		if (cond == 1)
		{
			printf("Input Item\n");
			scanf("%d", &item);
			addq(head, item);
		}
		else if (cond == 2)
			deleteq(head);
		else if (cond == 3)
			listprintf(head);
		else if (cond == 4)
		{
			erase(head, avail);
			break;
		}

		else
		{
			printf("Wrong Input\n");
			exit(1);
		}
	}


	return 0;
}

void listprintf(struct node* ptr)
{
	struct node* init_position = ptr;
	ptr = ptr->rlink;
	printf("-----------list---------------\n");

	for (; init_position != ptr; ptr = ptr->rlink)
		printf("%4d", ptr->item);
	printf("\n");
}

void addq(struct node* ptr, int item)
{
	//struct node* l_ptr = ptr->llink;
	struct node* r_ptr = ptr->rlink;
	struct node* temp = NULL;

	if (avail)
	{
		temp = avail;
		avail = avail->rlink;
		/*temp->llink = NULL;
		temp->rlink = NULL;*/
	}
	else
		temp = (struct node*)malloc(sizeof(struct node));


	if (temp == NULL)
	{
		fprintf(stderr, "The memory is full\n");
		exit(1);
	}
	temp->item = item;

	temp->llink = ptr;
	temp->rlink = ptr->rlink;
	ptr->rlink->llink = temp;
	ptr->rlink = temp;

	/*temp->llink = ptr->llink;
	temp->rlink = ptr;
	ptr->llink = temp;
	if (ptr->rlink == ptr)
		ptr->rlink = temp;
	else
		l_ptr->rlink = temp;*/

}

void deleteq(struct node* ptr)
{
	//struct node* delete_node = ptr->rlink;
	struct node* delete_node = ptr->llink;
	if (ptr->llink == ptr)
	{
		printf("No Data\n");
		return;
	}
	else
	{
		delete_node->llink->rlink = delete_node->rlink;
		delete_node->rlink->llink = delete_node->llink;


		/*ptr->rlink = delete_node->rlink;
		if (ptr->llink == delete_node)
			ptr->llink = ptr;
		else
			delete_node->rlink->llink = ptr;*/

	}

	printf("deleted data: %d\n", delete_node->item);
	delete_node->llink = NULL;
	delete_node->rlink = NULL;
	if (avail)
		delete_node->rlink = avail;
	else
		avail = delete_node;
}

void erase(struct node* head, struct node* avail)
{
	printf("실행");
	struct node* temp;
	while (head != (head->rlink))
		deleteq(head);

	while (avail != NULL)
	{
		temp = avail;
		avail = avail->rlink;
		free(avail);
	}

	free(head);

}

+ Recent posts