main.cpp
#include<bits/stdc++.h>
#include"liandui.h"
using namespace std;
int main()
{
liandui *p;
initliandui(p);
rudui(p,1);
rudui(p,2);
rudui(p,3);
int a=lianduiempty(p);
cout<<a<<endl;
cout<<"出队元素为:"<<chudui(p)<<endl;
int b=lianduichang(p);
cout<<"队长为:"<<b<<endl;
rudui(p,4);
rudui(p,5);
rudui(p,6);
int c=lianduichang(p);
cout<<"队长为:"<<c<<endl;
cout<<"出队元素依次为:"<<endl;
while(!lianduiempty(p))
cout<<chudui(p)<<endl;
xiaohui(p);
return 0;
}
liandui.cpp
#include"liandui.h"
#include<bits/stdc++.h>
using namespace std;
void initliandui(liandui *&p)
{
p=(liandui *)malloc(sizeof(liandui));
p->fron=p->rear=NULL;
}
void xiaohui(liandui *&p)
{
datanode *q,*k;
if(p->rear==NULL)
{
cout<<"就剩一个头了!"<<endl;
free(p);
return;
}
q=p->fron;
k=p->fron->next;///如果只剩一个链头节点的话,这个应该就不成立!
free(p);
while(k->next!=NULL)
{
free(q);
q=k;
k=k->next;
}
free(k);
}
int lianduiempty(liandui *p)
{
return (p->rear==NULL);
}
int lianduichang(liandui *p)
{
datanode *q;
q=p->fron;
int k=0;
while(q!=NULL)
{
k++;
q=q->next;
}
return k;
}
void rudui(liandui *&p,int s)
{
datanode *r;
r=(datanode *)malloc(sizeof(struct node));
r->data=s;
r->next=NULL;
if(p->rear==NULL)///链队为空并进队的情况
p->rear=p->fron=r;
else
{
p->rear->next=r;
p->rear=r;
}
}
int chudui(liandui *&p)///我一开始写的时候没有将出队的数据节点释放掉,看了书之后又加的
{
datanode *r;
if(p->rear==NULL)
cout<<"链队为空"<<endl;
if(p->rear==p->fron)
{
int y=p->rear->data;
p->rear=p->fron=NULL;
return y;
}
int h=p->fron->data;
r=p->fron;
p->fron=p->fron->next;
free(r);
return h;
}
liandui.h
#ifndef LIANDUI_H_INCLUDED
#define LIANDUI_H_INCLUDED
typedef struct node
{
int data;
struct node *next;
}datanode;
typedef struct
{
datanode *fron;
datanode *rear;
}liandui;
void initliandui(liandui *&p);
void xiaohui(liandui *&p);
int lianduiempty(liandui *p);
int lianduichang(liandui *p);
void rudui(liandui *&p,int s);
int chudui(liandui *&p);
#endif // LIANDUI_H_INCLUDED
知识点总结:
出队的时候最好把出队节点的空间给释放掉!还有就是在销毁链队的时候要注意需要判断链队是否为空(就是只剩一个链队节点的情况)!
心得体会:
百尺竿头更进一步!