链式结构栈

【三】队列的链式存储结构---单链表
(1)定义
	1.使用有头结点的单链表来模拟
	2.使用head和rear指针来模拟队列
	3.head为队列头的前一个节点,rear为队尾节点
(2)队尾插入操作
	在rear后面插入元素
(3)删除队头元素
	删除fhead的下一个元素
	如果删除前只有一个元素,那么在删除后要让rear指向头结点	
(4)特点
	1.时间复杂度为O(1)	
	2.队列长度不固定
	
#ifndef LISTQUEUE_H
#define LISTQUEUE_H
#include 
#include 
#include 

typedef int ElemType;
typedef struct Node_{
    ElemType e;
    struct Node_ *next;
}Node,*NodePtr;

typedef struct {
    NodePtr head;   // 头结点,队列头的前一个元素
    NodePtr rear;   // 队尾节点
    int len;        // 队列长度
}LinkQueue;

NodePtr MallocNode()
{
    NodePtr p = (NodePtr)malloc(sizeof(Node));
    p->next = NULL;
    return p;
}

void InitQueue(LinkQueue *q)
{
   q->head = MallocNode();
   q->rear =  q->head;
   q->len = 0;
}
void PrintQueue(LinkQueue *q)
{
    NodePtr p = q->head->next;
    while(p){
        printf("%d ",p->e);
        p = p->next;
    }
    printf("\n");
}
// 入队操作
int EnQueue(LinkQueue *q, ElemType e)
{
   NodePtr new = MallocNode();
   new->e = e;
   new->next = NULL;
   q->rear->next = new;
   q->rear = new;
   q->len++;
   return 0;
}
// 出队操作
int DeQueue(LinkQueue *q, ElemType *e)
{
    if (q->len == 0) // 队列是空的
        return -1;
    NodePtr del = q->head->next;    // 队列头
    *e = del->e;
    q->head->next = del->next;
    q->len--;
    free(del);
    if (q->len == 0)
       q->rear = q->head;
    return 0;
}


#endif // LISTQUEUE_H

 

你可能感兴趣的:(算法与数据结构)