循環鏈表(代碼、分析、匯編)

目錄:

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

代碼:

CircleList.h

#ifndef _CIRCLELIST_H_
#define _CIRCLELIST_H_typedef void CircleList;typedef struct _tag_CircleListNode CircleListNode;struct _tag_CircleListNode{CircleListNode *next;};CircleList * CircleList_Create();void CircleList_Destroy(CircleList* list);void CircleList_Clear(CircleList* list);int  CircleList_Length(CircleList* list);int CircleList_Insert(CircleList* list, CircleListNode* node, int pos);CircleListNode* CircleList_Get(CircleList* list, int pos);CircleListNode* CircleList_Delete(CircleList* list, int pos);CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);CircleListNode* CircleList_Reset(CircleList* list);CircleListNode* CircleList_Current(CircleList* list);CircleListNode* CircleList_Next(CircleList*list);#endif

CircleList.c

#include<stdio.h>
#include<malloc.h>
#include"CircleList.h"typedef struct _tag_CircleList{CircleListNode header;//頭節點CircleListNode* slider;int length;
}TCircleList;CircleList * CircleList_Create(){//定義創建表函數TCircleList * ret = (TCircleList*)malloc(sizeof(TCircleList));if (ret != NULL){ret->length = 0;ret->header.next = NULL;ret->slider = NULL;}return ret;
}void CircleList_Destroy(CircleList * list){//定義銷毀表函數free(list);
}void CircleList_Clear(CircleList* list){//定義重設表屬性函數TCircleList* sList = (TCircleList*)list;if (sList != NULL){sList->length = 0;sList->header.next = NULL;sList->slider = NULL;}
}int  CircleList_Length(CircleList * list){//定義獲取表當前長度函數TCircleList *sList = (TCircleList*)list;int ret = -1;if (sList != NULL){ret = sList->length;}return ret;
}int CircleList_Insert(CircleList * list, CircleListNode* node, int pos){//定義插入節點函數TCircleList *sList = (TCircleList*)list;int ret = (sList != NULL) && (pos >= 0) && (node != NULL);//判斷表與節點是否為空和pos是否正常int i = 0;if (ret){CircleListNode* current = (CircleListNode*)sList; //取得表的header元素地址//取得插入節點位置的前一個節點//current->next == NULL 表示是第一個插入的節點//注意:這沒有對pos判斷,pos大于length時會循環for (i = 0; (i < pos) && (current->next != NULL); i++){current = current->next;}//注意:插入第一個節點后,再插入的節點如果不是第一個位置才能正常循環//可以在鏈表結構加一個尾節點指針變量保持指向尾節點,每次尾節點更改后再更新node->next = current->next;//將原本在pos位置的節點賦給新插入節點的nextcurrent->next = node;//將插入節點賦給插入節點位置的前一個節點的nextif (sList->length == 0){ //如果是第一個插入的節點//注意:插入第一個節點后,再插入的節點如果是第一個位置slider不會更新還是第一次插入的第一個節點sList->slider = node;//將第一個插入節點賦給slider		node->next = node;//將第一個插入節點的next指向自身(實現循環) }sList->length++;//長度增加}return ret;
}CircleListNode* CircleList_Get(CircleList* list, int pos){//定義獲取節點函數TCircleList * sList = (TCircleList*)list;CircleListNode* ret = NULL;int i = 0;if ((sList != NULL) && (pos >= 0)){CircleListNode* current = (CircleListNode*)sList;for (i = 0; i < pos; i++){ //取得前一個節點//注意:這沒有對pos判斷,pos大于length時會循環current = current->next;}ret = current->next; //取得要獲取的節點}return ret;
}CircleListNode* CircleList_Delete(CircleList* list, int pos){//定義根據下標刪除節點函數TCircleList *sList = (TCircleList*)list;CircleListNode * ret = NULL;int i = 0;if ((sList != NULL) && (pos >= 0)){//判斷表是否為空與pos是否正常CircleListNode* current = (CircleListNode*)sList;//指向頭節點CircleListNode* first = sList->header.next;//指向第一個節點CircleListNode* last = (CircleListNode*)CircleList_Get(sList, sList->length-1);//指向最后一個節點for (i = 0; i < pos; i++){//找到要刪除位置的前一個位置current = current->next;}ret = current->next;//指向要刪除節點current->next = ret->next;//將要刪除節點的next賦給上一節點的nextsList->length--;//長度減少if (first == ret){ //如果是第一個節點//這一步好像多余,上面current就是headersList->header.next = ret->next;//將頭節點指向第一個節點的下一個last->next = ret->next;//將最后一個節點的next指向第一個節點的下一個實現循環}if (sList->slider == ret){//如果刪除的節點是第一個插入的節點sList->slider = ret->next;//刪除節點的下個節點賦給slider}if (sList->length == 0){//如果長度等于0,表示鏈表沒有數據了sList->header.next = NULL; //重置第一個節點的指向sList->slider = NULL;//重置slider}}return ret;//返回刪除節點
}CircleListNode* CircleList_DeleteNode(CircleList * list, CircleListNode * node){//定義根據節點刪除節點函數TCircleList* sList = (TCircleList*)list;CircleListNode *ret =NULL;int i = 0;if (sList != NULL){//判斷表是否為空CircleListNode* current = (CircleListNode*)sList;//指向頭節點for (i = 0; i < sList->length; i++){if (current->next == node){//找到刪除節點的上一個節點ret = current->next;//指向刪除節點break; //找到后跳出循環查找}current = current->next;}if (ret != NULL){//如果有該節點CircleList_Delete(sList, i);//將下標轉去執行刪除}}return ret;//返回刪除節點
}CircleListNode* CircleList_Reset(CircleList* list){//定義重置slider指向的函數TCircleList* sList = (TCircleList*)list;CircleListNode* ret = NULL;if (sList != NULL){//如果表不為空sList->slider = sList->header.next;//將第一個節點賦給sliderret = sList->slider;}return ret;//返回slider}CircleListNode* CircleList_Current(CircleList* list){//定義slider當前指向節點函數TCircleList* sList = (TCircleList*)list;CircleListNode* ret = NULL;if (sList != NULL){ret = sList->slider;}return ret;//返回slider
}CircleListNode* CircleList_Next(CircleList *list){//定義slider下移一個節點函數TCircleList* sList = (TCircleList*)list;CircleListNode* ret = NULL;if ((sList != NULL) && (sList->slider != NULL)){//判斷表不為空與slider不為空ret = sList->slider;sList->slider = ret->next;//將slider的next賦給slider}return ret;//返回slider;
}

