数据结构算法 习题 答案 带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构算法题(假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针)试编写相应的队列初始化,入队列和出队列的算法!) (提供两种答案哦!!!)
一:
//既然是算法就不用源码了具体看注释
typedef int Datype;
typedef struct quenode{Datype data;
struct quenode *next;
}QueNode; //以上是结点类型的定义
typedef struct{quenode rear;
}LinkQue; //只设一个指向队尾元素的指针
void InitQue( LinkQue &Q){//置空队:
就是使头结点成为队尾元素
Q.rear=(quenode*)malloc(sizeof(quenode))
QueNode* s;
Q->rear = Q->rear->next;//将队尾指针指向头结点
while(Q->rear!=Q->rear->next) //当队列非空,将队中元素逐个出队
{s=Q->rear->next;
Q->rear->next=s->next;
free(s);
} //回收结点空间}int EmptyQue( LinkQue &Q)
{//判队空
//当头结点的next指针指向自己时为空队
return Q->rear->next->next==Q->rear->next;}void EnQue( LinkQue &Q, Datype x)
{//入队
//也就是在尾结点处插入元素
QueNode *p=(QueNode *) malloc
(sizeof(QueNode));//申请新结点
p->data=x; p->next=Q->rear->next;//初始化新结点并链入Q-rear->next=p;
Q->rear=p;//将尾指针移至新结点}Datype DeQue( LinkQue &Q,Datype &x){//出队,把头结点之后的元素摘下
Datype t;
QueNode *p;
if(EmptyQue( Q ))
Error("Que underflow");
p=Q->rear->next->next; //p指向将要摘下的结点
x=p->data; //保存结点中数据
if (p==Q->rear)
{//当队列中只有一个结点时,p结点出队后,要将队尾指针指向头结点
Q->rear = Q->rear->next; Q->rear->next=p->next;}
else
Q->rear->next->next=p->next;//摘下结点p
free(p);//释放被删结点
return x;}二:
typedef struct Node{int data;
struct Node *next;
}Node,*CiLNode;
typedef struct{CiLNode CiLrear;
}CiQue;
void InitCiQue(CiQue &Q)//初始化循环链表表示的队列
Q{Q=(CiLNode*)malloc(sizeof(CiLNode));
Q->next=Q;
}//InitCiQue
voidEnCiQue(CiQue&Q,intx)//把元素x插入循环链表表示的队列Q,Q指向队尾元素,Q->next指向头结点,Q->next->next指向队头元素
{p=(CiLNode*)malloc(sizeof(CiLNode));
p->data=x;
p->next=Q->next; //直接把p加在Q的后面
Q->next=p;
Q=p;//修改尾指针}Status DeCiQue(CiQue &Q,int x)//从循环链表表示的队列Q 头部删除元素x{if(Q==Q->next) return INFEASIBLE; //队列已空
p=Q->next->next;
x=p->data;
Q->next->next=p->next;
free(p);
return OK;
}//DeCiQue