欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言 算法与数据结构 链队列 基本操作及案例

程序员文章站 2024-03-23 09:44:10
...

C语言 算法与数据结构 链队列 基本操作及案例

实验要求:

实现链队列的判空、入队、出队、获取队首元素的基本操作。

main.c

#include"LinkQueue.c"

int main()
{
    system("color f5");
    system("title 链队列的基本操作 Dev: Ice2Faith");
    printf("---------------------------------\n\n");
    printf("\t链队列的基本操作\n\n");
    printf("\tDev: Ice2Faith\n\n");
    printf("---------------------------------\n\n");
    printf("任意键继续\n>/ ");
    getch();
    LinkQueue * Q=DefaultLinkQueue();
    int x;
    char exit='c';
    do
    {
        system("cls");
        printf("请输入元素进队,以-999结束:\n>/ ");
        scanf("%d",&x);
        while(x!=-999)
        {
            InQueue(Q,x);
            scanf("%d",&x);
        }
        printf("Len=%d\n",LenQueue(Q));
        GetHeadQueue(Q,&x);
        printf("Head=%d\n",x);
        printf("这是您出队的结果:\n>/ ");
        while(!IsEmpty(Q))
        {
            OutQueue(Q,&x);
            printf("->%d",x);
        }
        CleanQueue(Q);
        printf("\n这是您清空后出队的结果:\n>/ ");
        while(!IsEmpty(Q))
        {
            OutQueue(Q,&x);
            printf("->%d",x);
        }

        printf("\n\n退出请输入 * ,否则重新测试:\n>/ ");
        exit=getch();
    }
    while(exit!='*');


    return 0;
}

LinkQueue.h

#ifndef _LinkQueue_H_
#define _LinkQueue_H_
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
typedef int elemtype;
//节点结构体
typedef struct node
{
    elemtype data;
    struct node * next;
} LinkNode;
//队头队尾指针
typedef struct
{
    LinkNode * headq;
    LinkNode * endq;
} LinkQueue;

LinkNode * CreateNode();
LinkQueue * DefaultLinkQueue();
int IsEmpty(LinkQueue * Q);
void InQueue(LinkQueue * Q,elemtype x);
int OutQueue(LinkQueue * Q,elemtype * x);
int GetHeadQueue(LinkQueue * Q,elemtype * x);
int LenQueue(LinkQueue * Q);
void CleanQueue(LinkQueue * Q);

#endif

LinkQueue.c

#include"LinkQueue.h"

LinkNode * CreateNode()
{
    LinkNode * P;
    P=(LinkNode *)malloc(sizeof(LinkNode));
    P->next=NULL;
    return P;
}

LinkQueue * DefaultLinkQueue()
{
    LinkQueue * Q;
    Q=(LinkQueue *)malloc(sizeof(LinkQueue));
    Q->headq=CreateNode();
    Q->endq=Q->headq;
    return Q;
}

int IsEmpty(LinkQueue * Q)
{
    return Q->endq==Q->headq;
}

void InQueue(LinkQueue * Q,elemtype x)
{
    LinkNode * P=CreateNode();
    P->data=x;
    Q->endq->next=P;
    Q->endq=P;
}

int OutQueue(LinkQueue * Q,elemtype * x)
{
    if(IsEmpty(Q))
    {
        return 0;
    }
    LinkNode * P=Q->headq;
    *x=Q->headq->next->data;
    Q->headq=Q->headq->next;
    free(P);
    return 1;
}
int GetHeadQueue(LinkQueue * Q,elemtype * x)
{
    if(IsEmpty(Q))
    {
        return 0;
    }
    *x=Q->headq->next->data;
    return 1;
}
int LenQueue(LinkQueue * Q)
{
    int i=0;
    LinkNode * P=Q->headq;
    while(P!=Q->endq)
    {
        i++;
        P=P->next;
    }
    return i;
}
void CleanQueue(LinkQueue * Q)
{
    LinkNode * P=Q->headq;
    while(P!=Q->endq)
    {
		P=Q->headq;
        Q->headq=P->next;
        free(P);
    }
}