without haste but without rest

[C / 자료구조] 5주차 과제 - 연결 리스트 추가 기능 구현 본문

Homework

[C / 자료구조] 5주차 과제 - 연결 리스트 추가 기능 구현

JinungKim 2020. 4. 16. 21:07
#include "list.h"
#define CREATE 1
#define APPEND 2
#define PUSH 3
#define POP 4
#define INSERTAT 5
#define VALUEAT 6
#define DELETEAT 7
#define END 8
ListNode* create(int start, int end, int step);
ListNode* get_last_node(ListNode* head);
ListNode* get_at(ListNode* head, int at);

const char* cmdstr[] = { "create3", "append1", "push1", "pop", "insertat2",
					"valueat1", "deleteat1", "end" };
void main()
{	
	int n;
	element e;
	for (int i = 0; i < 8; i++) {
		printf("(%d) %-9s", i + 1, cmdstr[i]);
		if (i % 3 == 2) printf("\n");
	}
	printf("\n");
	ListNode* head = NULL, * result = NULL, * pre;

	int menu = 1;
	int start = 10, end = 100, step = 12, at;
	head = create(start, end, step);
	print_list(cmdstr[menu - 1], head);


	while (menu != END) {
		printf(">> "); scanf_s("%d", &menu);
		switch (menu) {
		case CREATE:
			scanf_s("%d %d %d", &start, &end, &step);
			head = create(start, end, step);
			break;
		case APPEND:
			scanf_s("%d", &e);
			head = insert(head, NULL, e);
			break;
		case PUSH:
			scanf_s("%d", &e);
			head = insert_first(head, e);
			break;
		case POP:
			head = delete_first(head);
			break;
		case INSERTAT:
			scanf_s("%d %d", &n, &e);
			if (n == 0) head = insert_first(head, e);
			else if (n == -1) insert(head, NULL, e);
			else insert(head, get_at(head, n - 1), e);
				break;
		case VALUEAT:
			scanf_s("%d", &n);
			printf("%d번의 데이터: %d\n", n, get_at(head, n)->data);
				break;
		case DELETEAT:
			scanf_s("%d", &n);
			if (n == -1) delete(head, NULL);
			else if (n == 0) head = delete_first(head);
			else delete(head, get_at(head, n - 1)); 
				break;
		case END: break;
		}
		print_list(cmdstr[menu - 1], head);
	}
}

ListNode* get_last_node(ListNode* head)
{
	ListNode* cur = head;
	if (cur == NULL || cur->link == NULL)
		return cur;
	while (cur->link != NULL)
		cur = cur->link;
	return cur;
}

// 과제 - create 함수 작성
ListNode* create(int start, int end, int step) {
	ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
	tmp->data = start;
	tmp->link = NULL;
	int i = start+step;
	while (i <= end) {
		insert(tmp, NULL, i);
		i += step;
	}
	return tmp;
}

// 과제 - get_at 함수 작성
ListNode* get_at(ListNode* head, int at) {
	if (at == 0) return head;
	ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
	tmp = head->link;
	for (int i = 1; i < at; i++) {
		if (tmp->link == NULL) {
			error("인덱스 에러");
			return;
		}
		tmp = tmp->link;
	}
	return tmp;
}

 

 

#pragma once
#include <stdio.h>
#include <stdlib.h>

typedef int element;
typedef struct ListNode { 	// 노드 타입
	element data;
	struct ListNode* link;
} ListNode;

void error(char* message);
ListNode* insert_first(ListNode* head, int value);
ListNode* insert(ListNode* head, ListNode* pre, element value);
ListNode* delete_first(ListNode* head);
ListNode* delete(ListNode* head, ListNode* pre);
void print_list(const char* cmd, ListNode* head);

 

 

 

#include "list.h"
// 오류 처리 함수
void error(char* message)
{
	fprintf(stderr, "%s\n", message);
	exit(1);
}
ListNode* insert_first(ListNode* head, int value)
{
	ListNode* p = (ListNode*)malloc(sizeof(ListNode));	//(1)
	p->data = value;					// (2)
	p->link = head;	// 헤드 포인터의 값을 복사	//(3)
	head = p;	// 헤드 포인터 변경		//(4)
	return head;	// 변경된 헤드 포인터 반환
}

// 마지막 요소를 반환 (EJLEE)
ListNode* get_last_node(ListNode* head);

// 노드 pre 뒤에 새로운 노드 삽입
ListNode* insert(ListNode* head, ListNode* pre, element value)
{
	ListNode* p = (ListNode*)malloc(sizeof(ListNode));	//(1)
	p->data = value;		//(2)
	// pre가 널이면 마지막에 삽입
	if (head == NULL) {
		p->link = NULL;
		return p;
	}
	if (pre == NULL)
		pre = get_last_node(head);
	p->link = pre->link;	//(3)	
	pre->link = p;		//(4)	
	return head;		//(5)	
}

ListNode* delete_first(ListNode* head)
{
	ListNode* removed;
	if (head == NULL) return NULL;
	removed = head;	// (1)
	head = removed->link;	// (2)
	free(removed);		// (3)
	return head;		// (4)
}

// pre가 가리키는 노드의 다음 노드를 삭제한다.
ListNode* delete(ListNode* head, ListNode* pre)
{
	if (head == NULL || head->link == NULL)
		return NULL;
	// pre가 NULL이면 마지막을 삭제  (EJLEE)
	if (pre == NULL) {
		pre = head; 
		while (pre->link->link != NULL) { 
			pre = pre->link; 
		}
	}  // pre가 마지막 직전 노드가 됨
	ListNode* removed;
	removed = pre->link;
	pre->link = removed->link;		// (2)
	free(removed);			// (3)
	return head;			// (4)
}

void print_list(const char* cmd, ListNode* head)
{
	printf("%-10s[", cmd);
	for (ListNode* p = head; p != NULL; p = p->link)
		printf(" %2d ", p->data);
	printf("]\n");
}
Comments