华硕灵耀s4000ua评测3 Pro是新品吗?可不可以买它呢?

欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 607 人关注过本帖
标题:【求帮助!】单个指针的循环链式队列 出队 和 遍历出错。
等 级:新手上路
帖 子:103
结帖率:89.66%
&&已结贴√
&&问题点数:20&&回复次数:8&&&
【求帮助!】单个指针的循环链式队列 出队 和 遍历出错。
/*只有一个指针,指向尾结点的循环链式队列 :队列应是先进先出,但这程序是却是先进后出,而且出队的元素也又问题,应该是指针哪里错了。可是看了很多遍又找不到哪里错了。请各位帮忙看看。下面有我程序的运行结果。请大神帮帮忙,看看到底错哪里了!!!!!&&&*/
#include&stdio.h&
#include&conio.h&
#include&malloc.h&
#include&stdlib.h&
#define size 10
typedef struct queue
&&& char Q
&&& struct 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)
&&& initqueue(&q);//初始化队列
&&& char ch[size],* n,m;
&&& printf(&请输入字符串: \n&);
&&& gets(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 =
bool emptyqueue(QUEUE * sq)
&&& if(sq-&next == sq)
bool enterqueue(QUEUE * sq,char val)
&&& QUEUE *
&&& s = (QUEUE *)malloc(sizeof(QUEUE));
&&& if(s == NULL)
&&& s-&Queue =
&&& s-&next = sq-&
&&& sq-&next =
&&& printf(&入队成功,入队元素是 %c \n&,sq-&Queue);
bool outqueue(QUEUE * sq,char * val)
&&& QUEUE *
&&& if(emptyqueue(sq))
&&& r = sq-&next-&
&&& if(sq == r)//头结点后只有一个结点的情况
&&&&&&&&sq = r-&
&&&&&&&&sq-&next =
&&&&&&&&*val = r-&Q
&&&&&&&&printf(&出队成功,出队元素是 %c \n&,*val);
&&&&&&&&free(r);
&&& sq-&next-&next = r-&
&&& *val = r-&Q
&&& printf(&出队成功,出队元素是 %c \n&,*val);
&&& free(r);
bool showqueue(QUEUE * sq)
&&& QUEUE * p,*
&&& if(emptyqueue(sq))
&&&&&&&&printf(&空队列,输出失败!\n&);
&&& r = sq-&
&&& p = r-&
&&& while(r != p)
&&&&&&&&printf(& %c &,p-&Queue);
&&&&&&&&p = p-&
&&& printf(&\n&);
程序运行结果:
-----------------------------------------------------------------------------
请输入字符串:
入队成功,入队元素是 a
入队成功,入队元素是 b
入队成功,入队元素是 c
入队成功,入队元素是 d
入队成功,入队元素是 e
入队成功,入队元素是 f
入队成功,入队元素是 g
出队成功,出队元素是 f //出队的元素应该是 a 现在却是 f 。
队列剩余元素:
&e&&d&&c&&b&&a&&//显示队列元素应该是从 a 开始的,现在却是倒着来了。请各位大神搭救。。。。到底哪里错了。。。
&Press any key to continue
-----------------------------------------------------------------------------
搜索更多相关主题的帖子:
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3292
专家分:12819
&&得分:15&
建议先用两个指针玩队列
初始化函数都不对
[fly]存在即是合理[/fly]
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
我没有运行,改成下面的试试。
程序代码:bool enterqueue(QUEUE * sq,char val)
&&& QUEUE *
&&& s = (QUEUE *)malloc(sizeof(QUEUE));
&&& if(s == NULL)&&return false;
&&& s-&Queue =
&&& s-&next =
&&& sq-&next =
&&& //sq =
&&& printf(&入队成功,入队元素是 %c \n&,s-&Queue);
&&& return true;
&&&唯实惟新 至诚致志
等 级:新手上路
帖 子:103
回复 2楼 azzbcc
可以指出初始化错误在哪里吗?渴望你的指教。。。。。。谢谢~
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3292
专家分:12819
函数定义:
&&& void initqueue(QUEUE *sq)
调用方式:
&&& initqueue(&q);//初始化队列
sq从函数定义知道是形参,也就是说 sq 是复制品,其值为 q 地址,可以通过对 *sq 操作改变 q 的值
但在你定义的函数中只有对 sq 的 new 操作,这个操作并不会对 q 产生任何影响。
[fly]存在即是合理[/fly]
等 级:贵宾
威 望:35
帖 子:1072
专家分:4393
初始化、入队和出队都有问题,改了一下,我将你的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 Q
&&& struct 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)
&&& //initqueue(&q);//初始化队列
&&& q.next = &q;&&& //这里直接指向自己就成了循环队列了
&&& char ch[size], *n,
&&& printf(&请输入字符串: \n&);
&&& gets_s(ch,size);
&&& 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 =
int emptyqueue(QUEUE * sq)
&&& if (sq-&next == sq)
int enterqueue(QUEUE * sq, char val)
&&& QUEUE *
&&& QUEUE * s1;
&&& s = (QUEUE *)malloc(sizeof(QUEUE));
&&& if (s == NULL)
&&& s-&Queue =
&&& s-&next =
&&& while (s1-&next != sq)&&& //入队需要将队尾指向队首
&&&&&&&&s1 = s1-&
&&& s1-&next =
&&& //sq =
&&& printf(&入队成功,入队元素是 %c \n&, s-&Queue);
int outqueue(QUEUE * sq, char * val)
&&& QUEUE *
&&& if (emptyqueue(sq))
&&& r = sq-&
&&& if (sq == r)//头结点后只有一个结点的情况
&&&&&&&&sq = r-&
&&&&&&&&sq-&next =
&&&&&&&&*val = r-&Q
&&&&&&&&printf(&出队成功,出队元素是 %c \n&, *val);
&&&&&&&&free(r);
&&& //sq-&next-&next = r-&
&&& sq-&next = r-&&&&&&&&&//出队需要的时候也多了个next,导致删除错误的队列
&&& *val = r-&Q
&&& printf(&出队成功,出队元素是 %c \n&, *val);
&&& free(r);
int showqueue(QUEUE * sq)
&&& QUEUE * p, *r;
&&& if (emptyqueue(sq))
&&&&&&&&printf(&空队列,输出失败!\n&);
&&& p = r-&
&&& while (r != p)
&&&&&&&&printf(& %c &, p-&Queue);
&&&&&&&&p = p-&
&&& printf(&\n&);
等 级:黑侠
帖 子:204
专家分:635
程序代码:
#include&stdio.h&
#include&conio.h&
#include&malloc.h&
#include&stdlib.h&
#define size 10
typedef struct queue
&&& char Q
&&& struct 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 *//使用指针
&&& char str[size],chin,
&&& pq=initqueue();//初始化队列
&&& printf(&请输入字符串: \n&);
&&& gets(str);
&&&&&chin=str[<font color=#];
&&&i=<font color=#;
&&& while(chin!='<font color=#')
&&&&&&&&enterqueue(pq,chin);//字符串入队
&&&&&&&&i++;
&&&&&&chin=str[i];
&&& outqueue(pq,chout);//出队
&&& printf(&\n&);
&&& showqueue(pq);//显示队列元素
&&& getch();
&&& return <font color=#;
QUEUE * initqueue(void)
&&& QUEUE *
&&& sq = (QUEUE *)malloc(sizeof(QUEUE));
&&& if(sq == NULL)
&&&&&&&&return NULL;
&&& sq-&next = NULL;
&&& return
/*bool emptyqueue(QUEUE * sq)
&&& if(sq-&next == NULL)
bool enterqueue(QUEUE * sq,char val)
&&& QUEUE *
&&& s = (QUEUE *)malloc(sizeof(QUEUE));
&&& if(s == NULL)
&&&&&&&&return false;
&&if(sq-&next==NULL)
&&&&&&&&s-&Queue=
&&&&&&&&s-&next=s;
&&&&&&&&sq-&next=s;
&&&&&&else
&&&&&&&&& s-&Queue =
&&&&&&&&& s-&next= sq-&next-&
&&&&&&&&&sq-&next -&next=
&&&&&&&&&sq -&next=
&&& printf(&入队成功,入队元素是 %c \n&,sq-&next-&Queue);
&&& return true;
bool outqueue(QUEUE * sq,char&&&val)
&&& QUEUE *
&&& if(sq-&next==NULL)
&&&&&&&&return false;
&&& r = sq-&next-&
&&& if(sq-& next== r)//头结点后只有一个结点的情况
&&&&&&&&sq-&next = NULL;
&&&&&&&&val = r-&Q
&&&&&&&&sq-&next-&next = r-&
&&& val = r-&Q
&&& printf(&出队成功,出队元素是 %c \n&,val);
&&& free(r);
&&& return true;
bool showqueue(QUEUE * sq)
&&& QUEUE * p,*
&&& if(sq-&next==NULL)
&&&&&&&&printf(&空队列,输出失败!\n&);
&&&&&&&&return false;
&&& r = r-&
&&&&&&&&printf(& %c &,r-&Queue);
&&& while(r-&next!=sq-&next);
&&& printf(&\n&);
&&& return true;
[此贴子已经被作者于 17:50编辑过]
等 级:新手上路
帖 子:103
回复 6楼 grmmylbs
首先十分感谢你解答,只是看你的程序的时候有个地方看不明白。就是出队函数中有个疑问。
如果头节点后有且只有一个节点,那么 r = sq-&next;执行之后,r 就指向了sq 节点后的节点了。那么 if(sq == r) 是不是就有问题,应该是 if( sq == r-&next ) 才对。
int outqueue(QUEUE * sq, char * val)
&&& QUEUE *
&&& if (emptyqueue(sq))
&&& r = sq-&
&&& if (sq == r)//头结点后只有一个结点的情况 //&&如果头节点后有且只有一个节点,那么 r = sq-&next;执行之后,r 就指向了sq 节点后的节点了。那么 if(sq == r) 是不是就有问题,应该是 if( sq == r-&next ) 才对。
&&&&&&&&sq = r-&
&&&&&&&&sq-&next =
&&&&&&&&*val = r-&Q
&&&&&&&&printf(&出队成功,出队元素是 %c \n&, *val);
&&&&&&&&free(r);
&&& //sq-&next-&next = r-&
&&& sq-&next = r-&&&&&&&&&//出队需要的时候也多了个next,导致删除错误的队列
&&& *val = r-&Q
&&& printf(&出队成功,出队元素是 %c \n&, *val);
&&& free(r);
等 级:黑侠
帖 子:204
专家分:635
楼主应该好好看看自己的程序,不管代码写的如何,算法的道理是正确的,单项链表实现队列时,较好的方法是在链表尾部做入队,在链表头部做出队,这样入队出队都不用遍历链表,反之,出队操作必须遍历链表,因为虽有指向队尾指针,但其前序的指针,只能从头遍历得到。
版权所有,并保留所有权利。
Powered by , Processed in 0.054795 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved404 Page Not Found
[这是什么节奏?] 服务器君目前很忙,刷新下看看?
或者继续访问:采用链式存储实现队列的初始化、入队、出队操作
#include&stdio.h&
#include&stdlib.h&
#define OK 1
#define OVERFLOW
#define ERROR
typedef&int&QElemT
typedef&int&Status&;
typedef&struct&QNode{
&QElemType&
& &struct&QNode&*
}QNode,*QueueP
typedef&struct&{
&QueuePtr&
&QueuePtr&
Status&InitQueue(LinkQueue&&Q){
&Q.front=(QueuePtr)malloc(sizeof(QNode));
&Q.rear=(QueuePtr)malloc(sizeof(QNode));
& &if(!Q.front)exit(OVERFLOW);
& &Q.front=Q.
& &return&OK;
Status&Chushihua(LinkQueue&&Q){
&QueuePtr&p;
& &printf("请输入元素,以-1 结束\n");
& &while(scanf("%d",&e),e!=-1){
&p=(QueuePtr)malloc(sizeof(QNode));
&p-&data=e;
&p-&next=NULL;
&Q.rear-&next=p;
&Q.rear=p;
&p=Q.front-&
& &while(p!=NULL)
&printf("%d
",p-&data);
& &printf("\n");
& &return&OK;
void&tishi()
& &printf("所有操作如下:\n");
& &printf("(1)采用链式存储实现队列的初始化操作。\n");
& &printf("(2)采用链式存储实现队列的入队操作。\n");
& &printf("(3)采用链式存储实现队列的出队操作。\n");
& &printf("(-1)退出\n");
& &printf("请选择:");
Status&DeQueue(LinkQueue&&Q){
&QueuePtr&p;
& &if(Q.front==Q.rear)
&printf("队列为空!!!!!!!!\n");
&return&ERROR;
&p=Q.front-&
& &printf("%d\n",p-&data);
&Q.front-&next=p-&
& &if(Q.rear==p)Q.rear=Q.
& &free(p);
& &return&OK;
Status&EnQueue(LinkQueue&&Q){
&QueuePtr&p;
&p=(QueuePtr)malloc(sizeof(QNode));
& &if(!p)exit(OVERFLOW);
& &printf("请输入要入队的元素:");
& &scanf("%d",&p-&data);
&Q.rear-&next=p;
&p-&next=NULL;
& &Q.rear=p;
& &return&OK;
int&main()
&LinkQueue&q;
& &InitQueue(q);
&scanf("%d",&m);
&switch(m){
&Chushihua(q);
&EnQueue(q);
&DeQueue(q);
& &}while(m!=-1);
& &return&0;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。在电子工程世界为您找到如下关于“循环队列”的新闻
循环队列资料下载
1.4.3 算法效率的度量
1.4.4 算法的存储空间需求
第二章 线性表
2.1 线性表的逻辑结构
2.2 线性表的顺序存储结构
2.3 线性表的链式存储结构
2.3.1 线性链表
2.3.2 循环链表
2.3,3 双向链表
2.4 一元多项式的表示及相加
第三章 栈和队列
3.1.1 抽象数据类型栈的定义...
4.9.3中缀表达式转后缀表达式 108
4.10队列的定义 111
电脑有时会处于疑似死机的状态。就当你失去耐心,打算了reset时。突然它像酒醒了一样,把你刚才点击的所有操作全部都按顺序执行了一遍。
4.11队列的抽象数据类型 112
4.12循环队列 113
你上了公交车发现前排有两个空座位,而后排所有座位都已经坐满,你会怎么做?立马下车,并对自己说,后面没座了,我等下一辆...
循环队列演示,可以初始化队列大小,插入队列,出队列以及清空队列...
本算法构造循环队列,包含了队列的建立,求队列的长度,队列中元素的入队与出队等操作...
;375.3&& 数值运算命令&385.4&& 条件表达式&405.4.1&& if 表达式&405.4.2&& case 表达式&415.5&& 循环语句&425.5.1&& for 语句&435.5.2&nbsp...
表达式的最小计算152. 在复合语句中申明变量153. 使用缩进改善可读性154. 测试浮点值155. 使用while循环156. 使用for循环157. for语句的有些部分是任选的158. 递增for循环中的值159. 控制for循环的递增160. 在for循环的语句中申明变量161. 了解死循环162. 中断死循环163. 在for循环中使用逗号164. 使用do循环165. 了解...
算法的存储空间需求
第2章 线性表
2.1 线性表的类型定义
2.2 线性表的顺序表示和实现
2.3 线性表的链式表示和实现
2.3.1 线性链表
2.3.2 循环链表
2.3.3 双向链表
2.4 一元多项式的表示及相加
第3章 栈和队列
3.1.1 抽象数据类型栈的定义
3.1.2 栈的表示和实现
实现循环队列的操作(队空、入队、出队、读取队列头元素)...
数据结构算法:使用循环队列,K阶斐波那契数列的一种算法实现。...
1) 根据栈数据结构,分别建立一个顺序栈和链式栈并实现其上基本操作(出栈和入栈等);2) 根据队列数据结构,分别建立链队列和循环队列,并完成其上的基本操作(出入队列等);3) 参考P80表达式求值例题,应用栈的基本操作实现简单表达式求值运算及其进出栈模拟过程(给出程序执行过程中栈的变化过程);4) 阅读P83栈与递归的实现一节内容和3阶汉诺塔问题。使用栈数据结构解决3阶汉诺塔问题,编写程序并模拟...
循环队列相关帖子
;&&mainQUEUE_LENGTH,/* The size of each item the queue holds. */sizeof(uint32_t));同时创建两个Task,一个Task循环延时后发送队列,另一个Task则持续监听队列,收到队列消息后则打印累计收到的队列消息数量。/*!* @brief Task prvQueueSendTask...
;&if (++TX_IndexW &= TXBUF_SIZE)// 写指针递增,且判断是否下标越界
& & TX_IndexW = 0;& && && && &&&// 如果越界则写指针归零(循环队列)& &nbsp...
;&&};&&}&&
这部分的代码和主动站的程序类似。只是不需要接受循环缓冲区,而是使用了一个16字节的缓冲区。因为FIFO最多只有16级。
同时增加了一个回调函数类型。用于设定用户需要回调的函数的类型。
定义了相关的操作接口
[cpp] view plain copy
* 设置接收处理函数...
本文中主要以《UI到底是怎么接受事件的事件》举例,讲述QT中关于时间机制的一些看法:事件的产生过程:1 首先由底层的硬件中断 à 操作系统(产生一个事件在其自己的事件队列中)2 Qt中有一个 a.exec() 会帮我们建立一个事件循环 该循环一直在等在系统有事件传入下列是一些示例代码:While(不为空队列){If(是退出事件?){该APP退出;}If(分配事件到事件的函数;){执行函数...
EDMA3CC包括两种通道类型: DMA channels(64个) & QDMA channels(8个),每个通道均由传输队列(4个传输队列,每个队列有16个事件入口)控制器控制,并有一个对应的参数设置集PaRAM set。EDMA与QDMA的主要区别在于两者的触发方式不同。
EDMA的触发方式:
& & &event-triggered...
;& && &&&// 如果越界则写指针归零(循环队列)& &}&&IE1 |= UTXIE0;& && && && && && &// 允许UART0的发送中断,在中断内依次发送数据...
这种消息循环的机制,我们引入一个新的机制Handler,我们有消息循环,就要往消息循环里面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,把这些都封装在Handler里面,注意Handler只是针对那 些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。但是这里还有一点,就是只要是关于UI相关的东西...
刚自学了UCOS系统,有关于队列和信号量还是很不明白。
信号量创建,给的参数是0. 而后面的任务可以添加它的量,直至他的最大的量?
别的任务申请到了该量,是不是不释放就一直获得。
队列一开始创建了个数组,是不是存放许多消息的指针。
然后发送队列消息的函数发送指针给队列。 队列以先进先出的原则给等待队列消息的任务??
如果队列发超过这个数组大小就循环从第一个开始?因为我看到课件有个循环...
,找到了根源,是由于此时的Event队列已满了,事件无法继续入队了。此时打开消息队列的内存处发现,里面都被同一个事件塞满了。
为什么这个事件没有人去Receive它呢?查找它的receiver,发现了问题。原来是一个已经不用的task,当初代码注释没有注释干净。而这个事件是在每次poweron操作的时候进入event队列中的。
到此,整个事情的前因后果都清楚了。
。还有一种办法 ...[/quote]
第一种方法不行,这样就限制了发送数据的个数,我的目的是在接受中不能太浪费内存资源,又可以做到发送数据的时候没有长度限制
用循环缓冲区
[url]/versaloon/vsf/blob/master/vsf/component/buffer/buffer.c[/url]
参考里面关于fifo的处理,主要是pop和...
循环队列视频
循环队列创意
你可能感兴趣的标签
热门资源推荐}

我要回帖

更多关于 华硕灵耀3 pro 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信