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

#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;  
}  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值