鱼C论坛

 找回密码
 立即注册
查看: 3021|回复: 7

[已解决]数据结构建立一个学生类型链式队列,并完成其基本算法

[复制链接]
发表于 2018-9-28 20:16:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ab8583293 于 2018-9-28 20:18 编辑

建立一个学生类型链式队列,并完成其基本算法:初始化、判队空、取队头、入队、出队、求当前队列长度,并进行测试:输入5个学生信息,插入队中,并把他们依次出队输出。
(注意:学生类型为自定义结构体类型,包括成员:学生学号、姓名、年龄)

这个该怎么弄?我大二新生,刚学数据结构,如何将结构体和队列联系起来?我感觉直接结构体也可以啊?但是要链式队列,就不知道如何综合运用了
  1. typedef char datatype;
  2. typedef struct node * pointer; //结点指针类型
  3. struct node{                //链队列结点结构
  4.         datatype data;
  5.         pointer next;
  6. };
  7. typedef struct{
  8.         pointer front,rear;
  9. }lkqueue;   //链队列类型

  10. typedef struct{
  11.         int age;
  12.         int num;
  13.         char name[10];
  14. }student;

  15. //省略基本算法,不是很清楚如何用指针联系起来

  16. //主函数这样写的话,也不知道行不行,但这样好像压根就没联系起队列。 一头蒙。 网上也没这个案例
  17. int main(){
  18.         lkqueue lq;
  19.         student s[5];
  20.         for(int i=0;i<5;i++)
  21.         {
  22.                 cout<<"请输入第"<<i+1<<"个学生信息"<<endl;
  23.                 cout<<"num="; cin>>s[i].num;
  24.                 cout<<"name="; cin>>s[i].name;
  25.                 cout<<"age="; cin>>s[i].age;
  26.                 en_lkqueue(&lq,s[i]);
  27.        
  28.         }
  29. }

复制代码


最佳答案
2018-9-28 21:22:06
ab8583293 发表于 2018-9-28 20:18
可能对论坛很多人来说都觉得简单,但我刚起步 搞不懂啊。。。求指点

你传给链表的是一个结构体,你链表结点存的数据规定是存char类型的数据,编译器一看你没给我提供结构体转字符的方法,于是就报错了呗。你可以把你的链表结点改成存放指针数据,你传的时候也给链表传结构体的指针不就行了嘛。。。
  至于你结构体和队列怎么联系起来的,这个就跟队列里面放普通数据是一样的啊,把结构体想象成一个打了包的数据就行了啊,和存int是一样的
WeChat Screenshot_20180928201751.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-9-28 20:18:48 | 显示全部楼层
可能对论坛很多人来说都觉得简单,但我刚起步 搞不懂啊。。。求指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-28 21:22:06 | 显示全部楼层    本楼为最佳答案   
ab8583293 发表于 2018-9-28 20:18
可能对论坛很多人来说都觉得简单,但我刚起步 搞不懂啊。。。求指点

你传给链表的是一个结构体,你链表结点存的数据规定是存char类型的数据,编译器一看你没给我提供结构体转字符的方法,于是就报错了呗。你可以把你的链表结点改成存放指针数据,你传的时候也给链表传结构体的指针不就行了嘛。。。
  至于你结构体和队列怎么联系起来的,这个就跟队列里面放普通数据是一样的啊,把结构体想象成一个打了包的数据就行了啊,和存int是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-29 23:16:40 | 显示全部楼层
moc 发表于 2018-9-28 21:22
你传给链表的是一个结构体,你链表结点存的数据规定是存char类型的数据,编译器一看你没给我提供结构体转 ...

这是什么意思?那怎么改?
改成指针 就说 cannot convert parameter 2 from 'char *' to 'char'
应该从哪里下手?修改data 数据类型? 改成pointer data?
会报 from 'struct node *' to 'char'
。。 具体怎么实施呢,真心求解...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-30 09:37:11 | 显示全部楼层
本帖最后由 moc 于 2018-9-30 09:38 编辑

结点datatype改为void*
  1. struct node{                //链队列结点结构
  2.         void* data;
  3.         pointer next;
  4. };
复制代码

