雙向鏈表(代碼、分析、匯編)

目錄:

    • 代碼:
    • 分析:
    • 匯編:

代碼:

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.pswp.cn/news/379262.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379262.shtml
英文地址,請注明出處:http://en.pswp.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…