主题:队列纠错
题目:输入n(由用户输入)个10以内的数,每输入i(0《i《9),就把它插入第i号队列中,最后把10个队列中非空队列,按队列号由小到大的顺序串接成一条链,并输出该链的所有元素
我写了下面的程序,基本思想是用一个数组a【10】存储10个队列的头结点,并默认为从0至9的顺序,然后根据输入的值依次插入到相应的队列中,例如,i=8,就插入到a【8】中,不过程序执行结果错误,请各位帮忙纠正一下,有更好的算法也请告诉兄弟,先谢谢了
#include<stdio.h>
#include<malloc.h>
typedef struct qnode
{
int data;
struct qnode *next;
}Qnode;
typedef struct
{
Qnode *front;
Qnode *rear;
}LiQueue;
void InitQueue(LiQueue *&q)
{
q=(LiQueue *)malloc(sizeof(LiQueue));
q->front=q->rear=NULL;
}
void ClearQueue(LiQueue *&q)
{
Qnode *p=q->front ,*r;
if(p!=NULL)
{
r=p->next;
while(r!=NULL)
{
free(p);
p=r;r=p->next;
}
}
free(q);
}
void enQueue(LiQueue *&q,int e)
{
Qnode *s;
s=(Qnode *)malloc(sizeof(Qnode));
s->data=e;
s->next=NULL;
if(q->rear==NULL)
q->front=q->rear=s;
else
{
q->rear->next=s;
q->rear=s;
}
}
void CnQueue(LiQueue *&S,LiQueue *q)
{
if(S->rear==NULL)
{
S->front=q->front;
S->rear=q->rear;
}
else
{
S->rear->next=q->front;
S->rear=q->rear;
}
}
int DispQueue(LiQueue *S)
{
Qnode *t;
if(S->rear==NULL)
{
printf("链表为空");
return 0;
}
t=S->front;
while(t->next!=NULL)
{
printf("%d",t->data);
t=t->next;
}
printf("%d",t->data);
return 1;
}
void main()
{
int i=0,n=0,e=0,j=0;
LiQueue *a[10];
LiQueue *S;
printf("输入n个10以内的数:\n");
printf("请输入n的值:\n");
scanf("%d",&n);
for(i;i<10;i++)
{
InitQueue(a[i]);
}
printf("请依次输入n个整数:");
scanf("%d",&i);
while(i<=9&&j<n-1)
{
enQueue(a[i],i);
scanf("%d",&i);
j++;
}
InitQueue(S);
for(i=0;i<10;i++)
{
CnQueue(S,a[i]);
ClearQueue(a[i]);
}
DispQueue(S);
}
我写了下面的程序,基本思想是用一个数组a【10】存储10个队列的头结点,并默认为从0至9的顺序,然后根据输入的值依次插入到相应的队列中,例如,i=8,就插入到a【8】中,不过程序执行结果错误,请各位帮忙纠正一下,有更好的算法也请告诉兄弟,先谢谢了
#include<stdio.h>
#include<malloc.h>
typedef struct qnode
{
int data;
struct qnode *next;
}Qnode;
typedef struct
{
Qnode *front;
Qnode *rear;
}LiQueue;
void InitQueue(LiQueue *&q)
{
q=(LiQueue *)malloc(sizeof(LiQueue));
q->front=q->rear=NULL;
}
void ClearQueue(LiQueue *&q)
{
Qnode *p=q->front ,*r;
if(p!=NULL)
{
r=p->next;
while(r!=NULL)
{
free(p);
p=r;r=p->next;
}
}
free(q);
}
void enQueue(LiQueue *&q,int e)
{
Qnode *s;
s=(Qnode *)malloc(sizeof(Qnode));
s->data=e;
s->next=NULL;
if(q->rear==NULL)
q->front=q->rear=s;
else
{
q->rear->next=s;
q->rear=s;
}
}
void CnQueue(LiQueue *&S,LiQueue *q)
{
if(S->rear==NULL)
{
S->front=q->front;
S->rear=q->rear;
}
else
{
S->rear->next=q->front;
S->rear=q->rear;
}
}
int DispQueue(LiQueue *S)
{
Qnode *t;
if(S->rear==NULL)
{
printf("链表为空");
return 0;
}
t=S->front;
while(t->next!=NULL)
{
printf("%d",t->data);
t=t->next;
}
printf("%d",t->data);
return 1;
}
void main()
{
int i=0,n=0,e=0,j=0;
LiQueue *a[10];
LiQueue *S;
printf("输入n个10以内的数:\n");
printf("请输入n的值:\n");
scanf("%d",&n);
for(i;i<10;i++)
{
InitQueue(a[i]);
}
printf("请依次输入n个整数:");
scanf("%d",&i);
while(i<=9&&j<n-1)
{
enQueue(a[i],i);
scanf("%d",&i);
j++;
}
InitQueue(S);
for(i=0;i<10;i++)
{
CnQueue(S,a[i]);
ClearQueue(a[i]);
}
DispQueue(S);
}