链表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;
}

 

潮汐研究作为海洋科学的关键分支,融合了物理海洋学、地理信息系统及水利工程等多领域知识。TMD2.05.zip是一套基于MATLAB环境开发的潮汐专用分析工具集,为科研人员与工程实践者提供系统化的潮汐建模与计算支持。该工具箱通过模块化设计实现了两大核心功能: 在交互界面设计方面,工具箱构建了图形化操作环境,有效降低了非专业用户的操作门槛。通过预设参数输入模块(涵盖地理坐标、时间序列、测站数据等),用户可自主配置模型运行条件。界面集成数据加载、参数调整、可视化呈现及流程控制等标准化组件,将复杂的数值运算过程转化为可交互的操作流程。 在潮汐预测模块中,工具箱整合了谐波分解法与潮流要素解析法等数学模型。这些算法能够解构潮汐观测数据,识别关键影响要素(包括K1、O1、M2等核心分潮),并生成不同时间尺度的潮汐预报。基于这些模型,研究者可精准推算特定海域的潮位变化周期与振幅特征,为海洋工程建设、港湾规划设计及海洋生态研究提供定量依据。 该工具集在实践中的应用方向包括: - **潮汐动力解析**:通过多站点观测数据比对,揭示区域主导潮汐成分的时空分布规律 - **数值模型构建**:基于历史观测序列建立潮汐动力学模型,实现潮汐现象的数字化重构与预测 - **工程影响量化**:在海岸开发项目中评估人工构筑物对自然潮汐节律的扰动效应 - **极端事件模拟**:建立风暴潮与天文潮耦合模型,提升海洋灾害预警的时空精度 工具箱以"TMD"为主程序包,内含完整的函数库与示例脚本。用户部署后可通过MATLAB平台调用相关模块,参照技术文档完成全流程操作。这套工具集将专业计算能力与人性化操作界面有机结合,形成了从数据输入到成果输出的完整研究链条,显著提升了潮汐研究的工程适用性与科研效率。 资源来源于网络分享,仅用于学习交流使用,勿用于商业,如有侵权联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值