티스토리 뷰

SLL 숫자데이터 삽입

// Singly Linked List


#include <stdio.h>
#include <stdlib.h>
int in;
//node 구조체정의
struct node {
	int data;
	struct node *next;
};
struct node* head = 0;


//sLL에 추가하는함수
void addToSLL(int data)
{
	struct node *cur;
	cur = (struct node*)malloc(sizeof(struct node));
	cur->data = data;
	cur->next = 0;

	//1.SLL이 empty
	if (head == 0) {

		head = cur;
		return;
	}
	//2 else
	//2.1끝을찾자
	//2.2끝에 붙이자
	{
		struct node* lastnode = head;
		while (lastnode->next != 0)
		{
			lastnode = lastnode->next;
		}
		lastnode->next = cur;
		return;
	}
}


/* SLL에 삽입하는함수
where 을 찾아서 그뒤에 what을 추가
where가 없으면 맨앞에 what을 추가*/
void insertToSLL(int where, int what)
{
	//1.where를찾자
	struct node *wp = head;

	while (1) {

		if (wp == 0) {
			break;
		}
		if (wp->data == where) {
			break;
		}
		wp = wp->next;
	}

	{

		struct node *cur;
		cur = (struct node *)malloc(sizeof(struct node));
		cur->data = what;
		cur->next = 0;

		if (wp == 0) { // where를 가진 노드가 없으므로 맨앞에 추가

			cur->next = head;
			head = cur;
			return;
		}
		else { //where를 찾았으므로 뒤에 추가

			cur->next = wp->next;
			wp->next = cur;
		}
	}
}

//data를 찾아서 삭제
void delFromSLL(int data)
{

	struct node *cur = head;
	while (1) {  // 찾는다
		if (cur == 0) {
			break;
		}
		if (cur->data == data) {
			break;
		}
		cur = cur->next;
	}

	if (cur == 0) { //지울 것을 못 찾았음

		return;
	}
	{
		//1. 맨 앞의 것을 가리키는 경우
		if (cur == head) {
			head = head->next;
			free(cur);
			return;
		}
		else { //2. 아닌경우
			struct node *prev = head; //previous
			while (prev->next != cur) { // prev 가 cur 를가리켜야하므로 찾는다
				prev = prev->next;
			}
			prev->next = cur->next;
			free(cur);
			return;
		}

	}
}

// 위치를 찾아서 삭제
void DelLocation(int n)
{
	int i;
	struct node* find = head;
	if (n == 1) {
		delFromSLL(head->data);
		return;
	}
	if (n >= in) return;
	for (i = 1; i < n; i++) {
		find = find->next;
	}
	delFromSLL(find->data);
	return;
}

//완전삭제
void destroySLL()
{

	struct node *cur = head;

	while (1) {
		if (cur == 0) {
			return;
		}
		head = head->next;
		free(cur);
		cur = head;
	}
}
void destroyReverse()
{
	struct node *cur;
	while (1) {
		cur = head;
		if (head->next == 0) { //노드가 하나남게될 경우
			free(head);
			head = 0;
			return;
		}
		while (cur->next->next != 0) {
			cur = cur->next;
		}
		free(cur->next);
		cur->next = 0;
	}
}

//SLL에 들어있는 데이터를 앞에서부터 차례로출력
void showSLL()
{
	struct node *cur = head;

	while (cur != 0) {
		printf("%d ", cur->data);
		cur = cur->next;
	}
	return;
}

// showSLL 의 역순
void showSLLReverse()
{
	struct node *cur;
	while (1) {
		cur = head;
		if (head->next == 0) { //노드가 하나남게될 경우
			printf("%d", head->data);
			head = 0;
			return;
		}
		while (cur->next->next != 0) {
			cur = cur->next;
		}
		printf("%d ", cur->next->data);
		cur->next = 0;
	}
}

int main(void)
{
	int i;
	int num;
	int ins1, ins2;
	scanf("%d", &in);
	for (i = 0; i < in; i++) {
		scanf("%d",&num);
		addToSLL(num);
	}
	scanf("%d", &ins1);
	scanf("%d", &ins2);
	insertToSLL(ins1, ins2);
	showSLL();

	return 0;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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