[[TableOfContents]] = 계획 = * 구조체 포인터 * 링크드 리스트 = 참여자 = ||강사 || [권영기] || O || ||<|4> 새싹 || [금강현] || X || || [권준혁] || X || || [이지수] || O || || [김정민] || O || ||<|1> 청강생 || [성훈] || O || = 후기 = === 김정민 === * 구조체와 구조체 포인터, 링크드 리스트에 대해 배웠는데요. 아직 포인터도 배운 적이 없어서 어려운 부분이 없잖아 있지만 걱정했던 만큼 따라가기 힘들거 같지는 않습니다. 수업도 설명을 잘해주셔서 이해가 잘 됐고요. 이번 주부터 정식으로 이 새싹교실에 참여하게 됐는데, 잘 부탁드립니다. === 이지수 === * 링크드 리스트라는 자료 구조를 배웠습니다. 이해는 되었는데, 이걸 구현하는 건 많은 시간을 요할 것 같군요 ㅠㅠ 암튼 매 시간마다 새로운 것들을 배워서 재미있습니다. 새싹 교실이 바쁜 생활 가운데에서도 계속 프로그래밍과의 끈을 놓지 앉게 하는 귀중한 원동력이 되고 있네요. 권영기 선배님 항상 감사합니다 :-) === 권영기 === * 이번 주에 못 본 친구들은 아쉽고, 열심히 들어준 다른 친구들 참 고맙습니다. 퀄리티가 떨어짐에도 불구하고 열심히 따라와줘서 기분이 좋네요. 자료 구조를 수업하기로 한 이상 그래프까지 다 나가고 싶습니다만, 이번 학기도 이제 몇 주 남지 않아서 어떻게 해야될지 걱정입니다. 이럴줄 알았으면 더 자주할 것 그랬네요. :) = 숙제 = === 김정민 === * 링크드 리스트를 구현해봤습니다. 영기형이 주신 코드를 배낀거나 다름없는 수준이지만(...) 나름 열심히 구현했습니다. {{{#include #include struct node { int data; node *link; }; node head; node* head_p = &head; int insert(int num, int item) { node* newnode; node* beforenode = head_p; int count=1; if (num < 1 || num > head.data + 1) { printf("잘못된 값입니다. 현재 %d개의 node가 있습니다.\n", head.data); return 0; } while (count < num) { count++; beforenode = beforenode->link; } newnode = (node*)malloc(sizeof(node)); newnode->data = item; newnode->link = beforenode->link; beforenode->link = newnode; head.data++; return 0; } int get(int num) { node* node = head_p->link; int count = 1; if (num < 1 || num > head.data) { printf("잘못된 값입니다. 현재 %d개의 node가 있습니다.\n", head.data); return 0; } while (count < num) { count++; node = node->link; } printf("%d번째 node의 item은 %d\n",num, node->data); return 0; } int delet(int num) { node* beforenode = head_p; node* deletenode; int count = 1; if (num < 1 || num > head.data) { printf("잘못된 값입니다. 현재 %d개의 node가 있습니다.\n",head.data); return 0; } while (count < num) { count++; beforenode = beforenode->link; } deletenode = beforenode->link; beforenode->link = deletenode->link; free(deletenode); head.data--; return 0; } int main() { int i; int num; int temp; int a, b; head.data = 0; //만들어진 node의 갯수를 의미한다. head_p->link = NULL; printf("처음에 만들 Node의 숫자를 입력해주세요.(item값은 그 node의 순번으로 초기화됨)"); scanf("%d", &num); for (i = 1; i <= num; i++) insert(i, i); while (1) { printf("insert : 1, delete : 2, get : 3, end : 4 \t"); scanf("%d", &temp); switch (temp) { case 1: printf("몇번째에 넣으실건가요?"); scanf("%d", &a); printf("넣을 값을 알려주세요. (int형)"); scanf("%d", &b); insert(a, b); break; case 2: printf("몇번째 node를 삭제하실건가요?"); scanf("%d", &a); delet(a); break; case 3: printf("몇번째 node를 보여드릴까요?"); scanf("%d", &a); get(a); break; case 4: printf("종료합니다.\n"); return 0; default : printf("제대로 된 값을 입력해주세요."); } } }}}} === 권준혁 === 링크드 리스트 만들었습니다 지원되는 함수는 입력, 제거(n번째 노트, 제일 마지막 노드 제거 지원), 값으로 탐색, 출력입니다 {{{ main.cpp { #include "Linkedlist.h" void main(){ int trigger, input; int temp; while(1) { printf("신나고 재미있는 링크드 리스트 놀이! 1:입력 2 :제거 3:찾기 4:출력 5:종료\n"); scanf("%d", &trigger); fflush(stdin); switch(trigger) { case 1: printf("저장할 숫자를 입력해주세요"); scanf("%d", &input); createNode(input); break; case 2: if(node_start == NULL){ printf("노드가 하나도 없습니다. 노드를 만들어주세요\n"); break; } printf("몇번째 노드를 제거합니까? 0을 입력받으면 가장 뒤의 노드를 제거합니다"); scanf("%d", &input); deleteNode(input); break; case 3: if(node_start == NULL){ printf("노드가 하나도 없습니다. 노드를 만들어주세요\n"); break; } printf("어떤 수를 가진 노드를 찾습니까? "); scanf("%d", &input); temp = findNode(input); if(temp == 0){ printf("그런건 없습니다\n"); break; } else{ printf("%d번째의 노드가 가지고 있습니다\n", temp); } break; case 4: printNode(); break; case 5: return; break; default: printf("다시 입력해주세요\n"); } } } }}}} Linkedlist.h {{{{ #include #include typedef struct node{ int content; node* nextnode; } node; node* node_start = NULL; void createNode(int content){ node* node_p; node_p = (node*)malloc(sizeof(node)); node_p->content = content;//새 노드를 만들었다 node_p->nextnode = NULL;//새 노드를 만들엇다 if(node_start == NULL)//아무 노드도 없을때 { node_start = node_p;//그건 시작노드로 printf("시작 노드를 만들었습니다\n"); } else { node* temp_node;//임시 노드 포인터 temp_node = node_start->nextnode; if(temp_node ==NULL){//노드 스타트 다음에 없을때를 대비 node_start->nextnode = node_p; printf("만들었습니다\n"); return; } while(temp_node->nextnode != NULL) temp_node = temp_node->nextnode;//temp_node 다음 노드가 없을때까지 반복 temp_node->nextnode = node_p;//temp_node가 가르키는 노드의 다음 노드로 node_p를 지목 printf("만들었습니다\n"); } } void deleteNode(int num)//num째 노드를 지운다. 0이면 제일 뒤에 있는 걸 지운다 //문제있다 { if(node_start == NULL) { printf("먼저 노드를 생성해주세요!\n"); return; } node* temp_node = node_start; node* before_node; if (num==1) { node_start = temp_node->nextnode; free(temp_node); printf("1번째 노트 할당 해제했습니다\n"); return; } for(int i=2;;i++) { if(num == 0 && temp_node->nextnode == NULL){//temp그게 마지막꺼임 before_node->nextnode = NULL; free(temp_node); printf("마지막 노드를 할당해제했습니다\n"); return; } before_node = temp_node; //i-1번째 temp_node = temp_node->nextnode; //i번째 if(temp_node == NULL)//이제 끝이다 { printf("입력하신 숫자만큼의 노드가 아직 존재하지 않습니다\n"); return; } if(num == i)//도착 { if(temp_node == NULL) before_node->nextnode = NULL;//도착했는데 마지막 지점일때 else before_node->nextnode = temp_node->nextnode; free(temp_node); printf("%d번째 노드 할당해제했습니다\n", i); return; } } } int findNode(int content) //0은 못찾은거 -1 { if(node_start == NULL) { printf("노드를 생성해주세요!\n"); return 0; } node* temp_node = node_start; int i= 1; while(temp_node != NULL) { if(temp_node->content == content) return i; temp_node = temp_node->nextnode; i++; } return 0;//그곳에서도 낙원은 없었어 } void printNode() { node* temp_node = node_start; while(temp_node != NULL){ printf("%d ", temp_node->content); temp_node = temp_node->nextnode; } printf("\n"); } }}}} ---- [새싹교실/2014], [새싹교실/2014/다빈치인재반]