| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6966 人关注过本帖
标题:关于队列的入队和出队的问题,和简单的输出来
只看楼主 加入收藏
humeng
Rank: 1
等 级:新手上路
帖 子:18
专家分:4
注 册:2016-10-10
结帖率:40%
收藏
已结贴  问题点数:10 回复次数:11 
关于队列的入队和出队的问题,和简单的输出来
#include<stdio.h>
#include<stdlib.h>
typedef struct aa
{
    int data;
    struct aa *next;
}Linkqueue;
typedef struct bb
{
    Linkqueue *front;
    Linkqueue *rear;
}Queue;
int InitQueue(Queue *Q)
{//初始化队列
    Q->front=(Linkqueue*)malloc(sizeof(Linkqueue));
    if(Q->front!=NULL)
    {
        Q->rear=Q->front;
        Q->front->next=NULL;
        return 1;
    }
    else
        return 0;
}
int EnterQueue(Queue *Q,int a)
{//入队
    Linkqueue *s;
    s=(Linkqueue*)malloc(sizeof(Linkqueue));
    if(s!=NULL)
    {
        s->data=a;
        s->next=NULL;
        Q->rear->next=s;
        Q->rear=s;
        return 1;
    }
    else
        return 0;
}
int DeleteQueue(Queue *Q,int *x)
{//出队
    Linkqueue *p;
    if(Q->front==Q->rear)
        return 0;
    p=Q->front->next;
    Q->front=p->next;
    if(Q->rear==p)
        Q->rear=Q->front;
    *x=p->data;
    free(p);
    return *x;
}
int main()
{
    Queue *L;
    Linkqueue *q;
    InitQueue(L);
    int b,n,*c,d;
    printf("你要入队的个数n:\n");
    scanf("%d",&n);
    printf("接下来输入n个数:\n");
    while(n--)
    {
        scanf("%d",&b);
        EnterQueue(L,b);
    }
    while(L->front!=L->rear)
    {
        d=DeleteQueue(L,c);
        printf("%d ",d);
    }
    printf("\n");
    return 0;
}
//不知道为什么运行不了,求大神指导
搜索更多相关主题的帖子: include return 
2016-10-23 10:34
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:4 
刚运行程序就直接“停止工作”了。说明在第一个scanf之前就出了问题。我看了一下代码

1. -》 2. -》 3.

