假设以循环链表表示队列,并且只设一个指针指向队尾元素结点而不设头指针
打印判断入队都没问题 但是但运行出队的时候就出现错误求指点
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<windows.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
struct LNode *rear;
}LNode, *LinkList;
//基本操作
Status InitLinkList(LinkList &L) //队列初始化
{
L=(LinkList)malloc(sizeof(LNode));
L->data=NULL;
L->next=L;
L->rear=L;
return 0;
}
Status Liststatus(LinkList L){ //判断队列状态
LinkList p;
p=L->rear->next;
int i=1;
if(L->data==NULL)
printf("队空\n");
else {
while(!(L->rear==p))
{i++;p=p->next;}
printf("队列中有%d个元素\n",i);
return OK;
}
}
Status Listpush(LinkList &L,ElemType e){ //入队
LinkList s;
if(L->data==NULL)
L->data=e;
else{
s=(LinkList)malloc(sizeof(LNode));
s->data=e;s->next=L->rear->next;
L->rear->next=s;
}
return OK;
}
Status dequeue(LinkList &L){ //出队
LinkList s;
if(L->data==NULL)
return ERROR;
if(L->rear->next==L->rear)
L->data==NULL;
while(!(L->next==L->rear)){L=L->next;}
s=L->rear;
L->rear=L;
L->next=s->next;
free(s);
return OK;
}
Status ListPrint(LinkList L) { //打印
LinkList p;
p=L->rear->next;
int i=1;
if(L->data==NULL)
printf("队空\n");
else {
while(!(L->rear==p))
{printf("%d ",p->data);p=p->next;}
printf("%d\n",p->data);
return OK;
}
}
void main(){
Status InitLinkList(LinkList &L);
Status Liststatus(LinkList L);
Status Listpush(LinkList &L,ElemType e);
Status dequeue(LinkList &L);
Status ListPrint(LinkList L);
LinkList L;
InitLinkList(L);
Listpush(L,5);Listpush(L,7);Listpush(L,3);Listpush(L,8);Listpush(L,55);
Liststatus(L);
ListPrint(L);
dequeue(L);
dequeue(L);
dequeue(L);
Liststatus(L);
ListPrint(L);
dequeue(L);
dequeue(L);
Liststatus(L);
}