数据结构考研复习(链式队列)

与循环队列不同,链式队列通常被设计为带头结点的单链表,队首指针指向头结点,队尾指针指向队尾结点。

具体代码如下:

#include<stdio.h>

#include<malloc.h>

typedef struct LinkNode{ //链式队列结点
    int data;
    struct LinkNode *next;
}LinkNode;

typedef struct{  //链式队列
    LinkNode *front,*rear;
}LinkQueue;

/* -1- 初始化链式队列*/
void InitQueue(LinkQueue &Q){

    Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode)); //建立头结点
    Q.front->next = NULL; //初始为空
}

/* -2- 判断是否空队列*/
bool IsEmpty(LinkQueue Q){
    if(Q.front == Q.rear)
    {
        return true;
    }
    else
    {
        return false;
    }
}

/* -3- 入队(插入元素)*/
bool EnQueue(LinkQueue &Q,int e){
    LinkNode *temp = (LinkNode*)malloc(sizeof(LinkNode));
    temp->data = e;
    temp->next = NULL; //创建新结点,插入到尾链
    Q.rear->next = temp;
    Q.rear = temp;
}

/* -4- 出队*/
bool DeQueue(LinkQueue &Q,int &e){
    if(IsEmpty(Q)){
        printf("空链队!\n");
        return false;
    }
    LinkNode *temp = Q.front->next; //找到首元节点的位置
    e = temp->data;
    Q.front->next = temp->next; //指针后移
    if(Q.rear == temp)
    {
        Q.rear = Q.front; //若原队列只有一个结点,删除变空
    }
    free(temp);
    return true;
}

int main(){
    LinkQueue Q;
    InitQueue(Q);

    printf("*请输入队列长度:\n");
    int e,length,temp,i=1;
    scanf("%d",&length);
    temp = length;
    printf("\n*请依次输入%d个元素\n\n",length);
    while(length > 0){
        printf("请输入第%d个元素:\n",i);
        scanf("%d",&e);
        EnQueue(Q,e);
        length--;
        i++;
    }
    printf("\n*请进行选择:\n");
    printf("==============\n\n");

    printf("==1.循环出队\n");
    printf("==2.当前队首、队尾元素\n");

    int flag;
    scanf("%d",&flag);
    switch(flag){
    case(1):
        {
            printf("\n当前队列为:\n");
            while(temp > 0){
                int e;
                if(temp != 1)
                {
                     printf("%d->",Q.front->next->data);
                }
                else
                {
                    printf("%d",Q.front->next->data);
                }

                DeQueue(Q,e);
                temp--;
           }
            break;
        }
    case(2):
        {
            printf("当前队首元素为:%d\n",Q.front->next->data);
            printf("当前队尾元素为:%d\n",Q.rear->data);
            break;
        }
    }
    return 0;
}

最终结果:

 

 

 

posted on 2021-08-03 17:31  HOr7z  阅读(145)  评论(0编辑  收藏  举报