修改的 创建队列程序 C语言。 队列元素 是堆分配内存,而非指针

/*构造一个空队列*/
Queue *InitQueue()  
{
	Queue *pqueue = (Queue *)malloc(sizeof(Queue));
	if(pqueue!=NULL)
	{
		pqueue->front = NULL;
		pqueue->rear = NULL;
		pqueue->size = 0;
		//pqueue->status=1;		//初始化为send数据
	}
	return pqueue;
}

/*销毁一个队列*/
void DestroyQueue(Queue *pqueue)
{
	if(IsEmpty(pqueue)!=1)
		ClearQueue(pqueue);
	free(pqueue);
}

/*清空一个队列*/
void ClearQueue(Queue *pqueue)
{
	while(IsEmpty(pqueue)!=1)
	{
		DeQueue(pqueue,NULL,NULL);
	}

}

/*判断队列是否为空*/
int IsEmpty(Queue *pqueue)
{
	if(pqueue->front==NULL&&pqueue->rear==NULL&&pqueue->size==0)
		return 1;
	else
		return 0;
}

/*返回队列大小*/
int GetSize(Queue *pqueue)
{
	return pqueue->size;
}

/*将新元素入队*/
PNode EnQueue(Queue *pqueue,Item item,int sid)
{
	int length = 0;
	PNode pnode = (PNode)malloc(sizeof(Node));
	if(pnode != NULL)
	{
		// 这里一定要+1
		length = strlen(item)*sizeof(char)+1;
		//pnode->data = item;
		pnode->data = (Item)malloc(length);
		memset(pnode->data, 0, length);
		memcpy(pnode->data, item, length);


		pnode->next = NULL;
		pnode->status = sid;
		
		if(IsEmpty(pqueue))
		{
			pqueue->front = pnode;
		}
		else
		{
			pqueue->rear->next = pnode;
		}
		pqueue->rear = pnode;
		pqueue->size++;
	}
	return pnode;
}

/*队头元素出队*/
PNode DeQueue(Queue *pqueue,Item pitem,int *sid)
{
	PNode pnode = pqueue->front;
	if(IsEmpty(pqueue)!=1&&pnode!=NULL)
	{
		if(pitem!=NULL)
		{
			//*pitem = pnode->data;
			memcpy(pitem, pnode->data, strlen(pnode->data));
			free(pnode->data);

			*sid = pnode->status;
		}

		pqueue->size--;
		pqueue->front = pnode->next;
		free(pnode);
		if(pqueue->size==0)
			pqueue->rear = NULL;
	}
	return pqueue->front;
}


/*遍历队列*/  
void QueueTraverse(Queue* pqueue)  
{  

	PNode pnode = pqueue->front;  
	int i = pqueue->size;  
	while(i--)  
	{  
  		printf("遍历队列第 %d 个元素 为: %s\n", i, pnode->data);
		pnode = pnode->next;  
	}  
}  



头文件

#ifndef Queue_H
#define Queue_H

typedef char* Item;
typedef struct node * PNode;
typedef struct node
{
	Item data;
	PNode next;
	int status;		//status=1 表明是send 数据,=2为recv数据
}Node;

typedef struct
{
	PNode front;
	PNode rear;
	int size;
}Queue;

/*构造一个空队列*/
Queue *InitQueue(); 

/*销毁一个队列*/
void DestroyQueue(Queue *pqueue);

/*清空一个队列*/
void ClearQueue(Queue *pqueue);

/*判断队列是否为空*/
int IsEmpty(Queue *pqueue);

/*返回队列大小*/
int GetSize(Queue *pqueue);

/*将新元素入队*/
PNode EnQueue(Queue *pqueue,Item item,int sid);

/*队头元素出队*/
PNode DeQueue(Queue *pqueue,Item pitem,int *sid);

/*遍历队列,并对各项数据调用visit函数*/  
void QueueTraverse(Queue* pqueue); 

#endif


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用C语言实现链式队列的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义队列节点结构 typedef struct Node { int data; struct Node* next; } Node; // 定义链式队列结构 typedef struct { Node* front; // 队头指针 Node* rear; // 队尾指针 } Queue; // 初始化链式队列 void initQueue(Queue* queue) { queue->front = NULL; queue->rear = NULL; } // 判断队列是否为空 int isQueueEmpty(Queue* queue) { return queue->front == NULL; } // 入队操作 void enqueue(Queue* queue, int value) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = value; newNode->next = NULL; if (isQueueEmpty(queue)) { queue->front = newNode; queue->rear = newNode; } else { queue->rear->next = newNode; queue->rear = newNode; } } // 出队操作 int dequeue(Queue* queue) { if (isQueueEmpty(queue)) { printf("Queue is empty.\n"); return -1; } Node* temp = queue->front; int value = temp->data; queue->front = queue->front->next; free(temp); if (queue->front == NULL) { queue->rear = NULL; } return value; } // 获取队头元素 int getFront(Queue* queue) { if (isQueueEmpty(queue)) { printf("Queue is empty.\n"); return -1; } return queue->front->data; } // 销毁链式队列 void destroyQueue(Queue* queue) { while (!isQueueEmpty(queue)) { dequeue(queue); } } int main() { Queue queue; initQueue(&queue); enqueue(&queue, 1); enqueue(&queue, 2); enqueue(&queue, 3); printf("Front element: %d\n", getFront(&queue)); int value = dequeue(&queue); printf("Dequeued element: %d\n", value); enqueue(&queue, 4); printf("Front element: %d\n", getFront(&queue)); destroyQueue(&queue); return 0; } ``` 这个示例代码实现了一个简单的链式队列。通过`initQueue`函数初始化队列,`enqueue`函数向队列添加元素,`dequeue`函数从队列删除元素,`getFront`函数获取队头元素,`destroyQueue`函数销毁队列。 在`main`函数,我们先初始化队列,然后使用`enqueue`函数添加一些元素队列。之后,使用`getFront`函数获取队头元素并打印。接着,使用`dequeue`函数从队列删除一个元素,并打印出被删除的元素。最后,我们再次使用`enqueue`函数添加一个元素队列,并使用`getFront`函数获取新的队头元素并打印。最后,使用`destroyQueue`函数销毁队列。 希望这个示例能帮助你理解如何使用C语言实现链式队列

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值