ab8583293 发表于 2018-9-28 20:16:08

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

本帖最后由 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;
}student;

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

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



ab8583293 发表于 2018-9-28 20:18:48

可能对论坛很多人来说都觉得简单,但我刚起步 搞不懂啊。。。求指点

moc 发表于 2018-9-28 21:22:06

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

你传给链表的是一个结构体,你链表结点存的数据规定是存char类型的数据,编译器一看你没给我提供结构体转字符的方法,于是就报错了呗。你可以把你的链表结点改成存放指针数据,你传的时候也给链表传结构体的指针不就行了嘛。。。
至于你结构体和队列怎么联系起来的,这个就跟队列里面放普通数据是一样的啊,把结构体想象成一个打了包的数据就行了啊,和存int是一样的

ab8583293 发表于 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'
。。 具体怎么实施呢,真心求解...

moc 发表于 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,然后再入队。

ab8583293 发表于 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;
}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
        */
}

//队列长度
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

int main(){
        lkqueue lq;
        students;
        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.num;
                cout<<"name="; cin>>s.name;
                cout<<"age="; cin>>s.age;
                cout<<"\n";
                en_lkqueue(&lq,&s);
       
        }
        cout<<le_lkqueue(&lq);
        cout<<"输出:\n";
        for(i=0;i<5;i++)
        {
                out_sqqueue(&lq,&s);
        }

        return 0;
}


。可能有点愚钝,不知道为什么弄不了。感觉合情合理?   输入后,完全不是预料的结果

ab8583293 发表于 2018-10-7 23:22:00

moc 发表于 2018-9-30 09:37
结点datatype改为void*

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


在帖子帮我看下好吗?我还是不是很懂,弄不出来。。。

ab8583293 发表于 2018-10-7 23:22:57

moc 发表于 2018-9-30 09:37
结点datatype改为void*

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


#include<iostream>
using namespace std;
//typedef void*;
typedef struct node * pointer; //结点指针类型
struct node{
页: [1]
查看完整版本: 数据结构建立一个学生类型链式队列,并完成其基本算法