【海贼王的数据航海:利用数据结构成为数据海洋的霸主】顺序表

目录

1 -> 线性表

2 -> 顺序表

2.1 -> 概念及结构

2.2 -> 接口声明

2.3 -> 接口实现

2.3.1 -> 初始化

2.3.2 -> 销毁

2.3.3 -> 检查

2.3.4 -> 打印

2.3.5 -> 尾插

2.3.6 -> 头插

2.3.7 -> 尾删

2.3.8 -> 头删

2.3.9 -> 在pos位置插入x

2.3.10 -> 删除pos位置的值

2.3.11 -> 查找

2.3.12 -> 修改

3 -> 完整代码

3.1 -> SeqList.h

3.2 -> SeqList.c

3.3 -> Test.c


1 -> 线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串……

线性表在逻辑上是线性结构,也就是说它是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

2 -> 顺序表

2.1 -> 概念及结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删改查。

顺序表一般可以分为:

1. 静态顺序表:使用定长数组存储元素。

2. 动态顺序表:使用动态开辟的数组存储。

2.2 -> 接口声明

静态顺序表只适用于已知需要多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以实现动态顺序表。

#pragma once#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>// 顺序表的动态存储
typedef int SLDateType;typedef struct SeqList
{//	指向动态开辟的数组SLDateType* a;// 有效数据个数int size;// 容量空间大小int capacity;
}SL;// 对数据的管理:增删查改 // 顺序表初始化
void SLInit(SL* psl);// 顺序表销毁
void SLDestroy(SL* psl);// 顺序表检查,满则增容
void SLCheckCapacity(SL* psl);// 顺序表打印
void SLPrint(SL* psl);// 顺序表尾插
void SLPushBack(SL* psl, SLDateType x);// 顺序表头插
void SLPushFront(SL* psl, SLDateType x);// 顺序表尾删
void SLPopBack(SL* psl);// 顺序表头删
void SLPopFront(SL* psl);// 顺序表在pos位置插入x
void SLInsert(SL* psl, int pos, SLDateType x);// 顺序表删除pos位置的值
void SLErase(SL* psl, int pos);// 顺序表查找,找到返回下标,找不到返回-1
int SLFind(SL* psl, SLDateType x);// 顺序表修改
void SLModify(SL* psl, int pos, SLDateType x);

2.3 -> 接口实现

2.3.1 -> 初始化

// 顺序表初始化
void SLInit(SL* psl)
{psl->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);if (psl->a == NULL){perror("malloc fail");return;}psl->capacity = 4;psl->size = 0;
}

2.3.2 -> 销毁

// 顺序表销毁
void SLDestroy(SL* psl)
{free(psl->a);psl->a = NULL;psl->capacity = 0;psl->size = 0;
}

2.3.3 -> 检查

// 顺序表检查,满则增容
void SLCheckCapacity(SL* psl)
{if (psl->size == psl->capacity){SLDateType* tmp = (SLDateType*)realloc(psl->a, sizeof(SLDateType) * psl->capacity * 2);if (tmp == NULL){perror("realloc fail");return;}psl->a = tmp;psl->capacity *= 2;}
}

2.3.4 -> 打印

// 顺序表打印
void SLPrint(SL* psl)
{for (int i = 0; i < psl->size; i++){printf("%d ", psl->a[i]);}printf("\n");
}

2.3.5 -> 尾插

// 顺序表尾插
void SLPushBack(SL* psl, SLDateType x)
{SLCheckCapacity(psl);psl->a[psl->size++] = x;//复用//SLInsert(psl, psl->size - 1, x);
}
// 尾插测试
void SLTest1()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPrint(&s);SLDestroy(&s);
}

 

2.3.6 -> 头插

// 顺序表头插
void SLPushFront(SL* psl, SLDateType x)
{SLCheckCapacity(psl);int end = psl->size - 1;while (end >= 0){psl->a[end + 1] = psl->a[end];--end;}psl->a[0] = x;psl->size++;//复用//SLInsert(psl, 0, x);
}
// 头插测试
void SLTest2()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushFront(&s, 4);SLPushFront(&s, 5);SLPushFront(&s, 6);SLPrint(&s);SLDestroy(&s);
}

 

