数据结构——链式队列

队列跟栈一样,是一种抽象的数据结构,具有先进先出的特性,支持在队尾插入元素,在对头删除元素(也可以相反),队列可以用数组实现,也可以用链表实现,今天讲的就是链式队列。

链式队列分为以下几个点:

  1. 定义队列节点的数据结构
	typedef struct node 
	{
		int data;
		struct node * next;
	}linknode_t;
  1. 定义队列头指针和尾指针的数据结构
	typedef struct
	{
		linknode * rear;
		linknode * font;
	}linkqueue_t  ;
  1. 创建空链表,为头指针和尾指针以及节点申请空间
	linkqueue_t  *lq = (linkqueue_t *)malloc(sizeof(linkqueue_t));
	lq->front = lq->rear = (linknode_t *)malloc(sizeof(linknode_t));
	lq->front->next = NULL;
  1. 判断队列是否为空,即判断头指针和尾指针是否相等
	return lq->front == lq->rear ? 1 : 0;
  1. 入队
	linknode_t *temp = (linknode_t *)malloc(sizeof(linknode_t));
	temp->data = value;

	//将要插入的结点插入到rear的后面
	lq->rear->next = temp;

	//将rear指向最后一个结点
	lq->rear = temp;

  1. 出队
	//判断是否为空
	if(linknode_empty(lq))
	{
		printf("linkqueue is empty\n");
		return -1;
	}
	
	linknode_t *temp;
	temp = lq->front->next;
	lq->front->next = temp->next;

	//释放节点,防止出现野指针
	free(temp);
	temp = NULL;
	
	if(lq->front->next == NULL)
	{
		lq->rear = lq->front;
	}
  1. 打印
	linknode_t * p = lq->font->next;
	while(p != lq->rear)
	{
		printf("%d ",p->data);
		p = p->next;
		if(p == lq->rear)
			printf("%d ",p->data);
	}

之所以需要头指针和尾指针是因为如果只有一个指针的话,那入队和出队至少有一个在每次执行时,需要遍历全部节点,这样太耗费性能了。

你可能感兴趣的:(个人学习)