ZBLOG

#include #include#include using namespace std; // 函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef int QElemType; typedef struct QNode{ QElemType data; QNode *next;}...

以下是补充完整的链队列代码:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0 
#define OVERFLOW -1

typedef int QElemType;
typedef struct QNode{
    QElemType data;
    QNode *next;
} *QueuePtr;

struct LinkQueue{
    QueuePtr front, rear; // 队头、队尾指针
};

void print(QElemType i){
    printf("%d ", i);
}

void InitQueue(LinkQueue &Q); // 构造一个空队列Q
void DestroyQueue(LinkQueue &Q); // 销毁队列Q,Q不再存在
void ClearQueue(LinkQueue &Q); // 将Q清为空队列
int QueueEmpty(LinkQueue Q); // 若队列Q为空队列,则返回TRUE;否则返回FALSE
int QueueLength(LinkQueue Q); // 返回Q的元素个数,即队列的长度
int GetHead(LinkQueue Q, QElemType &e); // 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
int EnQueue(LinkQueue &Q, QElemType e); // 插入元素e为Q的新的队尾元素
int DeQueue(LinkQueue &Q, QElemType &e); // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
void QueueTraverse(LinkQueue Q, void(*vi)(QElemType)); // 从队头到队尾依次对队列Q中每个元素调用函数vi()

int main(){
    int j;
    int i = 0, l;
    QElemType d;
    LinkQueue Q;
    
    InitQueue(Q);
    
    for(i = 0; i < 5; i++){
        scanf("%d", &d);
        EnQueue(Q, d);
    };
    
    printf("队列长度为: %d\n", QueueLength(Q));
    printf("现在队列中元素:\n");
    QueueTraverse(Q, print);
    
    DeQueue(Q, d);
    printf("删除的元素是%d\n", d);
    
    DeQueue(Q, d);
    printf("删除的元素是%d\n", d);

   scanf("%d",&d); 
   EnQueue(Q,d); 
   
   printf("队列长度为: %d\n", QueueLength(Q));
   printf("现在队列中元素:\n");
   QueueTraverse(Q, print);

   j=GetHead(Q,d); 
   if(j) 
     printf("现在队头元素为:%d\n",d);

   ClearQueue(Q);  
   DestroyQueue(Q); 
}

// 链队列的基本操作(9个)
void InitQueue(LinkQueue &Q){
	// 构造一个空队列Q
	Q.front = Q.rear = (QueuePtr)malloc(sizeof(struct QNode));
	if(!Q.front){
		exit(OVERFLOW); // 存储分配失败
	}
	Q.front->next = NULL;
}

void DestroyQueue(LinkQueue &Q){
	// 销毁队列Q(无论空否均可)
	while (Q.front){
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = Q.rear;
	}
}

void ClearQueue(LinkQueue &Q){
	// 将Q清为空队列
	Q.rear = Q.front;
}

int QueueEmpty(LinkQueue Q){
	// 若Q为空队列,则返回TRUE,否则返回FALSE
	if (Q.front == Q.rear){
		return TRUE;
	}
	else{
		return FALSE;
	}
}

int QueueLength(LinkQueue Q){
	// 求队列的长度
	int length = 0;
	QueuePtr p = Q.front->next;
	while (p){
		length++;
		p = p->next;
	}
	return length;
}

int GetHead(LinkQueue Q, QElemType &e){
	// 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR
	if (Q.front == Q.rear){ // 队列为空
	    return ERROR; 
    }
	e = Q.front->next->data;
	return OK;
}

int EnQueue(LinkQueue &Q, QElemType e){
   // 插入元素e为Q的新的队尾元素
   QueuePtr p = (QueuePtr)malloc(sizeof(struct QNode));
   if(!p){
      exit(OVERFLOW); // 存储分配失败
   }
   
   p->data = e;
   p->next = NULL;

   Q.rear->next = p; // 把拥有元素e新节点链接到原来链表的最后一个节点之后

   Q.rear = p; // 把当前的p设置为尾节点
   
   return OK;
}

int DeQueue(LinkQueue &Q, QElemType &e){ 
    // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
    if (Q.front == Q.rear){ // 队列为空
        return ERROR;
    }
    
	QueuePtr p = Q.front->next; // 将欲删除的队头节点暂存给p
	
	e = p->data; // 保存队头元素的值

	Q.front->next = p->next; // 修改头指针,使其指向原队头节点的下一个节点
	
	if (Q.rear == p){ // 若队头就是队尾,则删除后将rear指向头节点
	    Q.rear = Q.front;
    }
	
	free(p); // 释放原队头节点
	
	return OK;
}

void QueueTraverse(LinkQueue Q, void(*vi)(QElemType)){
    // 从队头到队尾依次对队列Q中每个元素调用函数vi()
	QueuePtr p = Q.front->next;
	while (p){
		vi(p->data);
		p = p->next;
	}
}

这样补充完整的链队列代码可以正常运行,并实现了基本操作。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9466

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?