2.3.7 -> 尾删

// 顺序表尾删
void SLPopBack(SL* psl)
{// 暴力的检查assert(psl->size > 0);// 温柔的检查/*if (psl->size == 0)return;*/psl->size--;//复用//SLErase(psl, psl->size - 1);
}
// 尾删测试
void SLTest3()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushFront(&s, 4);SLPushFront(&s, 5);SLPushFront(&s, 6);SLPrint(&s);SLPopBack(&s);SLPopBack(&s);SLPopBack(&s);SLPrint(&s);SLDestroy(&s);
}

 

2.3.8 -> 头删

// 顺序表头删
void SLPopFront(SL* psl)
{assert(psl->size > 0);int start = 1;while (psl->a[start] < psl->size){psl->a[start - 1] = psl->a[start];start++;}psl->size--;//复用//SLErase(psl, 0);
}
// 头删测试
void SLTest4()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushFront(&s, 4);SLPushFront(&s, 5);SLPushFront(&s, 6);SLPrint(&s);SLPopFront(&s);SLPopFront(&s);SLPopFront(&s);SLPrint(&s);SLDestroy(&s);
}

 

2.3.9 -> 在pos位置插入x

// 顺序表在pos位置插入x
// 头插、尾插可复用此
void SLInsert(SL* psl, int pos, SLDateType x)
{assert(0 <= pos && pos <= psl->size);SLCheckCapacity(psl);int end = psl->size - 1;while (end >= pos){psl->a[end + 1] = psl->a[end];--end;}psl->a[pos] = x;psl->size++;
}
// 任意位置插入测试
void SLTest5()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushFront(&s, 4);SLPushFront(&s, 5);SLPushFront(&s, 6);SLPrint(&s);SLInsert(&s, 1, 99);SLInsert(&s, 3, 22);SLPrint(&s);SLDestroy(&s);
}

 

2.3.10 -> 删除pos位置的值

// 顺序表删除pos位置的值
// 头删、尾删可复用此
void SLErase(SL* psl, int pos)
{assert(0 <= pos && pos < psl->size);assert(psl->size > 0);int start = pos + 1;while (start < psl->size){psl->a[start - 1] = psl->a[start];++start;}psl->size--;
}
// 任意位置删除测试
void SLTest6()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPushBack(&s, 6);SLPrint(&s);SLErase(&s, 2);SLErase(&s, 4);SLPrint(&s);SLDestroy(&s);
}

 

2.3.11 -> 查找

// 顺序表查找
int SLFind(SL* psl, SLDateType x)
{for (int i = 0; i < psl->size; i++){if (psl->a[i] == x)return i;}return -1;
}
// 查找测试
void SLTest7()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPushBack(&s, 6);SLPrint(&s);int ans1 = SLFind(&s, 2);int ans2 = SLFind(&s, 6);printf("%d\n%d", ans1, ans2);SLDestroy(&s);
}

 

2.3.12 -> 修改

// 顺序表修改
void SLModify(SL* psl, int pos, SLDateType x)
{assert(0 <= pos && pos < psl->size);psl->a[pos] = x;
}
// 修改测试
void SLTest8()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPushBack(&s, 6);SLPrint(&s);SLModify(&s, 2, 99);SLModify(&s, 0, 11);SLPrint(&s);SLDestroy(&s);
}

3 -> 完整代码

3.1 -> SeqList.h

#pragma once#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>// 顺序表的动态存储
typedef int SLDateType;typedef struct SeqList
{//	指向动态开辟的数组SLDateType* a;// 有效数据个数int size;// 容量空间大小int capacity;
}SL;// 对数据的管理:增删查改 // 顺序表初始化
void SLInit(SL* psl);// 顺序表销毁
void SLDestroy(SL* psl);// 顺序表检查,满则增容
void SLCheckCapacity(SL* psl);// 顺序表打印
void SLPrint(SL* psl);// 顺序表尾插
void SLPushBack(SL* psl, SLDateType x);// 顺序表头插
void SLPushFront(SL* psl, SLDateType x);// 顺序表尾删
void SLPopBack(SL* psl);// 顺序表头删
void SLPopFront(SL* psl);// 顺序表在pos位置插入x
void SLInsert(SL* psl, int pos, SLDateType x);// 顺序表删除pos位置的值
void SLErase(SL* psl, int pos);// 顺序表查找,找到返回下标,找不到返回-1
int SLFind(SL* psl, SLDateType x);// 顺序表修改
void SLModify(SL* psl, int pos, SLDateType x);

