回 帖 发 新 帖 刷新版面

主题:队列纠错

题目:输入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);
}

回复列表 (共5个回复)

沙发

麻烦大家了,给点提示

板凳

额~~~~没人给点回应么?

3 楼

搞定了,在这里要谢谢湛蓝水晶的帮忙,呵呵,群里的高手

4 楼

我把要修改的部门列出来,还有错误分析,有兴趣的朋友可以看一下
int CnQueue(LiQueue *&S,LiQueue *q)
{
    if(q->rear==NULL)
        return 0;
    if(S->rear==NULL)
    {
        S->front=q->front;
        S->rear=q->rear;
    }

    else
    {
        S->rear->next=q->front;
        S->rear=q->rear;
    }
    free(q);//之前我是在main函数里面唻释放那十个链表的,错误的把数据结点也给释放了,现在把它移到这里唻
            //只是要删除头结点就可以了
    return 1;
}

5 楼

还有一个就是输入数据的链表插入也修改成了下面的这样
for(j=0; j<n; j++)
    {
        scanf("%d", &i);
        if(i>9)
            break;
        enQueue(a[i], i);
    } 
最后是main函数里面的链接函数CnQueue也要做相应的改动,把上面的链表释放去掉,事实上,也不需要定义Declare函数了

我来回复

您尚未登录,请登录后再回复。点此登录或注册