记录一些链表常用案例
通过链表将无限多的测量结果排序,最终输出到表格文件,代码如下所示。
#include <stdio.h>
#include <malloc.h>
/*********************************************************************************************************
* 宏定义
*********************************************************************************************************/
#define OUTPUT_NAME "result.csv"
/*********************************************************************************************************
* 枚举结构体定义
*********************************************************************************************************/
typedef struct
{
double press;
double vpp;
void* next;
}StructResultItem;
/*********************************************************************************************************
* 内部变量
*********************************************************************************************************/
static StructResultItem* s_structResultHead = NULL;
/*********************************************************************************************************
* 内部函数声明
*********************************************************************************************************/
static void AddResult(double press, double vpp); //新添一个测量结果
static void SaveResult(void); //将结果输出
/*********************************************************************************************************
* 函数名称: AddResult
* 函数功能: 新添一个测量结果
* 输入参数: void
* 输出参数: void
* 返 回 值: void
* 创建日期: 2023年08月18日
* 注 意: 链表按照升序排序
*********************************************************************************************************/
static void AddResult(double press, double vpp)
{
StructResultItem* newItem;
StructResultItem* node;
StructResultItem* next;
//为新项目申请动态内存
newItem = malloc(sizeof(StructResultItem));
if (NULL == newItem)
{
printf("Falt to maooc for new item\r\n");
while(1){}
}
//装填数据
newItem->press = press;
newItem->vpp = vpp;
newItem->next = NULL;
//表头为空,直接插入到表头
if (NULL == s_structResultHead)
{
s_structResultHead = newItem;
s_structResultHead->next = NULL;
return;
}
//测量值最小,添加到表头
if (newItem->press <= s_structResultHead->press)
{
node = s_structResultHead;
s_structResultHead = newItem;
s_structResultHead->next = node;
return;
}
//插入链表中
node = s_structResultHead;
while (NULL != node)
{
//先保存下一项
next = node->next;
//遇到了表尾,直接添加到表尾
if (NULL == next)
{
node->next = newItem;
return;
}
//找到了合适的节点
else if ((newItem->press >= node->press) && (newItem->press <= next->press))
{
newItem->next = node->next;
node->next = newItem;
return;
}
//迭代到下一项
node = next;
}
}
/*********************************************************************************************************
* 函数名称: SaveResult
* 函数功能: 将结果输出到表格文件
* 输入参数: void
* 输出参数: void
* 返 回 值: void
* 创建日期: 2023年08月18日
* 注 意: 输出后,链表所有单元都会被释放
*********************************************************************************************************/
static void SaveResult(void)
{
FILE* file;
StructResultItem* node;
StructResultItem* next;
//无数据需要保存,直接返回
if (NULL == s_structResultHead)
{
return;
}
//创建表格文件
file = fopen(OUTPUT_NAME, "w");
//获取表头
node = s_structResultHead;
//循环迭代写入
while (NULL != node)
{
fprintf(file, "%f,%f\n", node->press, node->vpp);
node = node->next;
}
//保存
fclose(file);
//释放动态内存
node = s_structResultHead;
while (NULL != node)
{
next = node->next;
free(node);
node = next;
}
s_structResultHead = NULL;
}