C语言版实现链队列

 更新时间:2018年07月23日 09:24:31   作者:o0非诚勿扰0o  
这篇文章主要为大家详细介绍了C语言版实现链队列,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现链队列的具体代码,供大家参考,具体内容如下

源文件部分:  指针没学好的同学很难看懂^_^,有点乱,希望对大家有点帮助。

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
typedef int Elemtype;
#include"LQueue.h"
int main()
{
 Deque head;
 instruction(head);
 return 0;
}
头文件部分:
typedef struct Queue
{
 Elemtype data;
 struct Queue *next;
}LQnode,*LQueue;
 
typedef struct
{
 LQnode *front;
 LQnode *rear;
}Deque;
 
void Init_queue(Deque *head)  //初始化+清空操作==其实这里的清空是指将头节点后的节点给丢弃掉 
{
 LQnode *p=NULL;
 p=(LQueue)malloc(sizeof(LQnode));
 head->front=p;
 head->rear=p; 
 p->next=NULL;
}
 
int Empty_queue(Deque *head)      //判空
{
 if(head->front->next==head->rear->next)
 return 1;
 return 0;
}
 
int Lenght_queue(Deque arrow)
{
 LQnode *p=NULL;
 int len=0;
 p=arrow.front->next;
 while(p)
 {
 len++;
 p=p->next;
 }
 return len;
}
 
void Enqueue(Deque *arrow,Elemtype e)    //入队操作
{
 LQueue p=NULL;
 p=(LQueue)malloc(sizeof(LQnode));
 if(!p)
 {
 printf("已无更多的内存单元得到分配!\n");
 return ;
 }
 p->data=e;
 p->next=NULL;         //插入时,队首指针是不需要动的 
 arrow->rear->next=p;
 arrow->rear=p; 
 return ;
}
 
void Dequeue(Deque *arrow,Elemtype *e)    //出队操作
{
 LQnode *p=NULL;
 if(Empty_queue(arrow))
 {
 printf("当前链队列为空,无法完成出队操作!!!\n");
 return ;
 }
 p=arrow->front->next;
 (*e)=p->data;
 arrow->front->next=p->next;
 printf("元素%d已退出队列!!!\n",*e);
 if(Lenght_queue(*arrow)==0)
 return ;            //当最后一个元素出列以后,arrow->rear不知道指向了哪里   
 free(p);
 return ;
}
 
int Queue_top(Deque *arrow)  //返回队首元素 
{
 if(Empty_queue(arrow))
 {
 printf("当前链队列为空,队首元素不存在!!!\n");
 return 0;
 }
 printf("当前队首元素是:%d\n",arrow->front->next->data);
}
 
void Destroy_queue(Deque *arrow)  //链队列的销毁
{
 LQnode *p=NULL;
 if(Empty_queue(arrow))
 {
 printf("当前链队列为空,无须完成销毁操作!!!\n");
 return ;
 }
 while(arrow->front->next)
 {
 p=arrow->front->next;
 arrow->front->next=p->next;
 if(Lenght_queue(*arrow)==0)
  break;   
 free(p);
 }
 printf("销毁成功!\n");
 return ;
}
 
void Print_queue(Deque arrow)
{
 LQnode *p=NULL;
 p=arrow.front->next;
 while(p)
 {
 printf("%d ",p->data);
 p=p->next;
 }
 printf("\n");
}
 
void Modify_queue(Deque *arrow,Elemtype index,Elemtype e)  //修改函数
{
 int i=0;
 LQnode *p=NULL;
 p=arrow->front->next;
 while(i<index-1)
 {
 p=p->next;
 }
 p->data=e;
 printf("已完成修改操作!\n");
}
 
int Insearch_queue(Deque arrow,Elemtype e)      //查找函数
{
 LQnode *p=NULL;
 int i=1;
 if(Empty_queue(&arrow))
 {
 printf("当前链队列为空,没有元素可查找!!!\n");
 return 0;
 }
 p=arrow.front->next;
 while(p!=NULL)
 {
 if(e==p->data)
 {
  return i;
  break;
 }
 i++;
 p=p->next;
 }
 if(p==NULL)
 printf("查找失败,队列内无该元素存在!\n");
 return 0;
}
 
