链队列基本操作

#include<stdio.h>
#include<Stdlib.h>
typedef int  elemtype;
typedef struct QueueNode
{
    elemtype data;
    struct QueueNode *next;
}LinkedQueueNode;
typedef struct LQueue
{
    LinkedQueueNode *front;
    LinkedQueueNode *rear;
}LQueue, * LinkedQueue;

LinkedQueue Init_LinkedQueue();
int LinkedQueue_Empty(LinkedQueue Q);
int Enter_LinkedQueue(LinkedQueue Q,elemtype x);
int Delete_LinkedQueue(LinkedQueue Q,elemtype *x);
int GetFront_LinkedQueue(LinkedQueue Q,elemtype *x);
int Print_LinkedQueue(LinkedQueue Q);

void menu()
{   system("cls");
    printf("\t\t1-创建\n");
    printf("\t\t2-入队\n");;
    printf("\t\t3-判断队列是否为空\n");
    printf("\t\t4-出队\n");
    printf("\t\t5-查看队头元素\n");
    printf("\t\t6-输出\n");
    printf("\t\t#-quit\n");
    printf("Please select:  ");
}

int main()
{
    char cmd;
    int isdo;
    LinkedQueue Q;
    elemtype x;
    system("cls");
    menu();
    while((cmd=getchar())!=‘#‘)
    {    switch(cmd)
        {    case ‘1‘:
                    Q=Init_LinkedQueue();
                    if(Q==NULL)
                        {
                            printf("申请链队列内存空间失败,程序结束");
                            return 0;
                        }
                        printf("\n创建成功!\n");
                        printf("\n\n\n\t\t\t");
                        break;
            case ‘2‘:
                        printf("输入队列元素:\n");
                        scanf("%d",&x);
                        while(x!=0)
                        {
                            isdo= Enter_LinkedQueue(Q,x);
                            scanf("%d",&x);
                        }
                        if(isdo==1)
                        {
                            printf("入队成功");
                        }
                        else
                        {
                            printf("入队失败");
                        }
                        printf("\n");
                        printf("\n\n\n\t\t\t");
                        break;
            case ‘3‘:
                        isdo=LinkedQueue_Empty(Q);
                        if(isdo==1)
                        {
                            printf("队列为空\n");
                        }
                        else if(isdo==0)
                        {
                            printf("队列不为空\n");
                        }
                        printf("\n");
                        printf("\n\n\n\t\t\t");
                        break;
            case ‘4‘:

                    isdo=Delete_LinkedQueue(Q,&x);
                    if(isdo==1)
                    {
                        printf("出队成功,出队的元素为:%d\n",x);
                    }
                    else if(isdo==0)
                    {
                        printf("出队失败\n");
                    }
                    printf("\n");
                    printf("\n\n\n\t\t\t");
                    break;
            case ‘5‘:
                    isdo=GetFront_LinkedQueue(Q,&x);
                    if(isdo==1)
                    {
                        printf("队头元素为:%d\n",x);
                    }
                    else if(isdo==0)
                    {
                        printf("取队头元素失败\n");
                    }
                    printf("\n");
                    printf("\n\n\n\t\t\t");
                    break;
            case ‘6‘:
                    isdo=Print_LinkedQueue(Q);
                    printf("\n");
                    printf("\n\n\n\t\t\t");
                    break;
        }
    fflush(stdin);
    system("pause");
    menu();
    }
    return 0;
}
//初始化
LinkedQueue Init_LinkedQueue()
{
    LinkedQueue Q=(LinkedQueue)malloc(sizeof(LQueue));
    LinkedQueueNode *head=(LinkedQueueNode *)malloc(sizeof(LinkedQueueNode));
    if(head!=NULL&&Q!=NULL)
    {
        head->next=NULL;
        Q->front=head;
        Q->rear=head;
    }
    return  Q;
}
//判队列空
int LinkedQueue_Empty(LinkedQueue Q)
{
    if(Q->front==Q->rear)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
//入队
int Enter_LinkedQueue(LinkedQueue Q,elemtype x)
{
    LinkedQueueNode *node;
    node=(LinkedQueueNode *)malloc(sizeof(LinkedQueueNode));
    if(node==NULL)
    {
        return 0;
    }
    node->data=x;
    node->next=NULL;
    Q->rear->next=node;            //将新结点插入队尾
    Q->rear=node;                //设置尾指针指向新的队尾元素
    return 1;
}
//出队
int Delete_LinkedQueue(LinkedQueue Q,elemtype *x)
{
    LinkedQueueNode *node;
    if(Q->front==Q->rear)
    {
        return 0;
    }
    else
    {
        node=Q->front->next;
        *x=node->data;
        Q->front->next=node->next;
        if(node==Q->rear)
        {
            Q->rear=Q->front;
        }
        free(node);
        return 1;
    }
}
//取队列头数据元素
int GetFront_LinkedQueue(LinkedQueue Q,elemtype *x)
{
    if(Q->front==Q->rear)
    {
        return 0;
    }
    else
    {
        *x=Q->front->next->data;
        return 1;
    }
}
//输出
int Print_LinkedQueue(LinkedQueue Q)
{
    LinkedQueueNode *p;
    if(Q->front==Q->rear)
    {
        return 0;
    }
    p=Q->front->next;
    while(p->next!=0)
    {
        printf("%4d\n",p->data);
        p=p->next;
    }
    return 1;
}
时间: 2024-12-14 19:30:13

链队列基本操作的相关文章

C语言 链队列基本操作

C语言链队列基本操作 #include <stdio.h> #include <stdlib.h> #include <malloc.h> /* C语言链队列基本操作 2014年7月11日10:11:41 */ typedef int qType; typedef struct node { qType data; struct node *pNext; }Node,*pNode; typedef struct queue { pNode front; pNode re

09.循环队列与链队列

一.队列与循环队列 1.队列 (1)队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.队列是一种先进先出(Fiirst In First Out)的线性表,简称FIFO.允许插入的一端称为队尾,允许删除的一端称为队头. 从队列的定义可知,队列的入队操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为O(1).队列的删除操作,与栈不同的是,队列元素的出列是在队头,即小标为0的位置,若要删除一个元素的话,需要移动队列的所有元素,因此事件复杂度为O(n).

C++链式队列基本操作

1 #include <iostream> 2 #define QUEUEELEMENTTYPE int 3 using namespace std; 4 5 /*结点*/ 6 typedef struct Node 7 { 8 QUEUEELEMENTTYPE data; /*数据域*/ 9 Node * next; /*指针域*/ 10 }LinkQueueNode; 11 12 /*队列*/ 13 struct LinkQueue 14 { 15 LinkQueueNode * fron

数据结构(C实现)------- 链队列

链队列,即队列的链式存储结构,它是仅在表头删除和表尾插入的单链表,因此一个链队列需要设置两个分别指示队头元素和队尾元素的指针,为了操作方便,给链队列添加一个头结点,并令队头指针指向头结点,由此,空的链队列的判断条件就是队头指针和队尾指针均指向头结点. 链队列的类型描述: //链队列类型描述 typedef int QElemType; typedef struct node{ QElemType data; struct node *next; }QNode,*QueuePtr; typedef

数据结构(二):链表、链队列

上一篇博文中主要总结线性表的顺序存储结构实现.比方顺序表.顺序队列和顺序栈.详细能够參考上篇博文 http://blog.csdn.net/lg1259156776/article/details/46993591 以下要进行学习和总结的是线性表的链式存储结构实现,比方链表和链队列. 顺序存储结构的优缺点 长处是逻辑相邻,物理相邻,可随机存取任一元素,存储空间使用紧凑:缺点是插入.删除操作须要移动大量的元素.平均移动n/2,预先分配空间需依照最大空间分配.利用不充分(C++ STL模板库中实现的

链队列的初始化、入队、出队等操作实现

链队列的初始化.入队.出队等基本操作实现代码如下: #include<iostream> using namespace std; #define  TRUE 1 #define  FALSE 0 //链队列定义 typedef struct Node { int data;//数据域 struct Node *next;//指针域 }LinkQueueNode; typedef struct { LinkQueueNode *front;//队头指针front LinkQueueNode *

链队列——队列的链式表示和实现

一.单链队列的链式存储结构 相关代码下载链接:http://download.csdn.net/detail/shengshengwang/8141633 队列是操作受限的线性表,只允许在队尾插入元素,在队头删除元素.对于链队列结构,为了便于插入元素,设立了队尾指针,这样插入元素的操作便与队列长度无关.存储结构,如下所示: typedef int QElemType; typedef struct QNode { QElemType data; QNode *next; } *QueuePtr;

补完链队列的其它常见操作

返回队头元素 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR.大发888娱乐城 /* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */ Status GetHead(LinkQueue Q, QElemType *e) { QueuePtr p; if(Q.front==Q.rear) return ERROR; p=Q.front->next; *e=p->data; return OK; } 求队列的长度 求链队列的长度,用一个工作指针遍历队列然

循环队列、链队列分别什么时候用

对于循环队列与链队列的比较,可以从两方面来考虑:纽约娱乐城 从时间上,其实它们的基本操作都是常数时间,即都为0(1)的,不过循环队列是事先申请好空间,使用期间不释放,而对于链队列,每次申请和释放结点也会存在一些时间开销,如果入队出队频繁,则两者还是有细微差异. 对于空间上来说,循环队列必须有一个固定的长度,所以就有了存储元素个数和空间浪费的问题.而链队列不存在这个问题,尽管它需要一个指针域,会产生一些空间上的开销,但也可以接受.所以在空间上,链队列更加灵活. 总的来说,在可以确定队列长度最大值的