C语言实现 循环链表实现队列

C语言实现 循环链表实现队列

    • #include 
      #include "stdlib.h"
      typedef struct  queuenode{
      	int data;
      	struct queuenode * next;
      	
      }QueueNode;
      typedef  struct {
      	QueueNode * rear;
      	
      }linkQueue;
      void insertNode(linkQueue *Q,int x){
      	QueueNode * p = malloc(sizeof(QueueNode));
      	p->data = x;
      	p ->next = Q ->rear ->next;
      	Q->rear ->next  = p;
      	Q ->rear = p;
      	
      }
      int emptyQueue(linkQueue *Q){
      	return Q->rear ->next->next == Q->rear->next;
      }
      linkQueue * initQueue(void){
      	linkQueue * L = malloc(sizeof(linkQueue));
      	QueueNode * node = malloc(sizeof(QueueNode));
      	//注意malloc一个node然后再让link的指向
      	L->rear = node;
      	L->rear->next = L->rear;//指向自己
      	return L;
      }
      void printqueue(linkQueue * Q){
      	QueueNode *p;
      	p = Q->rear ->next->next;
      	//从节点开始遍历,p=p->next 指向,那个表头节点空节点时,刚好遍历完最后一个标为节点,rear,所以应该在rear->next时候停下
      	while (p!=Q->rear->next) {
      		printf("%d ",p->data);
      		p=p->next;
      	}
      	
      }
      int deleteQueue(linkQueue *Q){
      	QueueNode *p;
      	p = Q ->rear ->next->next;
      	//先判空,然后从表头删除,指向表头节点的位置
      	if(emptyQueue(Q)){
      		printf("link NULL");
      		return -1;
      	}
      	int x = p->data;
      	
      	if(p == Q->rear){
      		//最后一个节点
      		//要移动指针和rear的位置,使rear的位置停留在表头节点(空节点),指向也好指向自己
      		Q->rear = Q ->rear->next;
      		Q->rear->next = Q->rear;
      	}else {
      		Q ->rear ->next->next = p->next;
      		//改变指向,确定了新的头节点
      	}
      	
      	free(p);
      	return x;
      }
      int main(int argc, char *argv[]) {
      	linkQueue * Q;
      	Q = initQueue();
      	insertNode(Q, 1);
      	insertNode(Q, 2);
      	insertNode(Q, 3);
      	deleteQueue(Q);
      	printqueue(Q);
      }
      
    • 插入结构

    • 代码注意点,首先是初始化,和整体的循环链表,循环链表因为首位相连,可以在O(1)时间访问头节点和尾巴节点,选用头节点要找尾节点就要遍历整个链表,选用尾节点作为链表的开始就可以轻易的找到头节点

    • 尾节点和头节点之间有一个不存储数据的节点,这个概念能方便在“表头节点”,就是图中标记null节点的左边或右边进行插入和删除,向下图的四个图一样,中间的“表头节点”这个概念节点是不存储数据的,rear和head中间隔开了一个表头节点,队列在head删除,在rear后插入
      1

你可能感兴趣的:(数据结构,C语言,专插本,队列,链表,数据结构,算法,c语言)