게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
[본삭금] C언어 초보가 감히 ㅠㅠ 질문글을 아뢰어도 될까요?
게시물ID : programmer_12553짧은주소 복사하기
작성자 : 원주뿅가
추천 : 1
조회수 : 704회
댓글수 : 11개
등록시간 : 2015/08/04 23:06:42
옵션
  • 본인삭제금지
 
C언어 걸음마를 하고 있는 초보자입니다...
저의 상식선과 저의 생각은 맞는데 ㅠㅠ 컴파일러는 아니라고 빠꾸시킵니다 ㅠㅠ
제가 인터넷도 많이 뒤지고 생각도 정말 골똘히 했는데도 진전이 전혀 없어 이렇게 질문하게 되었습니다..ㅠㅠ
 
제가 하려고 하는 것은 0.1초에 한번씩 에일리언 노드를 5개씩 생성하고
0.3 초에 한번씩 에일리언 노드 1개씩 삭제하려고 하였으나
 
빨갛게 표시한 부분이 문제인듯 합니다만
도대체 무엇이 문제인건지 알수가 없습니다 ㅠㅠ
 
// sungtae001.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "stdlib.h"
#include "time.h"
#include "conio.h"
typedef struct _node
{
 int key;
 struct _node *next;
}node;
node *head;
node *tail;
node *del_p;
node *print_p;
int alien = 0;
void head_add()
{
 node *t;
 t = (node*)malloc(sizeof(node));
 t->key = 1;
 head = t;
 tail = t;
}
void insert_nodes(int k)
{
 node *v;
 v = new node;
 tail->next = v;
 v->key = k;
 tail = v;
}
void del(int k)
{
 int a = k - 1;
 del_p = head->next;
 while (1)
 {
  if (del_p->key == k)
  {
   node *b;
   b = del_p->next;
   del_p->next = del_p->next->next;
   free(b);
   printf("에일리언 %d 가 죽었습니다. \n", k + 1);
   break;
  }
  del_p = del_p->next;
 }
}
void print()
{
 int temp = 0;
 print_p = head->next;
 temp = print_p->key;
 printf("추가 된 노드의 값은 %d 입니다. \n", temp);
 while (1)
 {
  if (print_p->next == NULL)
  {
   break;
  }
  print_p = print_p->next;
  temp = print_p->key;
  printf("추가 된 노드의 값은 %d 입니다. \n", temp);
 }
}

int main(void)
{
 srand((unsigned)time(0));
 int count = 0;
 int time = 0;
 head_add(); // 해드 선언
 while (1)
 {

  Sleep(50);
  time++;
  if (time % 2 == 0)
   {
    for (int i = 0; i < 5; i++)
    {
     alien++;
     insert_nodes(alien);
    }
    print();
   }
  if (time % 6 == 0)
   {
   
   // del(rand() % alien);

   }

 }
 printf("끝");
 return 0;
}
 
개판인 코드 봐주셔서 정말 죄송스럽습니다
출처 .
꼬릿말 보기
전체 추천리스트 보기
2015-08-04 23:09:17추천 0
빨간 부분이 없다는 건

문제가 없다는 뜻인가요?
댓글 0개 ▲
2015-08-04 23:09:55추천 0
빨갛게했는데 적용이 안됬네요 ㅠㅠ;
if (del_p->key == k)
if (print_p->next == NULL)
댓글 0개 ▲
[본인삭제]초엘
2015-08-04 23:17:41추천 0
댓글 0개 ▲
2015-08-04 23:25:48추천 0
오류메세지를 적어주시면 좀 많은 의견 나오지 않을까요?
댓글 0개 ▲
2015-08-04 23:32:10추천 0
문제가 여러가지인데, 차근차근 알려드리기 위해 앞선 댓글을 지웠습니다.

일단, 컴파일 에러가 아니라 런타임 에러가 날겁니다. 왜냐면 struct _node의 초기화가 없기 때문이지요.
해결 방법은 두 가지 방법이 있겠는데, 일단 c 스타일은 생성자가 없으므로,
void insert_nodes(int k)
{
 node *v;
 v = new node;
v.key = 0; // 이것과
v.next = NULL; /// 이거 추가.
 tail->next = v;
 v->key = k;
 tail = v;
}
이렇게 해주는 것이고,
c++ 스타일은,
(파일 이름도 cpp고 new 키워드 있는 것으로 보아 진정 원하시는건 c++ 스타일이신거 같아서,)
typedef struct _node
{
 _node() : key(0), next(NULL) {}
 int key;
 struct _node *next;
}node;

이렇게 해주시면 됩니다.
댓글 3개 ▲
2015-08-04 23:37:08추천 0
key 와 next의 초기값을 설정해주지 않았기 때문에 에러가 났던건가요?

답변 너무 감사합니다 ㅠㅠ

큰건아닌데 제가 좋아하는 메로나라도 하나 대접해드리고 싶은데 메일 주소주실수있을까요? ㅠㅠ
2015-08-04 23:48:58추천 0
괜찮습니다 ㅎㅎ
저도 이런 걸로 머리 싸맬 때에 도와준 사람들이 있어, 지나가다 조언 해드린 것 뿐입니다.
2015-08-04 23:51:33추천 0
ㅠㅠ 다시 한번 감사합니다 (꾸벅)
2015-08-04 23:36:41추천 0
다른 문제는, void del(int k)에 base condition이 없다는 겁니다.
즉,
 while (1)
 {
  if (del_p->key == k)
  {
   node *b;
   b = del_p->next;
   del_p->next = del_p->next->next;
   free(b);
   printf("에일리언 %d 가 죽었습니다. \n", k + 1);
   break;
  }
  del_p = del_p->next;
 }
여기서의 base condition은 if (del_p == NULL) 인 경우인데, 이 조건에 만족하는 경우는 입력으로 들어온 k가 head 리스트에 없는 경우 입니다.
이 문제는 여기서는 부각되지 않을 것입니다. 왜냐면 base conditino에 도달하지 않는 입력을 넣지 않기 때문입니다.
다만, 앞으로 코딩을 계속 하실 때에 base condition을 잊으시면 밤 좀 새셔야 할겁니다.
댓글 3개 ▲
2015-08-04 23:45:23추천 0
감사합니다
정성스런 답변 너무나도 감사합니다만 제가 멍청한가봐요 ..잘 이해가 안가네요... ㅠㅠ
2015-08-04 23:53:00추천 0
base condition은 어려운게 아니라, 끝에 도달 했을 때를 말하는 겁니다.
del(int k)에서, k = -1 같은 엉뚱한 값이 들어오면, head로 시작하는 리스트의 끝까지 뒤집어봐도 만족하는 값을 찾을 수 없을 겁니다.
(물론 님이 올린 코드에서는 이런 경우가 있을 수 없습니다.)
이런 때를 대비해서
if (del_p == null)
{
printf("Not exist key(%d)", k);
break;
}
같은 코드를 넣어두면, 에러가 발생하지 않겠지요.

이 댓글은 그냥 오지랖 같은 댓글입니다. 이 예제에서 크게 중요하지 않아요.
2015-08-04 23:55:23추천 0
이제야 이해가 되네요 정말 너무 도움되었습니다
복받으실거에요 감사합니다 !
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호