数据结构建立一个学生类型链式队列,并完成其基本算法
本帖最后由 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
可能对论坛很多人来说都觉得简单,但我刚起步 搞不懂啊。。。求指点
你传给链表的是一个结构体,你链表结点存的数据规定是存char类型的数据,编译器一看你没给我提供结构体转字符的方法,于是就报错了呗。你可以把你的链表结点改成存放指针数据,你传的时候也给链表传结构体的指针不就行了嘛。。。
至于你结构体和队列怎么联系起来的,这个就跟队列里面放普通数据是一样的啊,把结构体想象成一个打了包的数据就行了啊,和存int是一样的 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:38 编辑
结点datatype改为void*
struct node{ //链队列结点结构
void* data;
pointer next;
};
入队列的时候传指针:en_lkqueue(&lq, &s[ i ]);
需要注意的是在en_lkqueue这个函数实现时,需要把&s[ i ]做成一个队列的结点struct node,然后再入队。
#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;
}
。可能有点愚钝,不知道为什么弄不了。感觉合情合理? 输入后,完全不是预料的结果 moc 发表于 2018-9-30 09:37
结点datatype改为void*
入队列的时候传指针:en_lkqueue(&lq, &s[ i ]);
在帖子帮我看下好吗?我还是不是很懂,弄不出来。。。 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]