3.2 -> SeqList.c

#include "SeqList.h"// 顺序表初始化
void SLInit(SL* psl)
{psl->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);if (psl->a == NULL){perror("malloc fail");return;}psl->capacity = 4;psl->size = 0;
}// 顺序表销毁
void SLDestroy(SL* psl)
{free(psl->a);psl->a = NULL;psl->capacity = 0;psl->size = 0;
}// 顺序表检查,满则增容
void SLCheckCapacity(SL* psl)
{if (psl->size == psl->capacity){SLDateType* tmp = (SLDateType*)realloc(psl->a, sizeof(SLDateType) * psl->capacity * 2);if (tmp == NULL){perror("realloc fail");return;}psl->a = tmp;psl->capacity *= 2;}
}// 顺序表打印
void SLPrint(SL* psl)
{for (int i = 0; i < psl->size; i++){printf("%d ", psl->a[i]);}printf("\n");
}// 顺序表尾插
void SLPushBack(SL* psl, SLDateType x)
{SLCheckCapacity(psl);psl->a[psl->size++] = x;//复用//SLInsert(psl, psl->size - 1, x);
}// 顺序表头插
void SLPushFront(SL* psl, SLDateType x)
{SLCheckCapacity(psl);int end = psl->size - 1;while (end >= 0){psl->a[end + 1] = psl->a[end];--end;}psl->a[0] = x;psl->size++;//复用//SLInsert(psl, 0, x);
}// 顺序表尾删
void SLPopBack(SL* psl)
{// 暴力的检查assert(psl->size > 0);// 温柔的检查/*if (psl->size == 0)return;*/psl->size--;//复用//SLErase(psl, psl->size - 1);
}// 顺序表头删
void SLPopFront(SL* psl)
{assert(psl->size > 0);int start = 1;while (psl->a[start] < psl->size){psl->a[start - 1] = psl->a[start];start++;}psl->size--;//复用//SLErase(psl, 0);
}// 顺序表在pos位置插入x
// 头插、尾插可复用此
void SLInsert(SL* psl, int pos, SLDateType x)
{assert(0 <= pos && pos <= psl->size);SLCheckCapacity(psl);int end = psl->size - 1;while (end >= pos){psl->a[end + 1] = psl->a[end];--end;}psl->a[pos] = x;psl->size++;
}// 顺序表删除pos位置的值
// 头删、尾删可复用此
void SLErase(SL* psl, int pos)
{assert(0 <= pos && pos < psl->size);assert(psl->size > 0);int start = pos + 1;while (start < psl->size){psl->a[start - 1] = psl->a[start];++start;}psl->size--;
}// 顺序表查找
int SLFind(SL* psl, SLDateType x)
{for (int i = 0; i < psl->size; i++){if (psl->a[i] == x)return i;}return -1;
}// 顺序表修改
void SLModify(SL* psl, int pos, SLDateType x)
{assert(0 <= pos && pos < psl->size);psl->a[pos] = x;
}

3.3 -> Test.c

