队列进出元素可选择数量

#include<stdio.h>
#include<stdlib.h>
typedef struct Qnode{
    int data;
    struct Qnode *next;
}Qnode,*Queueptr;
typedef struct{
    Queueptr front; //front是指针类型 
    Queueptr rear;    
}linkqueue;
int initqueue (linkqueue &q)
{
     
     q.front=(Queueptr)malloc(sizeof(Qnode));//此处为分配内存空间
         q.rear=(Queueptr)malloc(sizeof(Qnode));
         q.front->next=q.rear->next=NULL;//此处为定义
     if(!q.front)printf("分配内存失败!\n");
    if(q.front==NULL)return -1;
    return 0; 

}
 int inqueue(linkqueue &q)
 {
 
     Queueptr r;
     int temp=0,i=1;
         printf("请输入你的数据,以99结束输入:\n");
     while(temp!=99)
     {
     scanf("%d",&temp);
     if(temp==99)
     break;
     r=(Queueptr)malloc(sizeof(Qnode));
     r->data=temp;
     r->next=NULL;
     r->next=q.front->next;//q.rear 哪里去了 
     q.front->next=r;
     i++;
     if(i==1)
     {
            q.rear=r;//这里q.rear的指向有问题 
     }
}
     return 0;
 }
 
 int dequeue(linkqueue &q)//取出栈顶元素,根据用户的需要去多少个元素,并做出异常处理 
 {     //先算出队列中有多少个元素 
     int i=0,temp,e=0;
     Queueptr r,t,s;
     t=q.front->next;//t此时指向队列尾部 
     if(q.front->next==NULL) 
     {
      printf("error\n");     
     return 0;
 }
 printf("test1\n");
     while(t!=NULL){//顺便利用这个语句块实现队列元素个数计数的功能 ,根本就达不到这个终止条件 
     t=t->next;
     e++;
     
    
     }//退出此循环表示到了尾结点,并且保存了上一个结点
    
      printf("队列中共有%d个元素  \n",e);//这里输出一直为1个元素,应该是前面的初始化部分初问题了。 
      printf("请输入你要取出多少个元素\n");
      scanf("%d",&temp);
      
          while(i<temp){//顺便利用这个语句块实现队列元素个数计数的功能 
          t=q.front->next->next;
          s=q.front->next;
     
            if(t==NULL)
              printf("now t==null\n");
          while(t!=NULL) 
          {
              r=s; 
              s=t;
               
              
              t=t->next;//以t为最终结束标志 
              
              if(t==NULL)
              {
              
              printf("t==null\n");
              break;
          }
              
          
      }
      printf("%d  \n",s->data);
    r->next=NULL; //s=NUll有用吗,目前几个均只能取队头重复元素 ,这里并不是S所指向的那个元素变成了NULL 
      
      i++;
}
    return 0;
 }

int main()
{
  int a,b,i,j,temp;
  linkqueue s,p,q;
  Queueptr r,t;
  initqueue(s);//为什么这里不是&s 
  i=initqueue(s);
  if(1==1)
  printf("分配队列内存成功\n");
  inqueue(s);
  dequeue(s);//前面的每次对队列的操作结束后。s.front 是保持不变的,类似于标记头结点,变的只有s.rear,故这也是为什么队列要有两个首尾表示结点唯一确定的原因 
   return 0;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值