Grisson's .net

源码之前,了无秘密

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
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 ; 
}
posted on 2005-08-21 20:34  海盗  阅读(1384)  评论(0编辑  收藏  举报