| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2469 人关注过本帖
标题:【求帮助!】单个指针的循环链式队列 出队 和 遍历出错。
取消只看楼主 加入收藏
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:2 
【求帮助!】单个指针的循环链式队列 出队 和 遍历出错。

/*只有一个指针,指向尾结点的循环链式队列 :队列应是先进先出,但这程序是却是先进后出,而且出队的元素也又问题,应该是指针哪里错了。可是看了很多遍又找不到哪里错了。请各位帮忙看看。下面有我程序的运行结果。请大神帮帮忙,看看到底错哪里了!!!!!   */

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<stdlib.h>
#define size 10

typedef struct queue
{
    char Queue;
    struct queue * next;
} QUEUE ;

void initqueue(QUEUE * sq);//初始化

bool enterqueue(QUEUE * sq,char val);//入队

bool outqueue(QUEUE * sq,char * val);//出队

bool showqueue(QUEUE * sq);//显示队列信息

bool emptyqueue(QUEUE * sq);//判断队列是否为空

int main(void)
{
    QUEUE q;
    initqueue(&q);//初始化队列
    char ch[size],* n,m;
    printf("请输入字符串: \n");
    gets(ch);
    n = ch;
    while(*n)
    {
        enterqueue(&q,*n);//字符串入队
        n++;
    }   
    outqueue(&q,&m);//出队
    printf("\n");
    showqueue(&q);//显示队列元素
    getch();
    return 0;
}

void initqueue(QUEUE * sq)
{
    sq = (QUEUE *)malloc(sizeof(QUEUE));
    if(sq == NULL)
        exit(-1);
    sq->next = sq;
}

bool emptyqueue(QUEUE * sq)
{
    if(sq->next == sq)
        return true;
    else
        return false;
}

bool enterqueue(QUEUE * sq,char val)
{
    QUEUE * s;
    s = (QUEUE *)malloc(sizeof(QUEUE));
    if(s == NULL)
        return false;
    s->Queue = val;
    s->next = sq->next;
    sq->next = s;
    sq = s;
    printf("入队成功,入队元素是 %c \n",sq->Queue);
    return true;
}

bool outqueue(QUEUE * sq,char * val)
{
    QUEUE * r;
    if(emptyqueue(sq))
        return false;
    r = sq->next->next;
    if(sq == r)//头结点后只有一个结点的情况
    {
        sq = r->next;
        sq->next = sq;
        *val = r->Queue;
        printf("出队成功,出队元素是 %c \n",*val);
        free(r);
        return true;
    }
    sq->next->next = r->next;
    *val = r->Queue;
    printf("出队成功,出队元素是 %c \n",*val);
    free(r);
    return true;
}

bool showqueue(QUEUE * sq)
{
    QUEUE * p,* r;
    if(emptyqueue(sq))
    {
        printf("空队列,输出失败!\n");
        return false;
    }
    r = sq->next;
    p = r->next;
    while(r != p)
    {
        printf(" %c ",p->Queue);
        p = p->next;
    }
    printf("\n");
    return true;
}


/*
程序运行结果:
-----------------------------------------------------------------------------
请输入字符串:
abcdefg
入队成功,入队元素是 a
入队成功,入队元素是 b
入队成功,入队元素是 c
入队成功,入队元素是 d
入队成功,入队元素是 e
入队成功,入队元素是 f
入队成功,入队元素是 g
出队成功,出队元素是 f //出队的元素应该是 a 现在却是 f 。

队列剩余元素:
 e  d  c  b  a  //显示队列元素应该是从 a 开始的,现在却是倒着来了。请各位大神搭救。。。。到底哪里错了。。。
 
 Press any key to continue

-----------------------------------------------------------------------------

  */
搜索更多相关主题的帖子: include 而且 元素 
2016-02-29 22:03
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 2楼 azzbcc
可以指出初始化错误在哪里吗?渴望你的指教。。。。。。谢谢~
2016-03-04 15:39
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 6楼 grmmylbs

首先十分感谢你解答,只是看你的程序的时候有个地方看不明白。就是出队函数中有个疑问。

如果头节点后有且只有一个节点,那么 r = sq->next;执行之后,r 就指向了sq 节点后的节点了。那么 if(sq == r) 是不是就有问题,应该是 if( sq == r->next ) 才对。

int outqueue(QUEUE * sq, char * val)
{
    QUEUE * r;
    if (emptyqueue(sq))
        return false;
    r = sq->next;
    if (sq == r)//头结点后只有一个结点的情况 //  如果头节点后有且只有一个节点,那么 r = sq->next;执行之后,r 就指向了sq 节点后的节点了。那么 if(sq == r) 是不是就有问题,应该是 if( sq == r->next ) 才对。
    {
        sq = r->next;
        sq->next = sq;
        *val = r->Queue;
        printf("出队成功,出队元素是 %c \n", *val);
        free(r);
        return true;
    }
    //sq->next->next = r->next;
    sq->next = r->next;        //出队需要的时候也多了个next,导致删除错误的队列
    *val = r->Queue;
    printf("出队成功,出队元素是 %c \n", *val);
    free(r);
    return true;
}
2016-03-13 11:17
快速回复:【求帮助!】单个指针的循环链式队列 出队 和 遍历出错。
数据加载中...
 
   



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

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