without haste but without rest
[C / 자료구조] 5주차 과제 - 연결 리스트 추가 기능 구현 본문
#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");
}
'Homework' 카테고리의 다른 글
[python / 계프] 5주차 실습 - 딕셔너리 재귀 (0) | 2020.04.17 |
---|---|
[python / 계프] 5주차 과제 - 딕셔너리 (0) | 2020.04.17 |
[python / 계프] 4주차 자율과제 - key, 람다 연습 (0) | 2020.04.14 |
[C / 자료구조] 4주차 실습문제4 - 뱅킹 시뮬레이션 (0) | 2020.04.09 |
[C / 자료구조] 4주차 과제 - 뱅킹 시뮬레이션 (0) | 2020.04.09 |
Comments