| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 839 人关注过本帖
标题:c primer plus队列这一章有个问题不懂有谁能解释一下
只看楼主 加入收藏
mj0011
Rank: 2
等 级:论坛游民
帖 子:24
专家分:39
注 册:2014-12-23
结帖率:100%
收藏
 问题点数:0 回复次数:8 
c primer plus队列这一章有个问题不懂有谁能解释一下
在c primer plus程序清单17.7中的程序中有个功能是把队列首段删除关键代码如下
程序代码:
//Queue.h
 #include <stdbool.h>
typedef int item

typedef strcut node{
    Item item;
    struct node *next
}Node;

typedef struct queue{
    Node *front;  //指向对列首的指针
    Node *rear;    //指向队列尾的指针
    int items;   //队列中项目个数
}Queue;

bool DE_Queue(Item *pitem ,Queue *pq)

实现代码
程序代码:
#include <stdio.h>

void CopyToItem(Node *pn ,Item *pi)
{
    *pi = pn ->item;
}

bool DE_Queue(Item *pitem ,Queue *pq)
{
    Node *pt;
    if (QueueIsEmpty(pq))
        return false;
    CopyToItem(pq->fornt ,pitem);
    pt = pq->front;
    pq->front = pq->front->next;
    free(pt);
    pq->items--;
    if (pq->items == 0)
        pq=>rear = NULL;
    return true;
}


我对CopyToItem(pq->fornt ,pitem);这个函数调用不太明白这个函数有什么作用
搜索更多相关主题的帖子: include 
2015-12-04 10:03
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:0 
将移出队的那个节点的元素值拷一份给你用,因为该节点马上要被下面的代码删除了。
2015-12-04 11:23
mj0011
Rank: 2
等 级:论坛游民
帖 子:24
专家分:39
注 册:2014-12-23
收藏
得分:0 
回复 2楼 newdos
如果不需要拷贝直接把这段代码注释就会出错
2015-12-04 13:12
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:0 
出现什么错?
你的代码本身有问题
typedef int item 《---没有分号

typedef strcut node{ <------关键字struct打错了
    Item item;
    struct node *next
}Node;

bool DE_Queue(Item *pitem ,Queue *pq) 《----又没有分号

CopyToItem(pq->fornt ,pitem); 《-----成员变量打错了。是front,不是fornt

pq=>rear = NULL; 《----pq=>这是什么符号?

[此贴子已经被作者于2015-12-4 14:20编辑过]

2015-12-04 14:15
mj0011
Rank: 2
等 级:论坛游民
帖 子:24
专家分:39
注 册:2014-12-23
收藏
得分:0 
回复 4楼 newdos
代码可能发帖的时候写错了运行后的情况就像下面这样
输入a添加数字35
输入a添加数字23
输入a添加数字11
输入b删除了11
输入b删除了11
输入b删除了11
2015-12-04 14:25
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:0 
上代码找大家帮调试啊,或是自己下断点调试啊。无代码无真相。
2015-12-04 14:30
mj0011
Rank: 2
等 级:论坛游民
帖 子:24
专家分:39
注 册:2014-12-23
收藏
得分:0 
程序代码:
//queue.h
#ifndef _QUQUE_H_

#define _QUEUE_H_

#include <stdbool.h>

#define MAXQUEUE 10

typedef int Item;

typedef struct node{
    Item item;
    struct node *next;
}Node;

typedef struct queue {
    Node *fornt;
    Node *arer;
    int items;
}QUEUE;

void InitializeQueue(QUEUE *pq);

bool QueueIsEmpty(const QUEUE *pq);

bool QueueIsFull(const QUEUE *pq);

unsigned int QueueIsCount(const QUEUE *pq);

bool EN_Queue(QUEUE *pq, Item item);

bool DE_Queue(Item *pitem, QUEUE *pq);

void EmptyTheQueue(QUEUE *pq);
#endif

程序代码:
//queue.c
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"


static void CopyToNode(Item item,    Node *pq);
static void CopyToItem(Item *item, Node *pq);