main.c

#include<stdio.h>
#include<stdlib.h>
#include"CircleList.h"struct Value{CircleListNode header;//必須放在第一個元素int v;
};
int main(int argc, char *argv[]){int i = 0;CircleList* list = CircleList_Create();struct Value v1;struct Value v2;struct Value v3;struct Value v4;struct Value v5;struct Value v6;struct Value v7;struct Value v8;v1.v = 1;v2.v = 2;v3.v = 3;v4.v = 4;v5.v = 5;v6.v = 6;v7.v = 7;v8.v = 8;CircleList_Insert(list, (CircleListNode*)&v1, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v2, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v3, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v4, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v5, 5);CircleList_Delete(list, 0);for (i = 0; i < 2 * CircleList_Length(list); i++){struct Value* pv = (struct Value*)CircleList_Get(list, i);printf("%d\n", pv->v);}printf("\n");while (CircleList_Length(list)>0){struct Value*pv = (struct Value*)CircleList_Delete(list, 0);printf("%d\n", pv->v);}printf("\n");CircleList_Insert(list, (CircleListNode*)&v1, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v2, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v3, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v4, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v5, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v6, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v7, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v8, CircleList_Length(list));for (i = 0; i < CircleList_Length(list); i++){struct Value* pv = (struct Value*)CircleList_Next(list);printf("%d\n", pv->v);}getchar();return 1;
}

分析:

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

匯編:

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379269.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379269.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379269.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

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 …

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;即系統提供的存儲…