数据结构--单链表实现队列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; }