Information Technology/C (18) 썸네일형 리스트형 [C언어] 연결리스트 - 다항식(1) 이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;) 이번 포스팅에서는 연결 리스트를 이용하여 다항식을 구현하는 방법에 대해 알아보겠습니다. 연결 리스트를 통해 구현하려는 다항식의 특성은 위와 같습니다. struct term// 다항식에서 차수마다 항을 구성하는 term 구조체 { int coef; // 계수 int expo; // 지수, 차수 struct term* next; }; typedef struct term Term; typedef struct Polynomial // 함수의 이름과 시작 주소를 저장하는 Polynomial 구조체 { char name;// 다항식의 이름 Term* first;// 다항식 첫번째 항의 주소 int size;// 항의 개수 } Polyno.. [C언어] 연결리스트 - 개념과 기본 동작들(3) 이번 포스팅에서는 연결 리스트를 순회하고, 연결 리스트에서 특정 인덱스에 값을 추가하거나 삭제하는 방법에 대해 알아보겠습니다. 우선 연결 리스트를 순회하는 방법입니다. 메모리상에 순서대로 저장되는 배열과 달리 연결 리스트는 주로 동적 할당을 통해 메모리 상에 순서 관계없이 저장되지만, 그럼에도 연결된 순서는 분명 존재합니다. 때문에 연결 리스트에 저장된 값을 찾기 위해선 역시 연결 리스트를 처음부터 순서대로 찾아보는 메커니즘으로 데이터를 찾아야 합니다. Node* get_node(int index) { if (index < 0) return NULL; Node* p = head; for (int i = 0; i < index && p != NULL; i++) // index가 연결 리스트의 길이보다 크면.. [C언어] 연결리스트 - 개념과 기본 동작들(2) 이번 포스팅에서는 연결 리스트에서 특정 노드 뒤에 새로운 노드를 삽입하는 방법과, 연결 리스트에서 노드를 삭제하는 방법에 대해 알아보겠습니다. 연결 리스트의 처음이 아닌, 어떤 노드의 뒤에 새로운 노드를 삽입하기 위해선 1. 새롭게 생성할 노드의 next 주소를 prev 노드의 next주소로 변경한 후 2. prev노드의 next 필드를 새롭게 생성한 노드의 주소로 변경하는 것입니다. Node* add_after(Node* prev, char* name) { if (prev == NULL) return 0; Node* temp = (Node*)malloc(sizeof(Node)); temp->name = name; temp->next = prev->next; return temp; } 위의 코드 블록과 .. [C언어] 연결리스트 - 개념과 기본 동작들(1) 배열은 각각의 항목들이 메모리의 연속된 공간에 연속되게 저장되어 있는 구조를 말합니다. 각 항목들은 메모리상에 자신들의 주소를 가지고 있기 때문에, 그 인덱스 번호만 알고 있다면 어느 데이터에서나 접근이 가능한 random access가 가능합니다. 반면 연결 리스트는 메모리에 연속되게 저장되지 않고, 대신 다음 데이터가 저장된 공간이 두 번째 주소에 저장되어 있고, 두 번째 주소의 값은 세 번째 값의 주소를 가지고 있고, 그렇게 연결을 하다 마지막 데이터는 다음 데이터의 주소를 null 데이터 저장하는 구조입니다. 메모리상에서의 순서가 중요하지 않습니다. 하지만 배열과 달리 random access가 불가능합니다. 연결 리스트는 메모리 상의 순서가 상관이 없습니다. 때문에 연결된 리스트에서 데이터를 삭.. [C언어] 전화번호부 v.4 이번 포스팅에서 다룰 전화번호부는 이름, 전화번호 외에 이메일 주소, 등등의 여러 항목을 추가시켜보겠습니다. 이전의 전화번호부에서는 이름과 전화번호만 저장하는 방식이었기에 단순히 names [] 배열과 numbers [] 배열 이렇게 각각의 두 배열에 데이터를 저장했습니다. 하지만 이름, 전화번호 외에 이메일 주소, 또 그룹 등등 한 사람에 대해 저장해야 하는 데이터가 많아지게 되면, 이전 전화번호부처럼 이름 배열, 번호 배열, 이메일 배열, 그룹 배열 등으로 각각의 배열을 만드는 것보다는 하나의 구조체를 만들어서 한 개인에게 속하는 데이터를 관리하는 것이 효율적입니다. #include #include #include #define CAPATICY 100 #define BUFFER_LENGTH 100 t.. [C언어] 전화번호부 v.3 이번 포스팅에서는 이전 포스팅에서 구현했던 전화번호부를 보완해서, 1. 옳지 않은 명령어를 걸러내고 토크나이징(tokenizing)해서 2. 저장된 사람의 수가 배열의 용량을 초과할 경우 동적 메모리 할당으로 배열의 크기를 키우는 기능을 추가하겠습니다. 명령어 오류를 처리하기 위해선 이전의 전화번호부처럼 buf에 하나의 단어만 저장해서 명령어를 처리하는 것이 아니라, 한 줄 단위로, 즉 엔터(\n) 키를 입력받기 전까지의 문자열을 통째로 처리해야 합니다. 1. 문자열을 줄 단위로 읽어서 토크나이징(tokenizing) int read_line(char str[], int limit)// limit으로 받은 길이 만큼의 문자열을 읽어냄 { int ch, i = 0; // getchar()는 한 개의 문자만.. [C언어] 전화번호부 v.2 char* numbers[CAPACITY];// 전화번호는 그냥 '010-1234-5678'같이 문자열로 다루는 게 편함 int n = 0;// 저장되는 사람의 수 void add(); void find(); void status(); void remove(); void load(); void save(); int main() { char command[BUFFER_SIZE]; while (1) { printf("$ "); scanf_s("%s", command); // 사용자로부터 명령어를 받음 if (strcmp(command, "read") == 0)// 명령어와 두 문자열을 비교. 두 문자열이 동일하면 0를 리턴 load(); else if (strcmp(command, "add") == 0) a.. [C언어] 전화번호부 v.1 #include #include #define CAPACITY 100 #define BUFFER_SIZE 20 char* names[CAPACITY];// 배열의 각 칸에 저장되는 데이터의 타입. 사람 이름의 주소를 저장하는 배열 = char* char* numbers[CAPACITY];// 전화번호는 그냥 '010-1234-5678'같이 문자열로 다루는 게 편함 int n = 0;// 저장되는 사람의 수. void add(); void find(); void status(); void remove(); int main() { char command[BUFFER_SIZE]; while (1)// 사용자가 빠져나가기 전까지 무한반복 { printf("$ "); scanf("%s", command); // .. 이전 1 2 3 다음