프로그램은 잘 도는데 경고가 너무 많이 떠서요;;
글쓴이: yangam / 작성시간: 화, 2005/04/05 - 2:27오후
FUNDAMENTALS OF DATA STRUCTURES IN C 133페이지 2번 문제를 나름대로 풀어봤습니다.
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#define EACH_TIME 100 // 단위 시간만큼 돌아감
#define USED 1 // 활주로가 단위 시간에 이미 사용되었을 경우
#define NOTUSED 0 // 활주로가 단위 시간에 아직 사용되지 않았을 경우
#define SPECIAL 2 // Runway 2 에 Landing 했을 경우
#define LANDING 1 // 함수에서 Landing 인지 Takeoff 인지 구분하기 위해서 사용
#define TAKEOFF 0
// Queue Structure
typedef struct {
int planeid; // plane's ID
int landing_wt; // landing waiting time
int left_ft; // left fly time
int takeoff_wt; // takeoff waiting time
struct queue *link;
} queue;
// f - head of queue, r - tail of queue
void initq(queue **f, queue **r);
// f - head of queue, r - tail of queue, flag - Distinguish Landing or Takeoff, planenum - number of plane will create
void createq(queue **f, queue **r, int flag);
// f - head of queue
void deleteq(queue **f);
// df - Destination head of queue, dr - Destination tail of queue, sf - Source head of queue, flag - Distinguish Landing or Takeoff
void addq(queue **df, queue **dr, queue **sf, int flag);
int main()
{
int usedrunway0, usedrunway1, usedrunway2; // 활주로의 사용 여부를 확인하는 변수
int crashed; // 사고가 난 비행기의 수
int decide_runway; // 활주로를 결정하는 변수
int decide_planenum; // 단위 시간에 처리될 이륙 및 착륙 비행기의 수를 결정하는 변수
int total_takeoff_time;
int total_landing_time;
int total_takeoff_plane_count;
int total_landing_plane_count;
int each_time; // EACH_TIME 단위 시간 만큼 loop 이 실행됨
int i; // for loop statement 을 위한 임시 변수
queue *t; // for loop statement 을 위한 임시 큐
queue *lqf0, *lqf1, *lqf2, *lqf3; // 4개의 Landing Queue 의 Front
queue *lqr0, *lqr1, *lqr2, *lqr3; // 4개의 Landing Queue 의 Rear
queue *tqf0, *tqf1, *tqf2; // 3개의 Takeoff Queue 의 Front
queue *tqr0, *tqr1, *tqr2; // 3개의 Takeoff Queue 의 Rear
queue *wlqf, *wlqr; // Landing 될 비행기가 들어있는 Queue
queue *wtqf, *wtqr; // Takeoff 될 비행기가 들어있는 Queue
// 각각의 Landing Queue 를 초기화
initq(&lqf0, &lqr0);
initq(&lqf1, &lqr1);
initq(&lqf2, &lqr2);
initq(&lqf3, &lqr3);
// 각각의 Takeoff Queue 를 초기화
initq(&tqf0, &tqr0);
initq(&tqf1, &tqr1);
initq(&tqf2, &tqr2);
// Landing 될 비행기가 들어있는 Queue 와 Takeoff 될 비행기가 들어있는 Queue 초기화
initq(&wlqf, &wlqr);
initq(&wtqf, &wtqr);
// 설정된 단위 시간 만큼 loop 이 실행됨
each_time = EACH_TIME;
crashed = 0;
srand((unsigned)time(NULL));
while (each_time-- >= 0) {
usedrunway0 = usedrunway1 = usedrunway2 = 0;
puts("\n========================================");
printf("프로그램 종료까지 %d 단위 시간 남음\n", each_time);
puts("========================================");
// 한 번에 최소한 0 - 3 대는 착륙하게끔 해준다.
decide_planenum = rand() % 4;
for (i = 0; i < decide_planenum; i++)
createq(&wlqf, &wlqr, LANDING);
// 한 번에 0 - 3 대는 이륙하게끔 해준다.
decide_planenum = rand() % 4;
for (i = 0; i < decide_planenum; i++)
createq(&wtqf, &wtqr, TAKEOFF);
// Landing 될 비행기와 Takeoff 될 비행기들의 정보를 출력
puts("\n==========================");
puts("Landing 될 비행기들의 정보");
puts("==========================");
for (t = wlqf; t; t = t->link)
printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
puts("\n==========================");
puts("Takeoff 될 비행기들의 정보");
puts("==========================");
for (t = wtqf; t; t = t->link)
printf("Plane ID: %-3d Takeoff waiting time: %-3d\n", t->planeid, t->takeoff_wt);
/* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
/* Takeoff 보다 Landing 이 더 중요하므로 Takeoff 부터 처리한다. (Takeoff 는 시간만 지연될 뿐, Landing 처럼 인명 피해가 일어나지는 않는다.) <- 왜냐하면, 단위 시간에 각 활주로는 Landing 또는 Takeoff 할 수 있다. */
/* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
// 만약 Landing 될 비행기의 체공 시간이 0 이라면 Runway 2(tqf2) 에 비상 착륙 시킨다.
if (wlqf && wlqf->left_ft == 0) {
// Runway 2 에 비상 착륙 시킴
addq(&tqf2, &tqr2, &wlqf, SPECIAL);
// Landing 될 비행기 Queue 에서 삭제
deleteq(&wlqf);
// 이로써, Runway 2 는 현재 단위 시간에 사용되었다.
usedrunway2 = 1;
}
// 한 번에 0 - 3 대씩 착륙하게끔 해준다.
decide_planenum = rand() % 4;
for (i = 0; i < decide_planenum; i++) {
decide_runway = i;
if (decide_runway == 0)
decide_runway = rand() % 2;
if (decide_runway == 2)
decide_runway = rand() % 2 + 2;
switch (decide_runway) {
case 0:
if (wlqf && usedrunway0 == 0) {
addq(&lqf0, &lqr0, &wlqf, LANDING);
deleteq(&wlqf);
usedrunway0 = 1;
}
break;
case 1:
if (wlqf && usedrunway0 == 0) {
addq(&lqf1, &lqr1, &wlqf, LANDING);
deleteq(&wlqf);
usedrunway0 = 1;
}
break;
case 2:
if (wlqf && usedrunway1 == 0) {
addq(&lqf2, &lqr2, &wlqf, LANDING);
deleteq(&wlqf);
usedrunway1 = 1;
}
break;
case 3:
if (wlqf && usedrunway1 == 0) {
addq(&lqf3, &lqr3, &wlqf, LANDING);
deleteq(&wlqf);
usedrunway1 = 1;
}
break;
}
}
// 한 번에 0 - 3 대씩 이륙하게끔 해준다.
decide_planenum = rand() % 4;
for (i = 0; i < decide_planenum; i++) {
decide_runway = i ;
switch (decide_runway) {
case 0:
if (wtqf && usedrunway0 == 0) {
addq(&tqf0, &tqr0, &wtqf, TAKEOFF);
deleteq(&wtqf);
usedrunway0 = 1;
}
break;
case 1:
if (wtqf && usedrunway1 == 0) {
addq(&tqf1, &tqr1, &wtqf, TAKEOFF);
deleteq(&wtqf);
usedrunway1 = 1;
}
break;
case 2:
if (wtqf && usedrunway2 == 0) {
addq(&tqf2, &tqr2, &wtqf, TAKEOFF);
deleteq(&wtqf);
usedrunway2 = 1;
}
break;
}
}
// Landing 될 Queue 에 있는 비행기의 Left fly time 을 1 만큼 줄이고, Landing waiting time 을 1 만큼 증가시킨다.
for (t = wlqf; t; t = t->link) {
t->landing_wt++;
t->left_ft--;
}
// Takeoff 될 Queue 에 있는 비행기의 Takeoff waiting time 을 1 만큼 증가시킨다.
for (t = wtqf; t; t = t->link)
t->takeoff_wt++;
// 만약 체공 시간이 0 미만이라면 사고가 난 것임
if (wlqf && wlqf->left_ft < 0) {
puts("\n========================================================================");
printf("ID 가 %d 인 비행기가 체공 시간이 다 되어서 추락하였습니다ㅠOㅠ;\n", wlqf->planeid);
puts("========================================================================");
deleteq(&wlqf);
crashed++;
}
// Runway 0 의 Takeoff Queue 를 출력한다.
puts("\n================================");
puts("Runway 0 의 Takeoff Queue 내용");
puts("================================");
for (t = tqf0; t; t = t->link)
printf("Plane ID: %-3d Takeoff waiting time: %-3d\n", t->planeid, t->takeoff_wt);
// Runway 1 의 Takeoff Queue 를 출력한다.
puts("\n================================");
puts("Runway 1 의 Takeoff Queue 내용");
puts("================================");
for (t = tqf1; t; t = t->link)
printf("Plane ID: %-3d Takeoff waiting time: %-3d\n", t->planeid, t->takeoff_wt);
// Runway 2 의 Takeoff Queue 를 출력한다.
puts("\n================================");
puts("Runway 2 의 Takeoff Queue 내용");
puts("================================");
for (t = tqf2; t; t = t->link) {
if ((t->planeid % 2) == 0)
printf("Plane ID: %-3d Takeoff waiting time: %-3d\n", t->planeid, t->takeoff_wt);
else
printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
}
// Runway 0 의 Landing Queue A 를 출력한다.
puts("\n==================================");
puts("Runway 0 의 Landing Queue A의 내용");
puts("==================================");
for (t = lqf0; t; t = t->link)
printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
// Runway 0 의 Landing Queue B 를 출력한다.
puts("\n==================================");
puts("Runway 0 의 Landing Queue B의 내용");
puts("==================================");
for (t = lqf1; t; t = t->link)
printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
// Runway 1 의 Landing Queue A 를 출력한다.
puts("\n==================================");
puts("Runway 1 의 Landing Queue A의 내용");
puts("==================================");
for (t = lqf2; t; t = t->link)
printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
// Runway 1 의 Landing Queue B 를 출력한다.
puts("\n==================================");
puts("Runway 1 의 Landing Queue B의 내용");
puts("==================================");
for (t = lqf3; t; t = t->link)
printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
}
total_landing_time = 0;
total_landing_plane_count = 0;
for (t = lqf0; t; t = t->link) {
total_landing_time += t->landing_wt;
total_landing_plane_count++;
}
for (t = lqf1; t; t = t->link) {
total_landing_time += t->landing_wt;
total_landing_plane_count++;
}
for (t = lqf2; t; t = t->link) {
total_landing_time += t->landing_wt;
total_landing_plane_count++;
}
for (t = lqf3; t; t = t->link) {
total_landing_time += t->landing_wt;
total_landing_plane_count++;
}
total_takeoff_time = 0;
total_takeoff_plane_count = 0;
for (t = tqf0; t; t = t->link) {
total_takeoff_time += t->takeoff_wt;
total_takeoff_plane_count++;
}
for (t = tqf1; t; t = t->link) {
total_takeoff_time += t->takeoff_wt;
total_takeoff_plane_count++;
}
for (t = tqf2; t; t = t->link) {
if ((t->planeid % 2) == 0) {
total_takeoff_time += t->takeoff_wt;
total_takeoff_plane_count++;
}
else {
total_landing_time += t->landing_wt;
total_landing_plane_count++;
}
}
puts("\n===================================================");
printf("총 %d 대의 비행기가 착륙하였습니다.\n", total_landing_plane_count);
printf("총 %d 대의 비행기가 이륙하였습니다.\n", total_takeoff_plane_count);
printf("총 %d 대의 비행기가 추락하였습니다.\n\n", crashed);
printf("평균 %.2f 단위 시간만에 착륙하였습니다.\n", (float)total_landing_time / total_landing_plane_count);
printf("평균 %.2f 단위 시간만에 이륙하였습니다.\n", (float)total_takeoff_time / total_takeoff_plane_count);
puts("===================================================");
return 0;
}
void initq(queue **f, queue **r)
{
*f = NULL;
*r = NULL;
}
void createq(queue **f, queue **r, int flag)
{
static int landing_id = 1; // Landing 은 Odd number
static int takeoff_id = 2; // Takeoff 는 Even number
queue *temp;
// 메모리 할당을 실패할 경우에 Error Message 를 출력한 후 프로그램 종료
if ((temp = (queue *)malloc(sizeof(queue))) == NULL) {
fprintf(stderr, "Out ot memory! Can't create Queue!\n");
exit(0);
}
// Landing 할 비행기라면 아래의 if 문 실행
if (flag == LANDING) {
temp->planeid = landing_id; // 비행기 ID 저장
temp->left_ft = rand() % EACH_TIME; // 체공 가능 시간
temp->landing_wt = 0; // Landing waiting time 은 우선 0 으로 설정
landing_id++;
landing_id++;
}
// Takeoff 할 비행기라면 아래의 else-if 문 실행
else if (flag == TAKEOFF) {
temp->planeid = takeoff_id; // 비행기 ID 저장
temp->takeoff_wt = 0; // Takeoff waiting time 은 우선 0 으로 설정
takeoff_id++;
takeoff_id++;
}
temp->link = NULL;
if (*f)
(*r)->link = temp;
else
*f = temp;
*r = temp;
}
void deleteq(queue **f)
{
queue *temp = *f;
if (*f == NULL) {
fprintf(stderr, "The queue is empty! Can't delete queue\n");
exit(0);
}
*f = temp->link;
free(temp);
}
void addq(queue **df, queue **dr, queue **sf, int flag)
{
queue *temp;
// 메모리 할당을 실패할 경우에 Error Message 를 출력한 후 프로그램 종료
if ((temp = (queue *)malloc(sizeof(queue))) == NULL) {
fprintf(stderr, "Out ot memory! Can't create Queue!\n");
exit(0);
}
if (flag == LANDING) {
temp->left_ft = (*sf)->left_ft;
temp->landing_wt = (*sf)->landing_wt;
}
else if (flag == TAKEOFF)
temp->takeoff_wt = (*sf)->takeoff_wt;
else if (flag == SPECIAL) {
temp->left_ft = (*sf)->left_ft;
temp->landing_wt = (*sf)->landing_wt;
}
temp->planeid = (*sf)->planeid;
temp->link = NULL;
if (*df)
(*dr)->link = temp;
else
*df = temp;
*dr = temp;
}
Compile 해보면 아시겠지만, 경고가 20개이상이 뜨는데.
제가 보기에는 전혀 문제 없는 부분인데.. 경고가 뜨네요.
주로, for(t = lqf0; t; t = t->link) 이런 부분에서 나더군요.
구조체 포인터 t 와 lqf0 모두 같은 queue * 형 인데
왜 타입이 다르다는건지 이해가 가지 않아서요;
올바른 답변 부탁드립니다^-^;;;
Forums:


[code:1]// Queue Structuretypedef stru
// Queue Structure typedef struct { int planeid; // plane's ID int landing_wt; // landing waiting time int left_ft; // left fly time int takeoff_wt; // takeoff waiting time struct queue *link; } queue;이 부분은 C 언어도 아니고 C++ 언어도 아니네요. 어느 언어로 짜셨나요? :(
[code:1]typedef struct _queue{
typedef struct _queue{ int planeid; // plane's ID int landing_wt; // landing waiting time int left_ft; // left fly time int takeoff_wt; // takeoff waiting time struct _queue *link; } queue;위와 같이 고치세요.
queue = struct _queue와 같습니다.
struct queue != queue
경고가 발생하는것 같네요.
참고로 typedef인 경우 queue_t와 같에 정의하는것도 괜찮습니다.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
음.. C언어 맞구요~ ㅎ_ㅎ;; (혹시 농담하신건가요? ;;;)
음.. C언어 맞구요~ ㅎ_ㅎ;; (혹시 농담하신건가요? ;;;)
typedef struct {
....
struct queue *link;
} queue;
라고 해주면 문제가 있는거군요.
그러고보니..
struct 구조체-TAG { ... } 선언자-리스트;
이런식으로 정의하는게 완전한 정의인걸로 아는데
맨 위의 정의에서는 구조체-TAG 가 없어서 문제가 되는것 같네요;
답변 주셔서 정말 감사합니다^0^
작은 것들, 사소한 것들을 소중히 여기고,
항상 최선을 다하는 멋진 사람이 되고 싶다.
그들이 나에게 일깨워준 것처럼,
그들 자신이 얼마나 소중한 존재인지 알 수 있도록
도와주는 그런 좋은 사람이 되고 싶다
댓글 달기