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 ;
}
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?
===========================================























































































































































































































































