鱼C论坛

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

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

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

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

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

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

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

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

typedef struct{
        int age;
        int num;
        char name[10];
}student;

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

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

最佳答案
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*
struct node{                //链队列结点结构
        void* data;
        pointer next;
};
入队列的时候传指针:  en_lkqueue(&lq, &s[ i ]);
需要注意的是在en_lkqueue这个函数实现时,需要把&s[ i ]做成一个队列的结点struct node,然后再入队。

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

使用道具 举报

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

typedef struct{
        int age;
        int num;
        char name[10];
}student;

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

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

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

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

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

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

//队列长度
int le_lkqueue(lkqueue *lq){
        pointer p=lq->front;
        int length=0;
        while(p!=lq->rear)
        {
                ++length;
                p=p->next;

        }
        return length;
}

//输出队列
void out_sqqueue(lkqueue *lq,void *x){
                lq->front->data=x;
                lq->front=lq->front+1;
                cout<<lq->front->data<<" \n";
        
} 
        //        lq->front->data=s[0] 

int main(){
        lkqueue lq;
        student  s[5];
        void *x;
        pointer p;
        int i,j;
        init_lkqueue(&lq);
        if(empty_lkqueue(&lq)==1) cout<<"队列为空!"<<endl;
        else cout<<"队列不为空"<<endl;

        for(i=0;i<5;i++)
        {
                cout<<"请输入第"<<i+1<<"个学生信息"<<endl;
                cout<<"num="; cin>>s[i].num;
                cout<<"name="; cin>>s[i].name;
                cout<<"age="; cin>>s[i].age;
                cout<<"\n";
                en_lkqueue(&lq,&s[i]);
        
        }
        cout<<le_lkqueue(&lq);
        cout<<"输出:\n";
        for(i=0;i<5;i++)
        {
                out_sqqueue(&lq,&s[i]);
        }

        return 0;
}


。可能有点愚钝,不知道为什么弄不了。感觉合情合理?   输入后,完全不是预料的结果
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-11-23 18:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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