某个打印机根据打印队列执行打印任务。打印任务分为九个优先级,分别采用数字1~9表示,数字越大优先级越高。打印机每次从队列头部取出第一个任务A,然后检查队列余下任务中有没有比A优先级更高的任务,如果有比A优先级高的任务,则将任务A放到队列尾部,否则执行任务A的打印。请编写一个程序,根据输入的打印队列,输出实际打印顺序。
实现了一个,虽然这个实现效率很低,但是是按题目要求来的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*struct pr_node{
int pri;
struct prnode *next;
};*/
#define DBG ;//printf("[%s][%d]\n",__func__,__LINE__)
#define DEBUG(format, ...) ;//printf(format, ##__VA_ARGS__)
typedef struct pr_node{
int pri;
struct pr_node *next;
} pnode;
typedef pnode* linkList;
static int printList(linkList* L) {
linkList p;
int i = 0;
p = (*L)->next;
//printf("print link list\n");
if (p==NULL) {
//printf("empty link list\n");
return 0;
}
DBG;
do {
i++;
//printf("i = %d pri=%d\n",i,p->pri);
p = p->next;
//DEBUG("0x%x\n",p->next);
}
while (p != NULL);
//printf("print link list\n");
return 1;
}
int main(int argc, char** argv)
{
int i = 0;
int pri = 0;
printf("please printf the sequece of priority, e.g. ./print_order 2 5 8 7 9 0 1 \n");
linkList L;
L = (pnode *)malloc(sizeof(pnode));
if (L == NULL)
printf("malloc failed\n");
L->next = NULL;
DBG;
for(i = argc-1; i > 0; i--)
{
DBG;
pnode *p;
p = (pnode *)malloc(sizeof(pnode));
memset(p, 0, sizeof(pnode));
DBG;
//printf("%s\n",argv[i]);
p->pri = atoi(argv[i]);
DBG;
p->next = L->next;
L->next = p;
}
printList(&L);
//printf("12\n");
i = argc-1;
while(i > 0)
{
pnode *p1 = L->next;
pnode *pt = p1->next;
//pnode *pe1 = NULL;
while(pt != NULL)
{
p1 = L->next;
//printf("%d %d\n",p1->pri, pt->pri);
if(p1->pri < pt->pri)
{
while(pt->next != NULL)
{
pt = pt->next;
}
pt->next = p1;
L->next = p1->next;
p1->next = NULL;
pt = L->next->next;
printList(&L);
continue;
}
else
pt = pt->next;
}
if(pt == NULL)
{
printf("pri = %d\n", p1->pri);
L->next = p1->next;
free(p1);
p1 = L->next;
i--;
}
DBG;
printList(&L);
}
return 0;
}