目录:

  • 代码:
  • 分析:
  • 汇编:

代码:

LinkList.h

#ifndef _LINKLIST_H_
#define _LINKLIST_H_typedef void LinkList; //定义线性表类型
typedef struct _tag_LinkListNode LinkListNode;//定义线性表节点类型
struct _tag_LinkListNode
{LinkListNode* next;//节点指针指向下一个节点
};LinkList* LinkList_Create();//声明定义顺序表函数void LinkList_Destroy(LinkList* list);//声明顺序表销毁函数void LinkList_Clear(LinkList* list);//声明顺序表清空函数int LinkList_Length(LinkList* list);//声明获取顺序表长度函数int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);//声明线性表插入节点函数LinkListNode* LinkList_Get(LinkList* list, int pos);//声明线性表获取节点函数LinkListNode* LinkList_Delete(LinkList* list, int pos); //声明线性表删除节点函数#endif

LinkList.c

#include <stdio.h>
#include <malloc.h>
#include "LinkList.h"typedef struct _tag_LinkList //定义实际应用的线性表类型
{//(重点:要把节点放在结构体的第一个元素,因为后面指针类型转换用到,要不然运行出错)LinkListNode header;//头节点 int length; //长度
} TLinkList;LinkList* LinkList_Create() //  定义顺序表函数
{TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));//申请空间只申请一个节点与长度if( ret != NULL ){ret->length = 0;ret->header.next = NULL;//只有一个节点}return ret;
}void LinkList_Destroy(LinkList* list) //   定义顺序表销毁函数
{free(list);
}void LinkList_Clear(LinkList* list) //   定义顺序表清空函数
{TLinkList* sList = (TLinkList*)list;if( sList != NULL ){sList->length = 0;sList->header.next = NULL;}
}int LinkList_Length(LinkList* list) //   定义获取顺序表长度函数
{TLinkList* sList = (TLinkList*)list;int ret = -1;if( sList != NULL ){ret = sList->length;}return ret;
}int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) // 定义线性表插入节点函数
{ TLinkList* sList = (TLinkList*)list;int ret = (sList != NULL) && (pos >= 0) && (node != NULL); //判断是否为空与pos有效与节点不为空int i = 0;if( ret ){LinkListNode* current = (LinkListNode*)sList; //指向头节点for(i=0; (i<pos) && (current->next != NULL); i++)//找到插入位置节点的前一个节点{current = current->next;}node->next = current->next; //新节点的next指向插入位置前一个节点的nextcurrent->next = node;//插入位置前一个节点的next指向新节点sList->length++; //长度++}return ret;
}LinkListNode* LinkList_Get(LinkList* list, int pos) //  定义线性表获取节点函数
{TLinkList* sList = (TLinkList*)list;LinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判断表不为空,pos在范围内{LinkListNode* current = (LinkListNode*)sList;//指向头节点for(i=0; i<pos; i++) //找到获取节点前一个节点{current = current->next;}ret = current->next;//取得获取节点}return ret;
}LinkListNode* LinkList_Delete(LinkList* list, int pos) //  定义线性表删除节点函数
{TLinkList* sList = (TLinkList*)list;LinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判断表不为空,pos在范围内{LinkListNode* current = (LinkListNode*)sList;//指向头节点for(i=0; i<pos; i++)//找到删除节点前一个节点{current = current->next;}ret = current->next; //取得删除节点current->next = ret->next;// 删除的前一个节点的next指向删除节点的下一个节点sList->length--;//长度--}return ret;
}

lmain.c

#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"struct Value
{LinkListNode header;int v;
};int main(int argc, char *argv[])
{int i = 0;LinkList* list = LinkList_Create();struct Value v1;struct Value v2;struct Value v3;struct Value v4;struct Value v5;v1.v = 1;v2.v = 2;v3.v = 3;v4.v = 4;v5.v = 5;LinkList_Insert(list, (LinkListNode*)&v1, LinkList_Length(list));LinkList_Insert(list, (LinkListNode*)&v2, LinkList_Length(list));LinkList_Insert(list, (LinkListNode*)&v3, LinkList_Length(list));LinkList_Insert(list, (LinkListNode*)&v4, LinkList_Length(list));LinkList_Insert(list, (LinkListNode*)&v5, LinkList_Length(list));FILE* fp = fopen("ad.dat", "wb");fwrite(list, sizeof(LinkList*), 1, fp);fclose(fp);/* for(i=0; i<LinkList_Length(list); i++){struct Value* pv = (struct Value*)LinkList_Get(list, i);printf("%d\n", pv->v);}while( LinkList_Length(list) > 0 ){struct Value* pv = (struct Value*)LinkList_Delete(list, 0);printf("%d\n", pv->v);}*/LinkList_Destroy(list);getchar();return 0;
}

分析:






汇编:










线性表(代码、分析、汇编)相关推荐

  1. Mr.J--C语言头函数的建立(附严薇敏《数据结构》线性表代码)

    如何正确编写 C 语言头文件和与之相关联的 c 源程序文件 查看此文章需要有一定的C语言编程基础 首先就要了解它们的各自功能.要理解C 文件与头文件(即.h)有什么 不同之处,首先需要弄明白编译器的工 ...

  2. 王道_线性表代码合集

    线性表 线性表的基本操作 InitList(&L) //初始化表,构造一个空的线性表Length(L) //求表长,返回线性表L长度LocateElem(L,e) //按值查找操作,在表L中查 ...

  3. 数据结构开发(3):线性表的顺序存储结构

    0.目录 1.线性表的本质和操作 2.线性表的顺序存储结构 3.顺序存储结构的抽象实现和具体实现 3.1 SeqList 3.2 StaticList 和 DynamicList 4.顺序存储线性表的 ...

  4. 线性表之简介及顺序表

    线性表的本质 线性表的定义:线性表是具有相同类型的 n( ≥0)个数据元素的有限序列.((a1, a2, -, an)ai 是表项,n 是表长度.) 线性表(List)是零个或多个数据元素的集合. 线 ...

  5. 线性表之顺序存储结构

    第三章 线性表:零个或多个数据元素的有限序列. 若将线性表标记为(a1,a2,...ai-1,ai,ai+1,...,an), 当i=1,2,...n-1时,ai有且仅有一个直接后继, 当i=2,3, ...

  6. Algorithms_基础数据结构(01)_线性表之数组数组的应用案例分析

    文章目录 大纲图 数组的经典面试题目 数据结构三要素 数据逻辑结构(线性结构&非线性结构) 数据存储结构(顺序存储.链式存储.索引存储和散列存储) 顺序存储 链式存储 索引存储 散列存储 数据 ...

  7. 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

  8. Linux内核汇编代码分析

    Linux内核汇编代码分析 1.vmlinux.lds.S文件分析 1.2 vmlinux.lds.S文件总体框架 1.3 代码段 1.4 只读数据段 1.5 init段 1.6 数据段 1.7 未初 ...

  9. 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验目的: 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 实验过程: 通过vi程序进行编程: int g(int x) { return x + 3; } int f(int x) ...

最新文章

  1. 一个简单的配置管理器(SettingManager)
  2. 云原生生态周报 Vol. 16 | CNCF 归档 rkt,容器运行时“上古”之战老兵凋零
  3. Java线程start()vs run()方法及示例
  4. 关于 nohup 执行命令以后 需要再按回车才能起效的解决办法
  5. 常用的几个提高iOS开发效率的开源类库及工具
  6. 解决行内块元素(inline-block)之间的空格或空白问题
  7. css不继承上级样式_CSS基础知识(一)
  8. WebDriver与浏览器版本对应关系
  9. word自动编号与文字间距太大怎么办
  10. 沁恒CH341是一个USB总线的转接芯片
  11. 转载:解决采集UTF-8网页空格变成问号乱码
  12. 现代大学英语精读第二版(第四册)学习笔记(原文及全文翻译)——16B - Is Everybody Happy?(人人都幸福吗?)
  13. 咸鱼菌玩3D—投影基础
  14. 若某非空二叉树的先序序列和后序序列正好相反,或者正好相同,则二叉树形态是怎么样的?
  15. 网页设计教程:从设计到制作过程
  16. Java 2、8、16进制概述和由来
  17. java获取前五分钟时间,java计算下一个整5分钟时间点
  18. 小酌Django2——博客文章发布
  19. JavaScript_正则表达式
  20. 有哪些常见的游戏建模软件?游戏建模师的工作日常

热门文章

  1. JavaScript的arguments及其子对象
  2. Background-size完美兼容IE
  3. GT sport赛道详解 - Dragon Trail | 龙之径
  4. Leetcode 565. Array Nesting
  5. Mongo 查询(可视化工具)
  6. 返回一个二维整数数组最大子数组的和
  7. 3.4 内置函数(1)
  8. MySQL学习笔记1(增删查改)
  9. hihocoder1543 SCI表示法
  10. YTU 2903: A--A Repeating Characters