void instruction(Deque head)
{
 int n,m,t,a,b,len1,index;
 printf("\t\t1、队列初始化 \n");
 printf("\t\t2、新增队列元素\n");
 printf("\t\t3、返回队首元素\n");
 printf("\t\t4、元素出队列 \n");
 printf("\t\t5、查找队列元素\n");
 printf("\t\t6、修改队列元素\n");
 printf("\t\t7、销毁队列  \n");
 printf("\t\t8、队列的长度 \n");
 printf("\t\t9、打印队列元素\n");
 printf("\t\t10、退出程序  \n");
 printf("请输入你所需要完成的指令:\n");
 do{
 scanf("%d",&n);
 if(n<1||n>10)
  printf("对不起,你输入的指令编号是无效的,请重新输入!!!\n");
 }while(n<1||n>10);
 switch(n)
 {
 case 1:
  Init_queue(&head);
  printf("已完成链队列初始化,请输入你要添加的元素个数!\n");
  scanf("%d",&n);
  while(n--)
  {
  int x;
  scanf("%d",&x);
  Enqueue(&head,x);
  }
  printf("完成建队操作!\n");
  break;
 case 2:
  printf("请输入你要添加的元素个数!\n");
  scanf("%d",&n);
  while(n--)
  {
  int x;
  scanf("%d",&x);
  Enqueue(&head,x);
  }
  printf("增添成功!\n");
  break;
 case 3:
  Queue_top(&head);
  break;
 case 4:
  Dequeue(&head,&t);
  break;
 case 5:
  printf("请输入你所要查找的元素:\n");
  scanf("%d",&m);
  index=Insearch_queue(head,m);
  if(index)
  printf("你所要查找的元素位于队列的第%d个位置上!!!\n",index);
  break;
 case 6:
  printf("请输入你更改的元素队列位置:\n");
  do{
  scanf("%d",&a);
  if(a<1||a>Lenght_queue(head))
   printf("对不起,你所输入的元素位置不在区域内,请重新输入!!!\n");
  }while(a<1||a>Lenght_queue(head));
  printf("请输入修改后的值:\n");
  scanf("%d",&b);
  Modify_queue(&head,a,b);
  break;
 case 7:
  Destroy_queue(&head);
  break;
 case 8:
  len1=Lenght_queue(head);
  printf("当前链队列的长度为:%d\n",len1);
  break;
 case 9:
  Print_queue(head);
  break;
 case 10:
  return;
 default:
  instruction(head);
  break;
 }
 instruction(head);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • FFmpeg实战之利用ffplay实现自定义输入流播放

    FFmpeg实战之利用ffplay实现自定义输入流播放

    ffplay是FFmpeg提供的一个极为简单的音视频媒体播放器,可以用于音视频播放、可视化分析。本文将利用ffplay实现自定义输入流播放,需要的可以参考一下
    2022-12-12
  • C语言库函数中qsort()的用法

    C语言库函数中qsort()的用法

    大家好,本篇文章主要讲的是C语言库函数中qsort()的用法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C/C++中时间库函数的使用详解

    C/C++中时间库函数的使用详解

    这篇文章主要为大家详细介绍了C/C++中的时间相关知识总结,例如时间库函数的使用以及获取本地时间的不同方法,文中的示例代码讲解详细,需要的可以参考一下
    2022-11-11
  • C++中判断成员函数是否重写

    C++中判断成员函数是否重写

    这篇文章主要介绍了C++中判断成员函数是否重写的相关资料,需要的朋友可以参考下
    2017-04-04
  • C++日期类的实现日期计算器举例详解

    C++日期类的实现日期计算器举例详解

    这篇文章主要给大家介绍了关于C++日期类实现日期计算器的相关资料,我们要考虑日期的增加和减少,自增和自减,以及两个日期类的比较,以及当前日期类的日期显示和用户的输入输出,需要的朋友可以参考下
    2024-05-05
  • C语言中函数返回值不一致问题

    C语言中函数返回值不一致问题

    这篇文章主要介绍了C语言中函数返回值不一致问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C++中的三大函数和操作符重载(Boolan)

    C++中的三大函数和操作符重载(Boolan)

    本文主要介绍了C++中的三大函数和操作符重载(Boolan)的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 详解C++ STL模拟实现list

    详解C++ STL模拟实现list

    这篇文章主要为大家详细介绍了C++如何模拟实现STL容器list,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下
    2023-01-01
  • 深入c++中临时对象的析构时机的详解

    深入c++中临时对象的析构时机的详解

    本篇文章对c++中临时对象的析构时机进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言每日练习之动态显示系统时间

    C语言每日练习之动态显示系统时间

    这篇文章主要介绍了C语言动态显示系统时,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11

最新评论