程序代码:
int InitQueue(Queue *Q)
{//初始化队列
    Q->front=(Linkqueue*)malloc(sizeof(Linkqueue));//3.找到了,Q此时的值是L,而L还没有初始化,Q->front涉及野指针的操作,后果不可估计,当前环境测试的结果是终止运行,还好,起码还能知道有错误,万幸。。
    if(Q->front!=NULL)
    {
        Q->rear=Q->front;
        Q->front->next=NULL;
        return 1;
    }
    else
        return 0;
}
int main()
{
    Queue *L;
    Linkqueue *q;
    InitQueue(L);//2.往上追溯,貌似只有这里面有可能出问题了
    int b,n,*c,d;
    printf("你要入队的个数n:\n");//1.执行此代码之前就崩溃了。后面就先不考虑
    scanf("%d",&n);




φ(゜▽゜*)♪
2016-10-23 10:51
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:4 
//分配空间
int main()
{
Queue *L=(Queue*)malloc(sizeof(Queue));          //L都没有分配空间,怎么在InitQueue内调用 Q->front=(Linkqueue*)malloc(sizeof(Linkqueue));
。。。。。。
}
2016-10-23 10:53
humeng
Rank: 1
等 级:新手上路
帖 子:18
专家分:4
注 册:2016-10-10
收藏
得分:0 
回复 3楼 word123
这个,我已经改过来,不过执行到后面,还是有问题,求大神指点,谢啦
2016-10-23 22:48
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:4 
楼上提醒你的错误就不重复提了。
InitQueue(L);L传递过去,但是子函数又如何影响实参L呢,你传递的又不是地址。但是返回值又是int型。
估计执行到第一个while就程序就废了
2016-10-23 23:54
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:0 
回复 4楼 humeng
int DeleteQueue(Queue *Q,int *x)
{//出队
    Linkqueue *p;
    if(Q->front==Q->rear)
        return 0;
    p=Q->front->next;
    Q->front=p->next;   //Q->front->next=p->next;    front指向第一个无数据的节点,你怎么改了呢
    if(Q->rear==p)
        Q->rear=Q->front;
    *x=p->data;
    free(p);
    return *x;
}
2016-10-24 12:39
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:0 
回复 5楼 linlulu001
InitQueue(L);这个函数没有改变L的值,只是改变了L指向的存储空间的值。
返回值应该只是表示空间分配成功与否的一个标志。
2016-10-24 12:47
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>
typedef struct aa
{
    int data;
    struct aa *next;
}Linkqueue;
typedef struct bb
{
    Linkqueue *front;
    Linkqueue *rear;
}Queue;
int InitQueue(Queue *Q)
{//初始化队列
    Q->front=(Linkqueue*)malloc(sizeof(Linkqueue));
    if(Q->front!=NULL)
    {
        Q->rear=Q->front;
        Q->front->next=NULL;
        return 1;
    }
    else
        return 0;
}
int EnterQueue(Queue *Q,int a)
{//入队
    Linkqueue *s;
    s=(Linkqueue*)malloc(sizeof(Linkqueue));
    if(s!=NULL)
    {
        s->data=a;
        s->next=Q->rear;
        Q->rear=s;
        return 1;
    }
    else
        return 0;
}
int DeleteQueue(Queue *Q,int *x)
{//出队
    Linkqueue *p;
    *x=Q->rear->data;
    p=Q->rear;
    Q->rear=Q->rear->next;
    free(p);
    return *x;
}
int main()
{
    Queue *L=(Queue*)malloc(sizeof(Queue));
    InitQueue(L);
    int b,n,*c,d;
    printf("你要入队的个数n:\n");
    scanf("%d",&n);
    printf("接下来输入n个数:\n");
    while(n--)
    {
        scanf("%d",&b);
        EnterQueue(L,b);
    }
    while(L->front!=L->rear)
    {
        d=DeleteQueue(L,c);
        printf("%d ",d);
    }
    free(L->front);
    free(L);
    printf("\n");
    return 0;
}
2016-10-24 20:20
humeng
Rank: 1
等 级:新手上路
帖 子:18
专家分:4
注 册:2016-10-10
收藏
得分:0 
回复 8楼 linlulu001
出队不应该是从队头出吗?怎么变成从队尾出了?虽然我懂从哪出都是一样的,但是总得遵守下队列进出的规则吧,大神
2016-10-25 19:52
humeng
Rank: 1
等 级:新手上路
帖 子:18
专家分:4
注 册:2016-10-10
收藏
得分:0 
回复 3楼 word123
#include<stdio.h>
#include<stdlib.h>
typedef struct aa
{
    int data;
    struct aa *next;
}Linkqueue;
typedef struct bb
{
    Linkqueue *front;
    Linkqueue *rear;
}Queue;
int InitQueue(Queue *Q)
{//初始化队列
    Q->front=(Linkqueue*)malloc(sizeof(Linkqueue));
    if(Q->front!=NULL)
    {
        Q->rear=Q->front;
        Q->front->next=NULL;
        return 1;
    }
    else
        return 0;
}
int EnterQueue(Queue *Q,int a)
{//入队
    Linkqueue *s;
    s=(Linkqueue*)malloc(sizeof(Linkqueue));
    if(s!=NULL)
    {
        s->data=a;
        s->next=NULL;
        Q->rear->next=s;
        Q->rear=s;
        return 1;
    }
    else
        return 0;
}
void DeleteQueue(Queue *Q,int *x)
{//出队
    Linkqueue *p;
    if(Q->front==Q->rear)
        return;
    p=Q->front->next;
    Q->front->next=p->next;
    if(Q->rear==p)
        Q->rear=Q->front;
    *x=p->data;
    printf("%d ",*x);
    free(p);
}
int main()
{
    Queue *L;
    Linkqueue *h;
    L=(Queue*)malloc(sizeof(Queue));
    InitQueue(L);
    int b,n,*c,d;
    printf("你要入队的个数n:\n");
    scanf("%d",&n);
    printf("接下来输入n个数:\n");
    while(n--)
    {
        scanf("%d",&b);
        EnterQueue(L,b);
    }
    h=L->front->next;//为什么我不加这句话,运行时就有问题,加了这句话,就可以正常输出,但是我认为这跟这个程序没什么关系啊,不懂
    while(L->front!=L->rear)
        DeleteQueue(L,c);
    printf("\n");
    return 0;
}
求大神帮我看下,就是我打了注释的地方,不能理解,谢谢
2016-10-25 20:23
快速回复:关于队列的入队和出队的问题,和简单的输出来
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039391 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved