静态链表(代码、分析、汇编)

目录:

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

代码:

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

分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

汇编:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言 typedef_C Typedef-能力倾向问题与解答

c语言 typedefC programming Typedef Aptitude Questions and Answers: In this section you will find C Aptitude Questions and Answers on typedef topics, defining/changing name of any data type, using and accessing the typedef values. C编程Typedef Aptitude问答&…

ios程序 调试log宏的添加

#ifdef DEBUG # define LOG(...) NSLog(__VA_ARGS__) # define LOG_CURRENT_METHOD NSLog("%-%", NSStringFromClass([self class]), NSStringFromSelector(_cmd)) #else # define LOG(...) ; # define LOG_CURRENT_METHOD ; #endif 使用 LOG_CURRENT_METHOD; NS…

Python的线程池实现

代码 1 #coding:utf-82 3 #Python的线程池实现4 5 importQueue6 importthreading7 importsys8 importtime9 importurllib10 11 #替我们工作的线程池中的线程12 classMyThread(threading.Thread):13 def__init__(self, workQueue, resultQueue,timeout30, **kwargs):14 threadin…

编程统计BUF字单元数据中所含1的个数,并将结果存入COUNT单元中。

编程统计BUF字单元数据中所含1的个数&#xff0c;并将结果存入COUNT单元中。 代码如下&#xff1a; DATA SEGMENT BUF DW 2345H ;随机存储一下数据 COUNT DB ? ;用于统计BUF字单元数据中所含1的个数 DATA ENDS STACK SEGMENT STACKDB 100 DUP(?);在堆栈段开辟一段大小为1…

循环链表(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; CircleList.h #ifndef _CIRCLELIST_H_ #define _CIRCLELIST_H_typedef void CircleList;typedef struct _tag_CircleListNode CircleListNode;struct _tag_CircleListNode{CircleListNode…

Java Throwable setStackTrace()方法与示例

Throwable类setStackTrace()方法 (Throwable Class setStackTrace() method) setStackTrace() Method is available in java.lang package. setStackTrace()方法在java.lang包中可用。 setStackTrace() Method is used to sets stack trace elements that will be retrieved by…

IOS中设置全局变量

转&#xff1a;http://blog.csdn.net/totogogo/article/details/7355203 有几种方法 some developers recommend use singleton patter (ref link http://blog.csdn.net/kmyhy/article/details/7026511) 方法1&#xff1a;使用静态变量 (不推荐&#xff09; 方法2&#xff1a; …

设计模式之Observer

观察者模式可以参考邮件订阅的例子 邮件订阅设计到2个主要角色&#xff0c;一个是订阅者(观察者)&#xff0c;一个是发布者 发布者可以拥有一个观察者的集合&#xff0c;可以添加&#xff0c;删除观察者&#xff0c;当发布者发布一个新的消息时&#xff0c;要邮件通知观察者集合…

编写一个程序,计算|X-Y|的值,并将结果存入RESULT单元中,其中X和Y都为带符号字数据。

编写一个程序&#xff0c;计算|X-Y|的值&#xff0c;并将结果存入RESULT单元中&#xff0c;其中X和Y都为带符号字数据。 P154 例4.11 汇编思路:DATA段定义X、Y、RESULE分别用于存放随机数、存放随机数、存放最后计算结果。STACK段定义100DB大小的堆栈段运算存储空间。将AX获取…

java timezone_Java TimeZone inDaylightTime()方法及示例

java timezoneTimeZone类inDaylightTime()方法 (TimeZone Class inDaylightTime() method) inDaylightTime() method is available in java.util package. inDaylightTime()方法在java.util包中可用。 inDaylightTime() method is used to check whether the given date (d) is…

这几天好像博客登不上去 什么情况

这几天好像博客登不上去 什么情况 我多年的心情记录啊 还以为关掉了 。。。。。。。 今天很生气&#xff0c;麻痹 转载于:https://www.cnblogs.com/cloud/archive/2010/04/25/1720744.html

双向链表(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; DLinkList.h #ifndef _DLINKLIST_H_ #define _DLINKLIST_H_typedef void DLinkList; typedef struct _tag_DLinkListNode DLinkListNode; struct _tag_DLinkListNode {DLinkListNode* nex…

[道理]关于人生的,很不错!

[道理]关于人生的&#xff0c;很不错&#xff01; 心理学课上&#xff0c;周正教授正在授课&#xff1a;“上次下课时&#xff0c;一个男孩子递了张纸条&#xff1a;我是个比较内向的人&#xff0c;又没什么特长&#xff0c;不会踢足球&#xff0c;不会打篮球……唯一的爱好是写…

变量和简单数据类型(一)

1&#xff0c;title()方法 将字符串中的每个单词的首字符大写 2&#xff0c;upper()方法 将字符串的所有字母大写 3&#xff0c;lower()方法 将字符串的所有字母小写 name "beyond Sq" print(name.title()) print(name.upper()) print(name.lower())调用方式&…

long类型20位示例_Java Long类lowerOneBit()方法与示例

long类型20位示例长类lowerOneBit()方法 (Long class lowestOneBit() method) lowestOneBit() method is available in java.lang package. minimumOneBit()方法在java.lang包中可用。 lowestOneBit() method is used to find at most only single 1’s bit from the rightmost…

VS2010安装、启动都挺快的,真不错

截图留念&#xff0c;里面的源码是《把脉VC》一书的示例工程。 转载于:https://www.cnblogs.com/silentmj/archive/2010/04/29/1723940.html

hdu 1712

地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1712 题意&#xff1a;复习课程&#xff0c;n们课&#xff0c;有m天复习&#xff0c;a[i][j]代表用j天来复习第i门课的收获。。&#xff08;这里居然可能用的天数多而收获更少……囧&#xff09; mark&#xff1a;第…

Python中的or和and运算符的使用

通俗来讲 or&#xff1a;找真值&#xff0c;若第一个为真则返回该值&#xff1b;若全都不为真&#xff0c;则返回最后一个假值 and&#xff1a;找假值&#xff0c;若第一个为假则返回该值&#xff1b;若全都不为假&#xff0c;则返回最后一个真值 牢记这两句话&#xff01;&…

栈-线性表(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_typedef void LinkList; //定义链表类型 typedef struct _tag_LinkListNode LinkListNode;//定义链表节点类型 struct _tag_LinkL…

Java IdentityHashMap isEmpty()方法与示例

IdentityHashMap类isEmpty()方法 (IdentityHashMap Class isEmpty() method) isEmpty() method is available in java.util package. isEmpty()方法在java.util包中可用。 isEmpty() method is used to check whether this IdentityHashMap is "empty" or "not …