C语言实现链式队列

2023-12-20 22:41:51

在C语言中,链式队列是一种使用链表实现的队列,它具有以下特点:

  1. 链式队列不需要预先分配固定大小的存储空间,可以动态地分配内存以适应不同大小的队列。
  2. 链式队列可以无限扩展,因此不会出现队列满的情况。
  3. 链式队列的入队和出队操作对于链表而言比较灵活,不需要移动大量元素

以下是对链式队列的实现和简单使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//节点结构体
struct Linknode
{
	struct Linknode* next;
};
struct LQueue
{
	struct Linknode pHeader;
	int m_size;
	struct Linknode* pTail;//尾节点指针
};
typedef void* linkqueue;
//初始化
linkqueue init_linkqueue()
{
	struct LQueue* myqueue = (struct LQueue*)malloc(sizeof(struct LQueue));
	if (myqueue == NULL)
	{
		return NULL;
	}
	myqueue->pHeader.next = NULL;
	myqueue->m_size = 0;
	myqueue->pTail = &myqueue->pHeader;
	return myqueue;
}
//入队,尾插
void push_linkqueuq(linkqueue queue,void*data)
{
	if (queue == NULL)
	{
		return ;
	}
	if (data == NULL)
	{
		return;
	}
	struct LQueue* myqueue = (struct LQueue* )queue;
	struct Linknode* mynode = (struct Linknode* )data;
	//更改过指针指向
	myqueue->pTail->next = mynode;
	mynode->next = NULL;
	myqueue->pTail = mynode;
	myqueue->m_size++;
}
//出队,头删
void pop_linkqueue(linkqueue queue)
{
	if (queue == NULL)
	{
		return;
	}
	struct LQueue* myqueue = (struct LQueue*)queue;
	if (myqueue->m_size == 0)
	{
		return;
	}
	if (myqueue->m_size == 1)
	{
		myqueue->pHeader.next = NULL;
		myqueue->pTail = &myqueue->pHeader;
		myqueue->m_size--;
		return;
	}
	struct Linknode* pFirst = myqueue->pHeader.next;
	myqueue->pHeader.next = pFirst->next;
	myqueue->m_size--;
}
//返回队头
void* front_linkqueue(linkqueue queue)
{
	if (queue == NULL)
	{
		return NULL;
	}
	struct LQueue* myqueue = (struct LQueue*)queue;
	if (myqueue->m_size == 0)
	{
		return NULL;
	}
	return myqueue->pHeader.next;
}
//队尾
void* back_linkqueue(linkqueue queue)
{
	if (queue == NULL)
	{
		return NULL;
	}
	struct LQueue* myqueue = (struct LQueue*)queue;
	if (myqueue->m_size == 0)
	{
		return NULL;
	}
	return myqueue->pTail;
}
//大小
int size_linkqueue(linkqueue queue)
{
	if (queue == NULL)
	{
		return -1;
	}
	struct LQueue* myqueue = (struct LQueue*)queue;
	return myqueue->m_size;
}
//判断是否为空
int isEmpty(linkqueue queue)
{
	if (queue == NULL)
	{
		return -1;
	}
	struct LQueue* myqueue = (struct LQueue*)queue;
	if (myqueue->m_size == 0)
	{
		return 1;
	}
	return 0;
}
//销毁
void destroy_linkqueue(linkqueue queue)
{
	if (queue == NULL)
	{
		return;
	}
	free(queue);  // 释放内存
	queue = NULL; // 将指针置为 NULL
}
struct person
{
	int* a;
	char name[64];
	int age;
};

void test01()
{
	linkqueue myqueue = init_linkqueue();
	struct person p6 = { NULL, "aaa",18 };
		struct person p7 = { NULL, "bbb",123 };
		struct person p8 = { NULL ,"ccc",24 };
		struct person p9 = { NULL,"ddd",25 };
		push_linkqueuq(myqueue, &p6);
		push_linkqueuq(myqueue, &p7);
		push_linkqueuq(myqueue, &p8);
		push_linkqueuq(myqueue, &p9);
		printf("大小:%d\n", size_linkqueue(myqueue));
		while (!isEmpty(myqueue))
		{
			struct person* p1 = (struct person* )front_linkqueue(myqueue);
			printf("队头名字:%s,年龄:%d\n", p1->name, p1->age);
			struct person* p2 = (struct person*)back_linkqueue(myqueue);
			printf("队尾名字:%s,年龄:%d\n", p2->name, p2->age);
			printf("-------\n");
			pop_linkqueue(myqueue);
		}
		printf("大小:%d\n", size_linkqueue(myqueue));
		destroy_linkqueue(myqueue);
}
int main()
{
	test01();
	return 0;
}

文章来源:https://blog.csdn.net/luosuss/article/details/135118760
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。