链队的实现与操作

链队的操作包括初始化、入队、出队、取队头元素。下面是实现代码:

初始化之前,还是预定义:

#define OK 1
#define ERROR 0
#define OVEFLOW -2
 
typedef int Status;
typedef intElemType;
 
typedef structQNode{
        ElemType data;
        QNode *next;
}QNode,*QueuePtr;
 
typedef struct{
        QueuePtr front;
        QueuePtr rear;
}LinkQueue;


初始化:

Status InitQueue(LinkQueue*Q)
{
        Q->front = (QNode *)malloc(sizeof(QNode));
        if (!Q->front)
                  exit(OVERFLOW);
        Q->rear = Q->front;
        Q->front->next = NULL;
        return OK;
}


先为Q->front动态分配空间,之后检查是否分配成功,如果不成功就直接退出(个人觉得在实际操作中返回错误会更加友好一点);如果分配成功,让Q->rear指向Q->front,表示此时队列为空队。最后让Q->front->nextQ->front的指针域为空。

入队:

Status EnQueue(LinkQueue *Q,ElemType e)
{
        QueuePtr p;
        p = (QNode *)malloc(sizeof(QNode));
        if (!p)
                  return ERROR;
        p->data = e;
        p->next = NULL;
        Q->rear->next = p;
        Q->rear = Q->rear->next;
        return OK;
}


先声明一个QueuePtr类型指针p,并为其动态分配空间。检测是否分配成功,如果不成功返回错误;如果成功,将e的值赋值给p->data,让p->nextNULL。为了让p称为队列的队尾,先把p赋值给Q->rear->next,然后让Q->rear指向p所指向的元素。

出队:

Status DeQueue(LinkQueue *Q,ElemType *e)
{
        QueuePtr p;
        if (Q->rear == Q->front)
                  return ERROR;
        p = Q->front->next;
        *e = p->data;
        Q->front->next = p->next;
        if (p == Q->rear)
                  Q->rear = Q->front;
        free(p);
        return OK;
}


声明一个QueuePtr类型指针p,检测队列是否为空队,如果为空队,返回错误。让p指向Q->front->next,并且用*e保存即将出队的元素的值。将p->next赋值给Q->front->next,使Q->frontp->next指向的元素连接起来。检查p是不是队尾元素,如果是,让队尾Q->rear指针指向Q->front队头指针。释放p

取队头元素:

ElemType GetHead(LinkQueueQ)
{
        if (Q.rear == Q.front)
                  return ERROR;
        return Q.front->next->data;
}


检查是否为空队,如果是,返回错误;如果不是,返回队头第一个元素的data

加入main()测试:

int main(void)
{
        LinkQueue Q;
        ElemType e;
        int n;
        if (InitQueue(&Q) == OK)
                  printf("初始化成功!\n");
        printf("1.入队\n2.出队\n3.取队头元素\n4.退出\n");
        while (1)
        {
                  printf("请选择:");
                  scanf("%d", &n);
                  switch (n)
                  {
                  case 1:
                           printf("输入你要插入的元素:");
                           scanf("%d", &e);
                           if (EnQueue(&Q, e) == OK)
                                    printf("插入成功!\n");
                           else
                                    printf("插入失败!\n");
                           break;
                  case 2:
                           if (DeQueue(&Q, &e) == OK)
                                    printf("%d已经出队。\n",e);
                           else
                                    printf("出队失败!\n");
                           break;
                  case 3:
                           printf("%d是队头元素。\n",GetHead(Q));
                           break;
                  case 4:
                           exit(0);
                  }
        }
        return 0;
}



链队的实现与操作


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值