0
点赞
收藏
分享

微信扫一扫

Java常用API之LinkedList类解读

pipu 2024-05-07 阅读 33
数据结构

目录

一、链式队列的基本概念和结构

1.1 链式队列的基本概念

1.2 链式队列的优点

1.3 链式队列的实现方式及结构

二、链式队列的接口函数实现

2.1 链式队列的接口函数 

2.2 链式队列的设计(结构体)

2.3 链式队列的初始化

2.4 入队

2.5  出队

2.6 获取队头元素值

2.7 获取有效元素个数

2.8  判空

2.9 打印

2.10 清空

2.11 销毁

三、测试

四、总结


一、链式队列的基本概念和结构

1.1 链式队列的基本概念

1.2 链式队列的优点

1.3 链式队列的实现方式及结构

 

 

二、链式队列的接口函数实现

2.1 链式队列的接口函数 

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "queue_list.h"
#include <vld.h>


//初始化
void Init_QueueList(struct QueueList *ql);

//入队
bool Push(struct QueueList *ql, ELEM_TYPE val);

//出队
bool Pop(struct QueueList *ql);

//判空
bool IsEmpty(struct QueueList *ql);

//获取队头元素值
ELEM_TYPE Front(struct QueueList *ql);

//有效数据节点个数
int Get_length(struct QueueList *ql);

//清空
void Clear(struct QueueList *ql);

//销毁
void Destroy(struct QueueList *ql);

//打印
void Show(struct QueueList *ql);

2.2 链式队列的设计(结构体)

typedef int ELEM_TYPE;

//有效数据结点结构体设计
struct QNode
{
	ELEM_TYPE data;//数据域
	struct QNode* next;//指针域
};



//链式队列头结点结构体设计
//这里只能队尾指针处入队 在队头指针处出队
typedef struct QueueList
{
	struct QNode *front;//队头指针
	struct QNode *rear;//队尾指针
}QueueList, *PQueueList;

2.3 链式队列的初始化

//初始化
void Init_QueueList(struct QueueList *ql)
{
   //0.传入的指针参数断言
    assert(ql!=NULL);
   //此时,链式队列为空链表,两个指针域均为NULL
	ql->front = NULL;
	ql->rear = NULL;
}

2.4 入队

 

//入队
bool Push(struct QueueList *ql, ELEM_TYPE val)
{
	//0.传入的指针参数断言
    assert(ql!=NULL);

	//1.购买新节点
	struct QNode * pnewnode = (struct QNode *)malloc(1 * sizeof(struct QNode));
	pnewnode->data = val;


	//1.5 要区分,到底是空队列 还是 非空队列
	//2.找到合适的插入位置
	if(IsEmpty(ql))
	{
		//链表为空
		pnewnode->next = NULL;
		ql->front = ql->rear = pnewnode;
		return true;
	}

	//3.链表不为空,正常插入 
	struct QNode *p = ql->rear;

	pnewnode->next = p->next;// == pnewnode->next = ql->rear->next;
	p->next = pnewnode;
	ql->rear = pnewnode;

	return true;
}

 

2.5  出队

 

//出队
bool Pop(struct QueueList *ql)
{
	//0.传入的指针参数断言
    assert(ql!=NULL);

	//1.判空
	if(IsEmpty(ql))
	{
		return false;
	}


	//2.指针q指向待删除结点 指针p指向待删除结点的上一个结点
	struct QNode *q = ql->front;
	//p可以用ql代替

	//2.5 判断是否仅有唯一一个有效结点,单独处理
	if(ql->front->next == NULL)
	{
		//存在唯一的节点
		ql->front = ql->rear = NULL;
		free(q);

		return true;
	}

	//3.不是唯一的节点,正常的删除,跨越指向+释放
	ql->front = q->next;
	free(q);

	return true;
}

 

2.6 获取队头元素值

//获取队头元素值
ELEM_TYPE Front(struct QueueList *ql)
{
   //0.传入的指针参数断言
    assert(ql!=NULL);
  
	if(IsEmpty(ql))
	{
		exit(1);
	}

	return ql->front->data;
}

 

2.7 获取有效元素个数

//有效数据节点个数
int Get_length(struct QueueList *ql)
{
   //0.传入的指针参数断言
    assert(ql!=NULL);
	struct QNode * p = ql->front;
	int count = 0;

	for(; p!=NULL; p=p->next)
	{
		count++;
	}
	
	return count;
}

2.8  判空

//判空
bool IsEmpty(struct QueueList *ql)
{
    //0.传入的指针参数断言
    assert(ql!=NULL);
	return ql->front == NULL;
	//return ql->rear == NULL;

}

 

2.9 打印


//打印
void Show(struct QueueList *ql)
{
    //0.传入的指针参数断言
    assert(ql!=NULL);

	struct QNode * p = ql->front;
	for(; p!=NULL; p=p->next)
	{
		printf("%d ", p->data);
	}
	printf("\n");

}

 

2.10 清空

//清空
void Clear(struct QueueList *ql)
{
    //0.传入的指针参数断言
    assert(ql!=NULL);
	Destroy(ql);
}

 

2.11 销毁

//销毁
void Destroy(struct QueueList *ql)
{
    //0.传入的指针参数断言
    assert(ql!=NULL);
	struct QNode *p = ql->front;
	struct QNode *q = NULL;

	ql->front = ql->rear = NULL;

	while(p != NULL)
	{
		q = p->next;
		free(p);
		p = q;
	}
}

 

三、测试


int main()
{
	struct QueueList head;
	Init_QueueList(&head);

	Push(&head, 12);
	Push(&head, 23);
	Push(&head, 34);
	Show(&head);

	Pop(&head);
	Pop(&head);
	Show(&head);

	

	Push(&head, 100);
	Push(&head, 200);
	Push(&head, 300);

	Show(&head);
	printf("length = %d\n", Get_length(&head));
	int tmp = Front(&head);
	printf("Front = %d\n", tmp);


	Destroy(&head);
}

四、总结

       以上便是我为大家带来的循环队列设计内容,若有不足,望各位大佬在评论区指出,谢谢大家!下一节继续进行链式队列的内容,感兴趣的你可以留下你们的点赞、收藏和关注,这是对我极大的鼓励,我也会更加努力创作更优质的作品。再次感谢大家!

举报

相关推荐

0 条评论