目录:

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

代码:

StaticList.h

#ifndef _STATICLIST_H_
#define _STATICLIST_H_typedef void StaticList; //空类型静态表类型可以接收任何类型的静态表类型
typedef void StaticListNode;//空类型节点类型可以接收任何类型的节点类型StaticList * StaticList_Create(int capacity);//声明静态表生成函数void StaticList_Destroy(StaticList * list);//声明静态表销毁函数void StaticList_Clear(StaticList * list);//声明静态表清空函数int StaticList_Length(StaticList * list);//声明获取静态表长度函数int StaticList_Capacity(StaticList * list);//声明获取静态表容量函数int StaticList_Insert(StaticList *list, StaticListNode * node, int pos);//声明静态表插入节点函数StaticListNode* StaticList_Get(StaticList * list, int pos);//声明静态表获取元素函数StaticListNode* StaticList_Delete(StaticList *list, int pos);//声明静态表删除节点函数#endif

StaticList.c

#include<stdio.h>
#include<malloc.h>
#include "StaticList.h"#define AVAILABLE -1  //控制节点是空闲typedef struct _tag_StaticListNode{unsigned int data; //节点存放数据 重点:该元素一定要放在结构体第一个,要不然获取时错误int next; //下一个节点的下标
}TStaticListNode;typedef struct _tag_StaticList{int capacity;//表的容量TStaticListNode header; //头节点存着当前长度(data)与第一个元素是在哪个节点的下标(next)TStaticListNode node[];  //是不占内存空间的}TStaticList;StaticList * StaticList_Create(int capacity){ //定义静态链表的创建函数TStaticList *ret = NULL;int i = 0;if (capacity >= 0){ret = (TStaticList*)malloc(sizeof(TStaticList)+sizeof(TStaticListNode)*(capacity + 1));}if (ret != NULL){//申请内存成功ret->capacity = capacity;//设置容量ret->header.data = 0;//当前长度ret->header.next = 0;//首节点下标for (i = 0; i <= capacity; i++){ //将全部节点设为空闲ret->node[i].next = AVAILABLE;}}return ret;
}void StaticList_Destroy(StaticList * list){//定义静态链表的销毁函数free(list);
}void StaticList_Clear(StaticList * list){//定义静态链表的清空函数TStaticList* sList = (TStaticList *)list;int i = 0;if (sList != NULL){//判断表不为空sList->header.data = 0; //重设为0sList->header.next = 0;//重设为0for (i = 1; i <= sList->capacity; i++){ //将全部节点设为空闲sList->node[i].next = AVAILABLE;}}
}int StaticList_Length(StaticList * list){ //定义获取静态链表当前长度函数TStaticList * sList = (TStaticList *)list;int ret = -1;if (sList != NULL){ret = sList->header.data;}return ret;
}int StaticList_Capacity(StaticList * list){//定义获取静态链表容量函数TStaticList * sList = (TStaticList*)list;int ret = -1;if (sList != NULL){ret = sList->capacity;}return ret;
}int StaticList_Insert(StaticList *list, StaticListNode * node, int pos){//定义静态链表的插入元素函数TStaticList * sList = (TStaticList*)list;int ret = (sList != NULL);int current = 0; //插入节点的上一个节点的下标int index = 0;//插入的数据在哪个节点(下标)int i = 0;ret = ret && (sList->header.data + 1 <= sList->capacity); //确保有节点存放ret = ret && (pos >= 0) && (node != NULL);//判断插入位置是否正确与节点是否正常if (ret){for (i = 1; i <= sList->capacity; i++){  //从第二个下标开始找到第一个出现next为-1的位置下标if (sList->node[i].next == AVAILABLE){ //找一个空的节点的下标index = i;break;}}sList->node[index].data = (unsigned int)node; //将新插入的元素地址转换存到该下标节点的datasList->node[0] = sList->header; //将表的头节点赋给数组首元素//根据next找到要插入节点的前一个节点//如果sList->node[current].next == 0 表示是最后一个节点for (i = 0; (i < pos) && (sList->node[current].next != 0); i++){current = sList->node[current].next;}sList->node[index].next = sList->node[current].next; //新插入的节点的next等于该节点前一个节点的nextsList->node[current].next = index;// 新插入节点的前一个节点的next等于新插入节点在数组中的下标sList->node[0].data++; //长度增加sList->header = sList->node[0];//将数组首元素赋给header(修改后的数据)}return ret;
}StaticListNode* StaticList_Get(StaticList * list, int pos){ //定义静态链表获取节点数据函数TStaticList* sList = (TStaticList*)list;StaticListNode* ret = NULL;int current = 0;int object = 0;int i = 0;if ((sList != NULL) && (0 <= pos) && (pos < sList->header.data)){ //判断表是否空,下标是否在范围之内sList->node[0] = sList->header;for (i = 0; i < pos; i++){  //找到要获取的节点的前一个节点的下标current = sList->node[current].next;}object = sList->node[current].next; //取得要获取的节点的下标ret = (StaticListNode*)(sList->node[object].data); //取得节点存放的数据转换成指针类型}return ret; //返回该指向的地址
}StaticListNode * StaticList_Delete(StaticList* list, int pos){//定义静态链表删除节点数据函数TStaticList* sList = (TStaticList*)list;StaticListNode* ret = NULL;int current = 0;int object = 0;int i = 0;if ((sList != NULL) && (0 <= pos) && (pos < sList->header.data)){//判断是否在范围内sList->node[0] = sList->header;for (i = 0; i < pos; i++){//找到要删除的节点的前一个节点的下标current = sList->node[current].next;}object = sList->node[current].next;//获取要删除的节点的下标sList->node[current].next = sList->node[object].next; //sList->node[0].data--;//长度减少sList->header = sList->node[0];//将数组首元素赋给header(修改后的数据)sList->node[object].next = AVAILABLE;//将该节点设为空闲的ret = (StaticListNode*)(sList->node[object].data);//取得删除节点存放的数据转换成指针类型}return ret;//返回该指向的地址
}

