C++面试题(5)

Write C/C++ program which will repeatedly prompt for and read command from the terminal and perform desired action.
The commands to be supported are:

Add an item into the queue at a given priority, e.g.
Priority: 1
Item:item 1
Print the current contents of the queue.
1: item 1, next item, …

9: my item, …
Reverse – toggle the priority order of the queue, e.g.
9: my item, …

1: item 1, next item, …
Remove the highest priority item form the queue and print it, e.g.
Removed: my item

Specifications of the priority queue:
·Items added into queue may have priority in range 0 to 9
·Initially, 0 is the highest priority.
·Within one priority level, items should be maintained as FIFO.
Hints:
· It is not imperative that you complete application.
· Parts of application you did not finished comment:
1.Why did you not implement?
2.How would you implement?

===========================================
#include <stdio.h>  
#include 
<stdlib.h>
 
#include 
<string.h>
 

#define FALSE   0 

#define TRUE    1 

typedef 
int      BOOL; 

struct item 

        
char    *
info; 
        
struct item     *
next; 
}


struct item     *queue[10
]; 

BOOL swcmd(
int
); 
void add_item(int priority, char *
buf); 
void print_item(void
); 
void rm_item(void
); 
struct item     *get_last_item(int priority);           // get the last item with the priority. 

void free_item(struct item * tmp); 
void flush_in(void);                    // to flush input buffer. 


int main(void
        
int     ch, loop =
 TRUE; 
        
while (loop) 

                printf(
"type a command to run the program(h for help): "
); 
                ch 
=
 getchar(); 
                flush_in(); 
                loop 
=
 swcmd(ch); 
        }
 
        exit(
0
); 
}
 

/* 
* to process the different command. 

*/
 
BOOL swcmd(
int ch) 

        BOOL    ret 
=
 TRUE; 
        
int
     priority; 
        
char    buf[256
]; 
        
switch (ch) 

                
case 'a'
 : 
                        printf(
"add an item./n"
); 
                        printf(
"priority: "
); 

                        scanf(
"%d"&
priority); 
                        flush_in(); 
                        
if ((priority < 0|| (priority > 9)) 

                                printf(
"priority must be in 0 to 9./n"
); 
                                
break

                        }
 

                        printf(
"item: "
); 
                        scanf(
"%s"
, buf); 
                        flush_in(); 
                        add_item(priority, buf);        
// maybe unsucessful. 

                        break
                
case 'p'
 : 
                        printf(
"print the items./n"
); 
                        print_item(); 
                        
break

                
case 'o'
 : 
                        rm_item(); 
                        
break

                
case 'h'
 : 
                        printf(
"a -- add an item to the queue./n"
); 
                        printf(
"p -- print the queue./n"
); 
                        printf(
"o -- take out the highest priority item./n"
); 
                        printf(
"h -- show this help information./n"
); 
                        printf(
"q -- quit this program./n"
); 
                        
break

                
case 'q'
 : 
                        ret 
=
 FALSE; 
                        
break

                
default
 : 
                        printf(
"an unrecgnized command!/n"
); 
        }
 
        
return
 ret; 
}
 

/* 
* add an item to the date structure. 

*/
 
void add_item(int priority, char *buf) 

        
struct item     *tmp, *
last; 

        tmp 
= (struct item *)malloc(sizeof(struct
 item)); 
        
if (tmp == NULL) 

                perror(
"add_item::malloc"
); 
                exit(
1
); 
        }
 

        tmp
->info =
 strdup(buf); 
        
if (tmp->info == NULL) 

                perror(
"add_item::strdup"
); 
                exit(
1
); 
        }
 

        tmp
->next =
 NULL; 
        last 
=
 get_last_item(priority); 
        
if (last == NULL) 

                queue[priority] 
=
 tmp; 
                
return

        }
 

        last
->next =
 tmp; 
        
return

}
 

/* 
* to show the items on the screen. 

*/
 
void print_item(void

        
int
     i; 
        
struct item     *
tmp; 
        
for (i = 0; i < 10; i++

                printf(
"%d: "
, i); 
                tmp 
=
 queue[i]; 
                
while (tmp != NULL) 

                        printf(
"%s, ", tmp->
info); 
                        tmp 
= tmp->
next; 
                }
 
                printf(
"-/n"
); 
        }
 
        
return
 ; 
}
 

/* 
* get the last item position with the same priority. 

*/
 
struct item *get_last_item(int priority) 

        
struct item     *
tmp; 
        tmp 
=
 queue[priority]; 
        
if (tmp == NULL) 

                
return
 tmp; 
        }
 
        
while (tmp->next != NULL) 

                tmp 
= tmp->
next; 
        }
 
        
return
 tmp; 
}
 

/* 
* output the highest priority item,and remove it from the queue. 

*/
 
void rm_item(void

        
int
     i; 
        
struct item     *
tmp; 
        
for (i = 9; i >= 0; i--

                
if (queue[i] == NULL) 

                        
continue

                }
 
                tmp 
=
 queue[i]; 
                queue[i] 
= tmp->
next; 
                
break

        }
 

        
if (i < 0
{            // a trap to remove nothing. 
                return
        }
 

        printf(
"the highest priority item: [%d] %s/n", i, tmp->
info); 
        free_item(tmp); 
        print_item(); 
        
return

}
 

/* 
* to free the struct item. 

*/
 
void free_item(struct item *tmp) 

        free(tmp
->
info); 
        free(tmp); 
}
 

/* 
* to flush the input buffer. 

*/
 
void flush_in(void

        
int
     ch; 
        ch 
=
 getchar(); 
        
while (ch != '/n'

                ch 
=
 getchar(); 
        }
 
        
return
 ; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值