#include "SeqList.h"// 尾插测试
void SLTest1()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPrint(&s);SLDestroy(&s);
}// 头插测试
void SLTest2()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushFront(&s, 4);SLPushFront(&s, 5);SLPushFront(&s, 6);SLPrint(&s);SLDestroy(&s);
}// 尾删测试
void SLTest3()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushFront(&s, 4);SLPushFront(&s, 5);SLPushFront(&s, 6);SLPrint(&s);SLPopBack(&s);SLPopBack(&s);SLPopBack(&s);SLPrint(&s);SLDestroy(&s);
}// 头删测试
void SLTest4()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushFront(&s, 4);SLPushFront(&s, 5);SLPushFront(&s, 6);SLPrint(&s);SLPopFront(&s);SLPopFront(&s);SLPopFront(&s);SLPrint(&s);SLDestroy(&s);
}// 任意位置插入测试
void SLTest5()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushFront(&s, 4);SLPushFront(&s, 5);SLPushFront(&s, 6);SLPrint(&s);SLInsert(&s, 1, 99);SLInsert(&s, 3, 22);SLPrint(&s);SLDestroy(&s);
}// 任意位置删除测试
void SLTest6()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPushBack(&s, 6);SLPrint(&s);SLErase(&s, 2);SLErase(&s, 4);SLPrint(&s);SLDestroy(&s);
}// 查找测试
void SLTest7()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPushBack(&s, 6);SLPrint(&s);int ans1 = SLFind(&s, 2);int ans2 = SLFind(&s, 6);printf("%d\n%d", ans1, ans2);SLDestroy(&s);
}// 修改测试
void SLTest8()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPushBack(&s, 6);SLPrint(&s);SLModify(&s, 2, 99);SLModify(&s, 0, 11);SLPrint(&s);SLDestroy(&s);
}int main()
{return 0;
}

感谢各位大佬支持!!!

互三啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2808854.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C习题001:顺子日期【仅供参考】

题目&#xff1a;小明特别喜欢顺子。顺子指的是连续的三个数字&#xff1a;123、456等。顺子日期指的就是在日期的yyyymmdd表示法中&#xff0c;存在任意连续的三位数是一个顺子的日期。例如20220123就是一个顺子日期&#xff0c;因为它出现了一个顺子&#xff1a;123&#xff…

Langchain-Chatchat部署总结

项目地址&#xff1a; https://github.com/chatchat-space/Langchain-Chatchat 整体安装比较方便&#xff0c;在阿里云购买云主机&#xff0c;购买的国外站点机器&#xff0c; 该项目运行最佳坏境为 Linux Ubuntu 22.04.5Python 版本 3.11.7CUDA 版本: 12.1torch2.1.2 使…

2024年怎么购买买 FL Studio 21最便宜

随着电子音乐的日益普及&#xff0c;越来越多的人开始尝试制作自己的音乐。而其中一个常用的音乐制作软件就是FL Studio。那么&#xff0c;对于刚入坑的萌新来说&#xff0c;如何选择FL Studio的版本呢&#xff1f; 很多打算入手正版FL Studio的新手朋友都会纠结一个问题&#…

【深度学习笔记】3_12 权重衰减

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 3.12 权重衰减 上一节中我们观察了过拟合现象&#xff0c;即模型的训练误差远小于它在测试集上的误差。虽然增大训练数据集可能会减轻…

