基础:基于链表的空闲队列与工作队列示例

12 篇文章 0 订阅
11 篇文章 0 订阅

0 简介

本示例使用最基础的链表结构体,演示了空闲队列与工作队列的使用方式。主要构建了两个函数:insertToTail()和getFromHead()。其中,insertToTail()用于向一个链表的尾部插入一个元素,getFromHead()用于从一个链表的头部摘取一个元素。
主函数的执行流程是:
1.首先静态分配10个链表元素;
2.然后依次将这10个元素插入到由指针freeListPtr指向的空闲队列的尾部,插入完成后,输出空闲链表当前长度,并从链表头部依次打印这10个元素的数据值;
3.接着,从空闲链表的头部依次摘取元素,将其插入到由指针workListPtr指向的工作队列的尾部,并从链表头部依次打印这10个元素的数据值。

1 代码示例

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

/*链表节点结构体*/
typedef struct listNode
{
	int data;									//数据
	struct listNode *next;						//指向下一个节点的指针

} LIST_NODE, *LIST_NODE_PTR;


/*链表结构体*/
typedef struct linkList
{
	int len;									//链表长度
	LIST_NODE_PTR head;							//链表头部
	LIST_NODE_PTR tail;							//链表尾部

} LINK_LIST, *LINK_LIST_PTR;


/*
*函数名:insertToTail
*功能:从链表尾部插入元素
*参数:
*	linkListPtr:链表指针
*	listNodePtr:链表节点指针
*返回值:空
*/
void insertToTail(LINK_LIST_PTR linkListPtr, LIST_NODE_PTR listNodePtr)
{
	if (linkListPtr->len == 0)
	{
		linkListPtr->head = listNodePtr;
		linkListPtr->tail = listNodePtr;
	}
	else
	{
		linkListPtr->tail->next = listNodePtr;
		linkListPtr->tail = listNodePtr;
	}

	linkListPtr->len++;
}

/*
*函数名:getFromHead
*功能:从链表头部获取元素,获取后将从链表上去掉该元素
*参数:
*	linkListPtr:链表指针

*返回值:链表节点指针
*/
LIST_NODE_PTR getFromHead(LINK_LIST_PTR linkListPtr)
{
	LIST_NODE_PTR temp=NULL;

	if (linkListPtr->len == 0)
	{
		return NULL;
	}
	else if(linkListPtr->len == 1)
	{
		temp = linkListPtr->head;
		linkListPtr->head=NULL;
		linkListPtr->tail=NULL;
	}
	else
	{
		temp = linkListPtr->head;
		linkListPtr->head = linkListPtr->head->next;
	}
	linkListPtr->len--;

	return temp;
}


int main()
{
	LINK_LIST_PTR freeListPtr;							//空闲链表指针
	LINK_LIST_PTR workListPtr;							//工作链表指针

	LIST_NODE listNode[10];								//静态分配10个链表元素
	LIST_NODE_PTR temp=NULL;
	int i=0;

	memset(listNode,0,sizeof(LIST_NODE)*10);

	for(i=0;i<10;i++)
	{
		listNode[i].data=i;
		listNode[i].next=NULL;
	}

	freeListPtr=(LINK_LIST_PTR)malloc(sizeof(LINK_LIST));
	if(freeListPtr == NULL)
	{
		printf("malloc freeListPtr error.\n");
		return -1;
	}
	freeListPtr->len=0;

	workListPtr=(LINK_LIST_PTR)malloc(sizeof(LINK_LIST));
	if(workListPtr == NULL)
	{
		printf("malloc workListPtr error.\n");
		return -1;
	}
	workListPtr->len=0;

	
	for(i=0;i<10;i++)
	{
		insertToTail(freeListPtr,&listNode[i]);						//将10个元素依次插入空闲链表尾部
	}

	printf("list len =%d\n",freeListPtr->len);

	temp=freeListPtr->head;

	while(temp!=NULL)
	{
		printf("free data=%d\n",temp->data);
		temp=temp->next;
	}


	for(i=0;i<10;i++)
	{
		insertToTail(workListPtr,getFromHead(freeListPtr));			//依次从空闲链表头部获取元素,然后插入到工作链表的尾部		
	}

	temp=workListPtr->head;

	while(temp!=NULL)
	{
		printf("work data=%d\n",temp->data);
		temp=temp->next;
	}

	return (0);
}

2 运行结果

list len =10
free data=0
free data=1
free data=2
free data=3
free data=4
free data=5
free data=6
free data=7
free data=8
free data=9
work data=0
work data=1
work data=2
work data=3
work data=4
work data=5
work data=6
work data=7
work data=8
work data=9
请按任意键继续. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weekman93

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值