链表学习笔记
链表学习笔记

链表学习笔记

记录一些链表常用案例

通过链表将无限多的测量结果排序,最终输出到表格文件,代码如下所示。

#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;
}