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

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

#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
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:15 
建议先用两个指针玩队列

初始化函数都不对


[fly]存在即是合理[/fly]
2016-02-29 22:42
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:5 
我没有运行,改成下面的试试。
程序代码:
bool enterqueue(QUEUE * sq,char val)
{
    QUEUE * s;
    s = (QUEUE *)malloc(sizeof(QUEUE));
    if(s == NULL)  return false;
    s->Queue = val;
    s->next = sq;
    sq->next = s;
    //sq = s;
    printf("入队成功,入队元素是 %c \n",s->Queue);
    return true;
}

   唯实惟新 至诚致志
2016-03-01 08:22
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 2楼 azzbcc
可以指出初始化错误在哪里吗?渴望你的指教。。。。。。谢谢~
2016-03-04 15:39
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
函数定义:
    void initqueue(QUEUE *sq)
调用方式:
    QUEUE q;
    initqueue(&q);//初始化队列

sq从函数定义知道是形参,也就是说 sq 是复制品,其值为 q 地址,可以通过对 *sq 操作改变 q 的值

但在你定义的函数中只有对 sq 的 new 操作,这个操作并不会对 q 产生任何影响。


[fly]存在即是合理[/fly]
2016-03-04 16:34
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
初始化、入队和出队都有问题,改了一下,我将你的bool也改了,能用。

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>
#define size 10
#define true 1
#define false 0

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

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

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

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

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

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

int main(void)
{
    QUEUE q;
    //initqueue(&q);//初始化队列
    q.next = &q;    //这里直接指向自己就成了循环队列了
    char ch[size], *n, m;
    printf("请输入字符串: \n");
    gets_s(ch,size);
    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;
}

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

int enterqueue(QUEUE * sq, char val)
{
    QUEUE * s;
    QUEUE * s1;
    s = (QUEUE *)malloc(sizeof(QUEUE));
    if (s == NULL)
        return false;
    s->Queue = val;
    s->next = sq;
    s1 = sq;
    while (s1->next != sq)    //入队需要将队尾指向队首
    {
        s1 = s1->next;
    }
    s1->next = s;
    //sq = s;
    printf("入队成功,入队元素是 %c \n", s->Queue);
    return true;
}

int outqueue(QUEUE * sq, char * val)
{
    QUEUE * r;
    if (emptyqueue(sq))
        return false;
    r = sq->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;
    sq->next = r->next;        //出队需要的时候也多了个next,导致删除错误的队列
    *val = r->Queue;
    printf("出队成功,出队元素是 %c \n", *val);
    free(r);
    return true;
}

int showqueue(QUEUE * sq)
{
    QUEUE * p, *r;
    if (emptyqueue(sq))
    {
        printf("空队列,输出失败!\n");
        return false;
    }
    r = sq;
    p = r->next;
   
    while (r != p)
    {
        printf(" %c ", p->Queue);
        p = p->next;
    }
    printf("\n");
    return true;
}
										
2016-03-04 16:46
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<stdlib.h>
#define size 10

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

QUEUE* initqueue(void);//初始化,用返回值传回指针,如用参数传回要用引用或指针 

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

bool outqueue(QUEUE * sq,char &val);//出队入队使用同一类变量,引用传地址 

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

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

int main(void)
{
    QUEUE *pq;//使用指针
    
    char str[size],chin,chout;
    
    int i;
    pq=initqueue();//初始化队列
    printf("请输入字符串: \n");
    gets(str);
    
     chin=str[0];
   i=0;
    while(chin!='\0')
    {
        
        enterqueue(pq,chin);//字符串入队
        i++;
      chin=str[i];
    }    
    outqueue(pq,chout);//出队
    printf("\n");
    showqueue(pq);//显示队列元素
    getch();
    return 0;
}

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

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

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

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

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


[此贴子已经被作者于2016-3-9 17:50编辑过]

2016-03-04 23:50
朔源
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
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:0 
楼主应该好好看看自己的程序,不管代码写的如何,算法的道理是正确的,单项链表实现队列时,较好的方法是在链表尾部做入队,在链表头部做出队,这样入队出队都不用遍历链表,反之,出队操作必须遍历链表,因为虽有指向队尾指针,但其前序的指针,只能从头遍历得到。
2016-03-13 12:15
快速回复:【求帮助!】单个指针的循环链式队列 出队 和 遍历出错。
数据加载中...
 
   



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

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