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

被折叠的 条评论
为什么被折叠?