入队列的时候传指针:  en_lkqueue(&lq, &s[ i ]);
需要注意的是在en_lkqueue这个函数实现时,需要把&s[ i ]做成一个队列的结点struct node,然后再入队。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-7 23:21:03 | 显示全部楼层
  1. #include<iostream>
  2. using namespace std;
  3. //typedef void*;
  4. typedef struct node * pointer; //结点指针类型
  5. struct node{                //链队列结点结构
  6.         void* data;
  7.         pointer next;
  8. };
  9. typedef struct{
  10.         pointer front,rear;
  11. }lkqueue;   //链队列类型

  12. typedef struct{
  13.         int age;
  14.         int num;
  15.         char name[10];
  16. }student;

  17. //初始化
  18. void init_lkqueue(lkqueue *lq){
  19.         pointer p;
  20.         p=new node;                //申请头结点空间
  21.         p->next=NULL;        //头结点next指针为空
  22.         lq->front=lq->rear=p;        //头指针、尾指针都指向头结点
  23. }

  24. //判队空
  25. int empty_lkqueue(lkqueue *lq){
  26.         if(lq->rear=lq->front) return 1;
  27.         else return 0;
  28. }

  29. //取队头
  30. int gethead_lkqueue(lkqueue *lq,void *x){   //队头元素值由参数返回
  31.         pointer p;
  32.         if(lq->rear==lq->front){cout<<"队空,无队头可取!\n";return 0;}
  33.         p=lq->front->next; //队头
  34.         x=p->data;                //取出队头元素值
  35.         return 1;
  36. }

  37. //入队
  38. void en_lkqueue(lkqueue *lq,void *x){
  39.         pointer p;
  40.         p=new node;                //申请新结点空间
  41.         p->data=x;                //给新结点赋值
  42.         lq->rear->next=p;        //原尾指针指向新结点
  43.         lq->rear=p;                //新结点成为新尾指针
  44.         p->next=NULL;        //新尾结点next指针为空

  45. }
  46. /*
  47. //出队(改进的方法,尾指针不用移动)
  48. int de_lkqueue(lkqueue *lq,datatype *x){
  49.         pointer s;
  50.         if(lq->rear==lq->front){cout<<"队空,不能出队!\n";return 0;}  //队空下溢
  51.         s=lq->front;        //s指向头结点
  52.         *x=s->next->data;  //取出原队头数据
  53.         lq->front=s->next;  //头指针指向原队头(原队头变成头结点)
  54.         delete s;                //释放原结点
  55.         return 1;
  56. }*/

  57. //出队(改进的方法,尾指针不用移动)  //删除第i个学生的信息
  58. int de_lkqueue(lkqueue *lq,int i){
  59.         pointer s;
  60.         void *x;
  61.         if(lq->rear==lq->front){cout<<"队空,不能出队!\n";return 0;}  //队空下溢
  62.         s=lq->front;        //s指向头结点
  63.         x=s->next->data;  //取出原队头数据
  64.         lq->front=s->next;  //头指针指向原队头(原队头变成头结点)
  65.         delete s;                //释放原结点
  66.         return 1;
  67.         /*
  68.         lq->student->s[j]
  69.         */
  70. }

  71. //队列长度
  72. int le_lkqueue(lkqueue *lq){
  73.         pointer p=lq->front;
  74.         int length=0;
  75.         while(p!=lq->rear)
  76.         {
  77.                 ++length;
  78.                 p=p->next;

  79.         }
  80.         return length;
  81. }

  82. //输出队列
  83. void out_sqqueue(lkqueue *lq,void *x){
  84.                 lq->front->data=x;
  85.                 lq->front=lq->front+1;
  86.                 cout<<lq->front->data<<" \n";
  87.        
  88. }
  89.         //        lq->front->data=s[0]

  90. int main(){
  91.         lkqueue lq;
  92.         student  s[5];
  93.         void *x;
  94.         pointer p;
  95.         int i,j;
  96.         init_lkqueue(&lq);
  97.         if(empty_lkqueue(&lq)==1) cout<<"队列为空!"<<endl;
  98.         else cout<<"队列不为空"<<endl;

  99.         for(i=0;i<5;i++)
  100.         {
  101.                 cout<<"请输入第"<<i+1<<"个学生信息"<<endl;
  102.                 cout<<"num="; cin>>s[i].num;
  103.                 cout<<"name="; cin>>s[i].name;
  104.                 cout<<"age="; cin>>s[i].age;
  105.                 cout<<"\n";
  106.                 en_lkqueue(&lq,&s[i]);
  107.        
  108.         }
  109.         cout<<le_lkqueue(&lq);
  110.         cout<<"输出:\n";
  111.         for(i=0;i<5;i++)
  112.         {
  113.                 out_sqqueue(&lq,&s[i]);
  114.         }

  115.         return 0;
  116. }
复制代码



。可能有点愚钝,不知道为什么弄不了。感觉合情合理?   输入后,完全不是预料的结果
WeChat Image_20181007232004.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-7 23:22:00 | 显示全部楼层
moc 发表于 2018-9-30 09:37
结点datatype改为void*

入队列的时候传指针:  en_lkqueue(&lq, &s[ i ]);

在帖子帮我看下好吗?我还是不是很懂,弄不出来。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-7 23:22:57 | 显示全部楼层
moc 发表于 2018-9-30 09:37
结点datatype改为void*

入队列的时候传指针:  en_lkqueue(&lq, &s[ i ]);

[code]#include<iostream>
using namespace std;
//typedef void*;
typedef struct node * pointer; //结点指针类型
struct node{
WeChat Image_20181007232004.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 00:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表