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

目录:

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

代码:

DLinkList.h

#ifndef _DLINKLIST_H_
#define _DLINKLIST_H_typedef void DLinkList;
typedef struct _tag_DLinkListNode DLinkListNode;
struct _tag_DLinkListNode
{DLinkListNode* next;//指向下节点DLinkListNode* pre;//前节点
};DLinkList* DLinkList_Create();void DLinkList_Destroy(DLinkList* list);void DLinkList_Clear(DLinkList* list);int DLinkList_Length(DLinkList* list);int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos);DLinkListNode* DLinkList_Get(DLinkList* list, int pos);DLinkListNode* DLinkList_Delete(DLinkList* list, int pos);DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node);DLinkListNode* DLinkList_Reset(DLinkList* list);DLinkListNode* DLinkList_Current(DLinkList* list);DLinkListNode* DLinkList_Next(DLinkList* list);DLinkListNode* DLinkList_Pre(DLinkList* list);#endif

DLinkList.c

#include <stdio.h>
#include <malloc.h>
#include "DLinkList.h"typedef struct _tag_DLinkList
{DLinkListNode header;//头节点DLinkListNode* slider;int length;
} TDLinkList;DLinkList* DLinkList_Create() //定义创建表函数
{TDLinkList* ret = (TDLinkList*)malloc(sizeof(TDLinkList));if( ret != NULL ){ret->length = 0;ret->header.next = NULL;ret->header.pre = NULL;ret->slider = NULL;}return ret;
}void DLinkList_Destroy(DLinkList* list)//定义销毁表函数
{free(list);
}void DLinkList_Clear(DLinkList* list) //定义清空重设表函数
{TDLinkList* sList = (TDLinkList*)list;if( sList != NULL ){sList->length = 0;sList->header.next = NULL;sList->header.pre = NULL;sList->slider = NULL;}
}int DLinkList_Length(DLinkList* list)//定义获取表当前长度函数
{TDLinkList* sList = (TDLinkList*)list;int ret = -1;if( sList != NULL ){ret = sList->length;}return ret;
}int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos) //定义插入节点函数
{ TDLinkList* sList = (TDLinkList*)list;int ret = (sList != NULL) && (pos >= 0) && (node != NULL);//判断表与节点是否为空与pos是否正常int i = 0;if( ret ){DLinkListNode* current = (DLinkListNode*)sList;//指向header头节点DLinkListNode* next = NULL;//找到插入节点的前一个节点//current->next == NULL 表示是第一个节点for(i=0; (i<pos) && (current->next != NULL); i++){current = current->next;}next = current->next;//取得插入的位置本来的节点current->next = node;//将插入位置的上一个节点的next指向新插入节点node->next = next;//将本来该位置的节点赋给新插入节点的nextif( next != NULL )//如果本来该位置有节点{next->pre = node;//将本来该位置的节点的前节点指向新插入节点}node->pre = current;//将新插入节点的前节点指向前一个节点if( sList->length == 0 )//如果是第一个插入的节点{node->pre = NULL;//将第一个节点的前节点设空//注意:插入第一个节点后,再插入的节点如果是第一个位置slider不会更新还是第一次插入的第一个节点sList->slider = node;//给slider赋第一个节点}sList->length++;//长度增加}return ret;
}DLinkListNode* DLinkList_Get(DLinkList* list, int pos) //定义获取节点函数
{TDLinkList* sList = (TDLinkList*)list;DLinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判断表是否为空与pos是否在范围内{DLinkListNode* current = (DLinkListNode*)sList;//指向header头节点for(i=0; i<pos; i++)//找得获取节点的前一个节点{current = current->next;}ret = current->next;//取得获取节点}return ret;
}DLinkListNode* DLinkList_Delete(DLinkList* list, int pos) //定义删除节点函数(根据下标删除)
{TDLinkList* sList = (TDLinkList*)list;DLinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判断表是否为空与pos是否在范围内{DLinkListNode* current = (DLinkListNode*)sList;DLinkListNode* next = NULL;for(i=0; i<pos; i++)//找得删除节点的前一个节点{current = current->next;}ret = current->next;//取得要删除的节点next = ret->next;//取得要删除节点的下一个节点current->next = next;//将要删除节点的上一个节点的next指向要删除节点的下一个节点if( next != NULL )//如果next!=NULL 表示删除 节点不是最后一个节点{next->pre = current;//将其的pre指向要删除节点的上一个节点if( current == (DLinkListNode*)sList )//如果删除的节点的前一个节点是header头节点 表示删除了第一个节点{next->pre = NULL;//将删除节点的下一个节点pre指向NULL}}if( sList->slider == ret )//如果删除的节点是slider的指向{sList->slider = next;//将slider指向它的下一个节点}sList->length--;}return ret;
}DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node)//定义删除节点函数(根据节点)
{TDLinkList* sList = (TDLinkList*)list;DLinkListNode* ret = NULL;int i = 0;if( sList != NULL )//判断表是否为空{DLinkListNode* current = (DLinkListNode*)sList;//取得头节点for(i=0; i<sList->length; i++)//找到要删除节点{if( current->next == node ){ret = current->next;break;//找到后跳出查找}current = current->next;}if( ret != NULL )//如果有该节点{DLinkList_Delete(sList, i);//使用对应下标删除节点}}return ret;
}DLinkListNode* DLinkList_Reset(DLinkList* list)//定义重置slider指向函数
{TDLinkList* sList = (TDLinkList*)list;DLinkListNode* ret = NULL;if( sList != NULL ){sList->slider = sList->header.next;//将第一个节点赋给sliderret = sList->slider;}return ret;//返回slider
}DLinkListNode* DLinkList_Current(DLinkList* list)//定义获取slider函数
{TDLinkList* sList = (TDLinkList*)list;DLinkListNode* ret = NULL;if( sList != NULL ){ret = sList->slider;}return ret;//返回slider
}DLinkListNode* DLinkList_Next(DLinkList* list)//定义slider下移函数
{TDLinkList* sList = (TDLinkList*)list;DLinkListNode* ret = NULL;if( (sList != NULL) && (sList->slider != NULL) ){ret = sList->slider;sList->slider = ret->next;}return ret;//返回slider
}DLinkListNode* DLinkList_Pre(DLinkList* list)//定义slider上移函数
{TDLinkList* sList = (TDLinkList*)list;DLinkListNode* ret = NULL;if( (sList != NULL) && (sList->slider != NULL) ){ret = sList->slider;sList->slider = ret->pre;}return ret;//返回slider
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "DLinkList.h"struct Value
{DLinkListNode header;//必须在结构体中第一个元素int v;
};int main(int argc, char *argv[])
{int i = 0;DLinkList* list = DLinkList_Create();struct Value* pv = NULL;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;DLinkList_Insert(list, (DLinkListNode*)&v1, DLinkList_Length(list));DLinkList_Insert(list, (DLinkListNode*)&v2, DLinkList_Length(list));DLinkList_Insert(list, (DLinkListNode*)&v3, DLinkList_Length(list));DLinkList_Insert(list, (DLinkListNode*)&v4, DLinkList_Length(list));DLinkList_Insert(list, (DLinkListNode*)&v5, DLinkList_Length(list));for(i=0; i<DLinkList_Length(list); i++){pv = (struct Value*)DLinkList_Get(list, i);printf("%d\n", pv->v);}printf("\n");DLinkList_Delete(list, DLinkList_Length(list)-1);DLinkList_Delete(list, 0);for(i=0; i<DLinkList_Length(list); i++){pv = (struct Value*)DLinkList_Next(list);printf("%d\n", pv->v);}printf("\n");DLinkList_Reset(list);DLinkList_Next(list);pv = (struct Value*)DLinkList_Current(list);printf("%d\n", pv->v);DLinkList_DeleteNode(list, (DLinkListNode*)pv);pv = (struct Value*)DLinkList_Current(list);printf("%d\n", pv->v);DLinkList_Pre(list);pv = (struct Value*)DLinkList_Current(list);printf("%d\n", pv->v);printf("Length: %d\n", DLinkList_Length(list));DLinkList_Destroy(list);getchar();return 0;
}

分析:

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

汇编:

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

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

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

相关文章

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

[道理]关于人生的&#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 …

datatable序列化为string

代码 privatestaticstringSerializeDataTableXml(DataTable pDt){ //序列化DataTableStringBuilder sb newStringBuilder(); XmlWriter writer XmlWriter.Create(sb); XmlSerializer serializer newXmlSerializer(typeof(DataTable)); serializer.Serialize(writer, pD…

C#常用输出格式

输出方法Console. WriteLine( ) Console. WriteLine()方法将数据输出到屏幕并加上一个回车换行符(若不加回车换行 符&#xff0c;可用Console. Write()方法)。 该方法类似于C语言中的printf()函数, 可以采用“{N[,M][:格式化字符串]}”的形式格式化输出字符串,其中的参数含义如…

栈-顺序表(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; SeqList.h #ifndef _SEQLIST_H_ #define _SEQLIST_H_typedef void SeqList;//定义顺序表类型 typedef void SeqListNode;//定义顺序表节点类型SeqList* SeqList_Create(int capacity);voi…

sqlserver 数据库日志文件过大的问题

USE[master] GO ALTER DATABASE 【数据库】 SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE 【数据库】 SET RECOVERY SIMPLE --简单模式 GO USE 【数据库】 GO DBCC SHRINKFILE (N【数据库日志文件名&#xff08;如&#xff1a;msdb_log&#xff09;】 , 11, TRUNCATE…

SQl Server存储过程基础

一、存储过程的概念 存储过程是SQL语句和可选控制流语句的预编译集合&#xff0c;存储在数据库中&#xff0c;可由应用程序通过一个调用执行&#xff0c;而且允许用户声明变量、有条件执行以及其他强大的编程功能。 在SQL Server中存储过程分为两类&#xff1a;即系统提供的存储…

isinfinite_Java Double类isInfinite()方法与示例

isinfinite双类isInfinite()方法 (Double class isInfinite() method) isInfinite() method is available in java.lang package. isInfinite()方法在java.lang包中可用。 isInfinite() method is used to check infinity (i.e. either positive infinity or negative infinity…

MySql学习(一)

SQL语句的分类&#xff1a;DDL&#xff08;数据定义语言&#xff09;、DML&#xff08;数据操作语言&#xff09;、DCL&#xff08;数据控制语句&#xff09;MySql的命令语句以&#xff1b;或\g结束建库&#xff1a;Create database name;建表&#xff1a;Create tablle name;选…

C盘爆红的解决办法

方法一&#xff1a;开始—>搜索—>cleanmgr—>磁盘清理—>选择你所需要清理的磁盘即可 方法二&#xff1a;我的电脑右击—>管理—>磁盘管理—>右键选择你要压缩的磁盘—>压缩卷—>输入压缩空间量—>压缩—>右键 拓展卷—>下一步—>输入…

栈应用_检测成对符号是否正确使用(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; LinkList.h LinkList.c LinkStack.h LinkStack.c 栈-线性表 main.c #include <stdio.h> #include <stdlib.h> #include "LinkStack.h"//该程序是检查字符串中的出…

Oracle 参数分类 和 参数的查看方法

Oracle数据库系统根据初始化参数文件init.ora中设置的参数来配置自身的启动&#xff0c;每个实例在启动之前&#xff0c;首先读取这些参数文件中设置的不同参数。 Oracle系统中的参数&#xff0c;根据系统使用情况可以简单分为两大类&#xff1a; 普通参数&#xff1a;也就是Or…

java 方法 示例_Java集合checkedList()方法与示例

java 方法 示例集合类checkedList()方法 (Collections Class checkedList() method) checkedList() Method is available in java.lang package. CheckedList()方法在java.lang包中可用。 checkedList() Method is used to return the typesafe view of the given List at runt…

ParameterizedTypeImpl

关于“通过反射获得泛型的参数化类型”的问题&#xff1a; 下面是张老师 通过反射获得泛型的参数化类型的一段代码import java.util.*; import java.lang.reflect.*;public class GenericalReflection { private Vector<Date> dates new Vector<Date>(); public v…