main.c

#include<stdio.h>
#include<stdlib.h>
#include"StaticList.h"int main(int argc,char *argv[]){StaticList *list = StaticList_Create(10);int index = 0;int i = 0;int j = 1;int k = 2;int x = 3;int y = 4;int z = 5;StaticList_Insert(list, &i, 0);StaticList_Insert(list, &j, 0);StaticList_Insert(list, &k, 0);for ( index = 0; index < StaticList_Length(list); index++){int *p = (int *)StaticList_Get(list, index);printf("%d\n", *p);}printf("\n");while (StaticList_Length(list)>0){int * p = (int *)StaticList_Delete(list, 0);printf("%d\n", *p);}printf("%d\n", StaticList_Length(list));getchar();return 1;
}

分析:







汇编:

















静态链表(代码、分析、汇编)相关推荐

  1. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

  2. linux内核中链表代码分析---list.h头文件分析(一)

    linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17:13:14 在学习数据结构时,有一个重要的知识点就是链表.对于链表的一些基本操作,它的最好学习资料就是内核中的li ...

  3. python面试题之有没有一个工具可以帮助查找python的bug和进行静态的代码分析?

    pycheck pylint 本文首发于python黑洞网,csdn同步更新

  4. 搞懂静态代码分析,看这文就够了!

    作者 | 赖建新 来源 | 鉴释 封图 | 东方IC 什么是静态代码分析? 静态代码分析是指在不实际执行程序的情况下,对代码语义和行为进行分析,由此找出程序中由于错误的编码导致异常的程序语义或未定义的 ...

  5. Linux内核汇编代码分析

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

  6. 静态链表实现(A-B)+(B-A)【代码】

    -----------------------------------------------第一次发代码,写在前面------------------------------------------ ...

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

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

  8. 软文推荐:常用 Java 静态代码分析工具的分析与比较

    http://www.uml.org.cn/j2ee/201107114.asp 常用 Java 静态代码分析工具的分析与比较 作者:赵卓 , 发布于2011-07-11 , IBM 简介: 本文首先 ...

  9. 使用SonarCloud对.NET Core项目进行静态代码分析

    本文将介绍如何使用SonarCloud进行.NET Core项目的静态代码分析.SonarCloud是SonarQube提供的基于云的版本,特别针对于开源项目是免费的. 首先,在sonarcloud. ...

最新文章

  1. ABAP的Package interface, 安卓的manifest.xml和Kubernetes的Capabilities
  2. mongoose的populate
  3. java 加法 溢出_java实现两个大数相加,可能出现溢出错误
  4. following symbols must have non local/private scope错误问题解决方法
  5. 抖音很火的失恋表白网页模板
  6. python怎么连接数据库并且查看数据是否存在_如何使用python连接数据库,插入并查询数据...
  7. oracle账号密码修改后特别容易锁定_Oracle数据库用户锁定原因以及处理方式(ORA-28000)...
  8. 通过JCONSOLE监控TOMCAT的JVM使用情况
  9. 494. Target Sum
  10. 域名有www与没有www有什么区别?
  11. PROXMOX 开源虚拟服务器系统安装及配置
  12. GitHub好玩的项目之你想要的样子 我都有
  13. 上面两点下面一个三角形_章勤琼:三角形内角和180该如何说明 ——小学数学中的合情推理和演绎推理...
  14. 人工智能助力危化品企业生产安全
  15. 网站商务通与百度商桥的区别
  16. 浅析SCI论文发表和转让
  17. 极值滤波matlab,极值滤波算法MATLAB程序及处理结果对比
  18. 轨迹数据之数据清洗以及异常检测
  19. [Leetcode] 361. Bomb Enemy 解题报告
  20. oracle成功的原因,【案例】Oracle报错OUI-67076产生原因和MOS官方解决办法

热门文章

  1. 深入理解DOM节点类型第六篇——特性节点Attribute
  2. 日期插件rolldate.js的使用
  3. 前端解读面向切面编程(AOP)
  4. ubuntu中获取文件名称并生成txt文件
  5. hdu1247(Hat’s Words)
  6. bzoj1699[Usaco2007 Jan]Balanced Lineup排队
  7. 计算机本地网络如何共享,本地网络共享怎么实现
  8. 查表法实现反正切_关于python实现CRC32的应用和总结
  9. hash的算法 java_【数据结构与算法】一致性Hash算法及Java实践
  10. c语言鼠标移动响应,CSS鼠标响应事件经过、移动、点击示例介绍