void InitializeQueue(QUEUE *pq)
{
    pq->fornt = pq->arer = NULL;
    pq->items = 0;
}

bool QueueIsEmpty(const QUEUE *pq)
{
    return (pq->items == 0);
}

bool QueueIsFull(const QUEUE *pq)
{
    return (pq->items == MAXQUEUE);
}

unsigned int QueueIsCount(const QUEUE *pq)
{
    return (pq->items);
}

bool EN_Queue(QUEUE *pq, Item item)
{
    Node *pnew;

    if (QueueIsFull(pq))
        return false;

    pnew = (Node*)malloc(sizeof(Node));

    if (pnew == NULL)
        return false;
    CopyToNode(item, pnew);
    pnew->next = NULL;
    if (QueueIsEmpty(pq))
        pq->fornt = pnew;
    else
        pq->arer->next = pnew;
    pq->arer = pnew;
    pq->items++;
    return true;
}

bool DE_Queue(Item *pitem, QUEUE *pq)
{
    Node *pnew;
    if (QueueIsEmpty(pq))
        return false;

    //CopyToItem(pitem ,pq->fornt);
    pnew = pq->fornt;
    pq->fornt = pq->fornt->next;
    free(pnew);
    pq->items--;

    if (pq->items == 0)
        pq->arer = NULL;
    return true;
}

void EmptyTheQueue(QUEUE *pq)
{
    Item dummy;
    while (!QueueIsEmpty(pq))
        DE_Queue(&dummy, pq);
}

static void CopyToNode(Item item, Node *pq)
{
    pq->item = item;
}

static void CopyToItem(Item *item, Node *pq)
{
    *item = pq->item;
}

程序代码:
//Driver.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"

char getchoise(void);

int main(int argc, char *argv[])
{
    Item temp;
    QUEUE list;
    char ch;

    puts("a> add  . b> delete ");
    InitializeQueue(&list);

    while ((ch = getchoise()) != 'q')
    {
        while (ch != 'a' && ch != 'b')
            continue;
        if (ch == 'a')
        {
            puts("input number .");
            scanf("%d", &temp);
            while (getchar() != '\n')
                continue;
            if (!QueueIsFull(&list))
            {
                EN_Queue(&list, temp);
                printf("putting %d into queue", temp);
                printf("%d items in queue." ,QueueIsCount(&list));
            }
            else
            {
                puts("Queue is full!");
            }
        }
        else
        {
            if (QueueIsEmpty(&list))
                puts("Nothing to delete");
            else
            {
                DE_Queue(&temp, &list);
                printf("Removeing %d from queue" ,temp);
            }
        }
        printf("%d item in queue.",QueueIsCount(&list));
        puts("Type a to add number b to delete q to quite");
        
    }
    EmptyTheQueue(&list);
    puts("Done!");
    return 0;

}

char getchoise(void)
{
    char ch;
    ch = getchar();
    while (getchar() != '\n')
        continue;
    return ch;
}
2015-12-04 14:49
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:0 
你读代码呢,如果不要CopyToItem那句,还是一样把入队的节点给删除了,但为什么会输出11?
也就是你最后一个入队的值,很明显scanf("%d", &temp);temp在出队操作前,最后肯定是你输入的那个值11啊,而你这下面这句又不变
 DE_Queue(&temp, &list);
 printf("Removeing %d from queue" ,temp);
当然打印出来的就是你最后入队的那个值11喽,
你把temp参数交给 DE_Queue进入处理,又把CopyToItem处理temp那句给注释掉了,temp值原样未动,所以printf("Removeing %d from queue" ,temp); 一直打印你最后一次入栈的值。
2015-12-04 15:23
mj0011
Rank: 2
等 级:论坛游民
帖 子:24
专家分:39
注 册:2014-12-23
收藏
得分:0 
回复 8楼 newdos
谢谢解答我明白了
2015-12-04 17:39
快速回复:c primer plus队列这一章有个问题不懂有谁能解释一下
数据加载中...
 
   



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

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