链表C语言简单实现

使用C语言完成的链表,分成linkQueue.h,和linkQueue.c两个文件,后附有测试文件main.c

linkQueue.h

#ifndef LINKQUEUE_H
#define LINKQUEUE_H

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//定义宏常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define OVERFLOW -1
//设置一个数据类型
typedef int QElemType;
//链式结构体
typedef struct QNode
{
	QElemType data;
	struct QNode * next;
}QNode;
typedef QNode* QueuePtr;
//队列结构体
typedef struct
{
	QueuePtr front;		//头指针
	QueuePtr rear;		//尾指针
	int queuesize;       //队列长度
}LinkQueue;				//队列的链式存储表示

/*链队列函数列表*/
int InitQueue(LinkQueue *Q);	//初始化队列

void ClearQueue(LinkQueue *Q);	//置空Q

void DestroyQueue(LinkQueue *Q);	//销毁Q

int QueueEmpty(LinkQueue Q);	//判断Q是否为空

int QueueLength(LinkQueue Q);	//返回Q元素的个数

int GetHead(LinkQueue Q,QElemType *e);	//获取队头元素

int EnQueue(LinkQueue *Q,QElemType e);	//元素e入队

int DeQueue(LinkQueue *Q,QElemType *e);	//元素e出队

void QueueTraverse(LinkQueue Q, void(visit)(QElemType));	//访问元素

#endif

 

linkQueue.c

 

/***************************************
author:e-dawn
mail:fd34343@126.com
blog:e-dawn.github.io
desc:队列的链表实现函数

**************************************/

#include "linkQueue.h"

/*
return:
	OK:表示初始化成功
parm:
	*Q:表示要开辟的空间的队列的地址

*/
int InitQueue(LinkQueue *Q)
{
    assert(NULL != Q);

    Q->front = Q->rear = NULL;
    Q->queuesize = 0;
    return OK;
}

/*
return:
	无
parm:
	*Q:要清空的队列

*/
void ClearQueue(LinkQueue *Q)
{
    assert(NULL != Q);
	//释放已分配空间
    QueuePtr p = Q->front;
    while(NULL != p)
    {
        QueuePtr q = p->next;
        free(p);
        p = q;
    }
	//置空
    Q->front = Q->rear = NULL;
    Q->queuesize = 0;
}
/*
return:
	无
parm:
	*Q:要销毁的队列

*/
void DestroyQueue(LinkQueue *Q)
{
    assert(NULL != Q);

    ClearQueue(Q);
    Q = NULL;
}

/*
return:
	TRUE:为空
	FALSE:表示非空
parm:
	*Q:表示要判断的队列

*/
int QueueEmpty(LinkQueue Q)
{
    if(Q.front == Q.rear)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}


/*
return:
	队列的元素个数
parm:
	*Q:要获得个数的队列

*/
int QueueLength(LinkQueue Q)
{
    return Q.queuesize;
}
/*
return:
	OK:表示取队首元素成功
	ERROR:表示取队首元素失败
parm:
	*Q:表示要队列
	*e:存放队列首元素的变量
*/
int GetHead(LinkQueue Q,QElemType *e)
{
    if(NULL == Q.front)
    {
        printf("Q is empty!\n");
        return *e = ERROR;
    }
    else
    {
        *e = Q.front->data;
    }
    return OK;
}
/*
return:
	OK:表示入队成功
	OVERFLOW:表示入队失败
parm:
	*Q:表示队列
	e:表示要入队的元素
*/
int EnQueue(LinkQueue *Q,QElemType e)
{
    assert(NULL != Q);

    QueuePtr p = (QueuePtr) malloc( sizeof(QNode) );
	if(NULL == p)
	{
		printf("init memory overflow\n");
		return	OVERFLOW;
	}

	p->data = e;
	p->next = NULL;

	if(Q->rear == NULL)
    {
        Q->front = Q->rear = p;
    }
    else
    {
        Q->rear->next = p;
        Q->rear = p;
    }

    Q->queuesize++;
    return OK;
}
/*
return:
	OK:表示出队成功
	ERROR:表示出队失败
parm:
	*Q:表示要出队的队列
*/
int DeQueue(LinkQueue *Q,QElemType *e)
{
    assert(NULL != Q);

    if(NULL == Q->front)
    {
        printf("Q is empty!\n");
        return *e = ERROR;
    }
	//front指向下一个结点
    *e = Q->front->data;
    QueuePtr p = Q->front->next;
	
    free(Q->front);
    Q->queuesize--;
    
	Q->front = p;
	
    return OK;
}
/*
return:
	无
parm:
	*Q:表示要遍历的队列
*/
void QueueTraverse(LinkQueue Q, void(visit)(QElemType))
{
    QueuePtr p = Q.front;
    while(NULL != p)
    {
        visit(p->data);
        p = p->next;
    }
}

测试代码main.c

#include "linkQueue.h"

void visit(QElemType e)
{
    printf("%d\n", e);
}


int main()
{
    LinkQueue q;
    InitQueue(&q);
    puts("队列是否为空");
    printf("%s\n", QueueEmpty(q) ? "is empty" : "is not empty");
    puts("当前队列长度");
    printf("%d\n", QueueLength(q));

    printf("Please input 6 elements:\n");
    int i,e;
    for(i = 0; i < 6; i++)
    {
        scanf("%d", &e);
        EnQueue(&q, e);
        puts("当前队列长度");
        printf("%d\n", QueueLength(q));
    }

    QueueTraverse(q, visit);

    puts("删除元素");
    for(i = 0; i < 2; i++)
    {
        DeQueue(&q, &e);
        puts("删除元素的值为:\n");
        printf("%d\n", e);
    }

    puts("当前队列长度");
    printf("%d\n", QueueLength(q));

    puts("当前栈顶:");
    GetHead(q, &e);
    printf("%d\n", e);

    puts("请空队列中");
    ClearQueue(&q);

    puts("当前队列长度");
    printf("%d\n", QueueLength(q));

    puts("当前栈顶:");
    GetHead(q, &e);
    printf("%d\n", e);

    puts("队列是否为空");
    printf("%s\n", QueueEmpty(q) ? "is empty" : "is not empty");

    puts("销毁队列中");
    DestroyQueue(&q);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值