数据结构--单链表实现队列1

来源:互联网 发布:寻秦ol下载悠米版java 编辑:程序博客网 时间:2024/05/02 02:01
#include  <stdio.h>  #include  <stdlib.h>  /*单链表实现队列,目前的实现比较麻烦,额外使用了两个节点,但是尾节点基本没用,数据入队时间为O(n),出队为O(1),需要进一步修改,破坏了队列的常规判断空与满的方式*/ int length;//记录队列当前空余位置数 typedef struct node  //队列节点 {      int key;      struct node *Next;  }Node;    typedef struct Q{        struct node *front;        struct node *end;}Queue;Node *insert(int num,Node *head,Node *rear)  //元素插入到链表末尾,需要遍历到尾节点,不是很方便 {      if(length==0)        printf("队列已满,无法插入新的元素\n");    else    {        printf("入队列的元素是:%d\n",num);        Node *L = NULL;          Node *p = NULL;          L = head;          while (L->Next != rear)               L = L->Next;//遍历找到尾节点           p = (Node *) malloc (sizeof(Node));//开辟新的节点           p->key = num;//赋值           p->Next = rear;//插入到链表中           L->Next = p;        length--;     }    return rear; }  void Print_List(Node *head) //打印出当前链表中的所有数据 {      Node *p = head->Next;         printf("当前队列中的元素为:\n");    while(p->Next != NULL)//遍历打印节点值       {          printf("%d->", p->key);          p = p->Next;      }      printf("\n");  }  Node  *delete(Node *head)//从链表中删除元素,直接调整head节点 {       if(length==10)        printf("没有元素可以出队\n");    else{        printf("出队列的元素是:%d\n",head->Next->key);        head=head->Next;        length++;    }    return head;}Queue *init(Queue *q,Node *head,Node *rear)//初始化队列 {      head->Next=rear;      rear->Next=NULL;      q->front=head;      q->end=rear;      return q;}Queue *EnQueue(Queue *q,int num)//元素num入队 {      q->end=insert(num,q->front,q->end);      return q;}Queue *DeQueue(Queue *q)//队手元素出队 {      q->front=delete(q->front);      return q;}int main()  {         length=10;    int i;      Node *head = (Node *)malloc(sizeof(Node));      Node *rear = (Node *)malloc(sizeof(Node));      Queue *q= (Queue *)malloc(sizeof(Queue));    q=init(q,head,rear);    for(i=0;i<12;i++)        q=EnQueue(q,i);    for(i=0;i<12;i++)        q=DeQueue(q);    system("PAUSE");      return 0;  }