靜態鏈表(代碼、分析、匯編)

目錄:

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

代碼:

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