445. 两数相加 II(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&am…

SpringBoot Admin 详解

SpringBoot Admin 详解 一、Actuator 详解1.Actuator原生端点1.1 监控检查端点&#xff1a;health1.2 应用信息端点&#xff1a;info1.3 http调用记录端点&#xff1a;httptrace1.4 堆栈信息端点&#xff1a;heapdump1.5 线程信息端点&#xff1a;threaddump1.6 获取全量Bean的…

人力资源管理信息化系统如何支持企业开展管理诊断

人力资源顾问有限公司致力于帮助企业开展人力资源管理方面的各项提升改进工作&#xff0c;在长期的咨询工作中&#xff0c;最常听到企业提到的问题莫过于管理诊断方面的问题&#xff0c;事实上&#xff0c;很多企业在日常工作中&#xff0c;都意识到企业内部存在管理方面的问题…

String类常用方法(Java)

String类的常见方法&#xff08;笔记&#xff09; 1. charAt(int index) 返回此字符串中指定索引处的字符。 String str "hello"; char ch str.charAt(1); // 获取字符串中索引为1的字符&#xff0c;结果为 e2. compareTo(String anotherString)按字典顺序比较两个…

蓝桥杯算法赛 第 6 场 小白入门赛 解题报告 | 珂学家 | 简单场 + 元宵节日快乐

前言 整体评价 因为适逢元宵节&#xff0c;所以这场以娱乐为主。 A. 元宵节快乐 题型: 签到 节日快乐&#xff0c;出题人也说出来自己的心愿, 祝大家AK快乐! import java.util.Scanner;public class Main {public static void main(String[] args) {System.out.println(&qu…

智能枪弹柜管理系统-智能枪弹管理系统DW-S306

随着社会的发展和治安形势的日益严峻&#xff0c;对于枪弹的管理变得尤为重要。传统的手工记录和存放方式已经无法满足现代化、高效化、安全化的需求。因此&#xff0c;智能枪弹柜管理系统应运而 生。 在建设万兆主干、千兆终端的监控专网的基础上&#xff0c;弹药库安全技术…

python实现线下缓存最优算法

对于现代计算机为了加快数据存储速度,一般会采用多级缓存的方法,以最简单的二级缓存来说,数据会存放在两个地方,一个地方就是存在内存当中,另一个存放的地方就是存放在硬盘当中,但是这两个地方数据读取的速度是完全不同的。 而CPU从内存中读取数据的速度是要远远快与从硬…

Python Web开发记录 Day3:BootStrap

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 三、BootStrap1、BootStrap-初体验2、BootStrap…

【论文精读】ConvNeXt

摘要 Vision Transformer是当前最先进的图像分类模型&#xff0c;但普通ViT在应用于一般计算机视觉任务&#xff08;如目标检测和语义分割&#xff09;时面临困难。故后来的分层Vision Transformer&#xff08;如Swin Transformer&#xff09;通过引入了几种卷积网络先验&#…

python程序设计基础:异常处理结构与程序调试、测试

第八章&#xff1a;异常处理结构与程序调试、测试 简单地说,异常是指程序运行时引发的错误,引发错误的原因有很多例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等。 如果这些错误得不到正确的处理将会导致程序终止运行,而合理…

抖音视频下载工具|视频内容提取软件

引言部分&#xff1a; 针对抖音视频下载需求&#xff0c;我们团队自豪推出一款功能强大的工具&#xff0c;旨在解决用户获取抖音视频繁琐问题的困扰。我们通过基于C#开发的工具&#xff0c;让用户能够轻松通过关键词搜索实现自动批量抓取视频&#xff0c;并根据需求进行选择性批…

MAC地址学习和老化

MAC地址学习过程 一般情况下&#xff0c;MAC地址表是设备根据收到的数据帧里的源MAC地址自动学习而建立的。 图1 MAC地址学习示意图 如图1&#xff0c;HostA向SwitchA发送数据时&#xff0c;SwitchA从数据帧中解析出源MAC地址&#xff08;即HostA的MAC地址&#xff09;和VLAN…

PMP项目管理考试要注意些什么?

PMP考试和PMP备考过程中应该注意哪些问题&#xff1f; PMP备考完成后就要迎接实战考试了&#xff0c;考试前千万不要有多余的想法&#xff0c;顺其自然就行了&#xff0c;我想大家各种紧张、各种忧虑的原因大抵是因为考试成本考&#xff0c;担心考不过&#xff0c;其实只要你在…

excel标记文本中的关键词加红加粗

任务&#xff1a; 有这么一张表&#xff0c;关键词为 word&#xff0c;文本内容为 text&#xff0c;现在想把 text 中的 word 标红加粗&#xff0c;如果数据量少&#xff0c;文本段手动标还可以&#xff0c;多起来就不太方便了 代码&#xff1a; import pandas as pd import x…

ChatGPT助您提升求职技能

目录 ChatGPT可以作为求职技能的学习和提升平台 ChatGPT可以帮助求职者提升沟通和表达能力 ChatGPT还可以帮助求职者提升问题解决能力和创新能力 ChatGPT还可以帮助求职者建立自信心和自我推销能力 随着科技的迅速发展&#xff0c;人们的生活方式和工作方式也在不断地变革。…

nginx高级配置详解

目录 一、网页的状态页 1、状态页的基本配置 2、搭配验证模块使用 3、结合白名单使用 二、nginx 第三方模块 1、echo模块 1.1 编译安装echo模块 1.2 配置echo模块 三、nginx变量 1、内置变量 2、自定义变量 四、自定义图标 五、自定义访问日志 1、自定义日志格式…