棧-線性表(代碼、分析、匯編)

目錄:

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

代碼:

LinkList.h

#ifndef _LINKLIST_H_
#define _LINKLIST_H_typedef void LinkList;  //定義鏈表類型
typedef struct _tag_LinkListNode LinkListNode;//定義鏈表節點類型
struct _tag_LinkListNode
{LinkListNode* next;
};LinkList* LinkList_Create();void LinkList_Destroy(LinkList* list);void LinkList_Clear(LinkList* list);int LinkList_Length(LinkList* list);int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);LinkListNode* LinkList_Get(LinkList* list, int pos);LinkListNode* LinkList_Delete(LinkList* list, int pos);#endif

LinkList.c

#include <stdio.h>
#include <malloc.h>
#include "LinkList.h"typedef struct _tag_LinkList//定義實際使用鏈表類型
{LinkListNode header;//頭節點int length;
} TLinkList;LinkList* LinkList_Create()//定義鏈表創建函數
{TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));if( ret != NULL )//創建成功{ret->length = 0;ret->header.next = NULL;}return ret;//返回鏈表指針
}void LinkList_Destroy(LinkList* list) //定義鏈表銷毀函數
{free(list);
}void LinkList_Clear(LinkList* list)//定義鏈表清空重設函數
{TLinkList* sList = (TLinkList*)list;if( sList != NULL )//鏈表不為空{sList->length = 0;sList->header.next = NULL;}
}int LinkList_Length(LinkList* list) //定義獲取鏈表長度函數
{TLinkList* sList = (TLinkList*)list;int ret = -1;if( sList != NULL )//鏈表不為空{ret = sList->length;}return ret;
}int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) //定義插入節點函數
{ TLinkList* sList = (TLinkList*)list;int ret = (sList != NULL) && (pos >= 0) && (node != NULL);//判斷表不為空與pos正常與插入的節點不為空int i = 0;if( ret ){LinkListNode* current = (LinkListNode*)sList;//指向頭節點//找到新插入節點的前一個節點//current->next ==NULL 表示 是第一個插入的節點 或 pos 大于當前表長度就是插入到最后一個位置了for(i=0; (i<pos) && (current->next != NULL); i++){current = current->next;}node->next = current->next;//新插入節點的next等于本來在該位置的節點current->next = node;//新插入節點的前一個節點的next等于新插入節點sList->length++;//長度增加}return ret;
}LinkListNode* LinkList_Get(LinkList* list, int pos) //定義獲取節點函數
{TLinkList* sList = (TLinkList*)list;LinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判斷表不為空與pos是否在范圍內{LinkListNode* current = (LinkListNode*)sList;//指向頭節點for(i=0; i<pos; i++)//找到前一個節點 {current = current->next;}ret = current->next;//取得獲取節點}return ret;
}LinkListNode* LinkList_Delete(LinkList* list, int pos) //定義刪除節點函數
{TLinkList* sList = (TLinkList*)list;LinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判斷表不為空與pos是否在范圍內{LinkListNode* current = (LinkListNode*)sList;//指向頭節點for(i=0; i<pos; i++)//找到刪除節點的前一個節點{current = current->next;}ret = current->next;//取得刪除節點current->next = ret->next;//將刪除節點前一個節點的next指向刪除節點的下一個節點sList->length--;//長度減少}return ret;
}

LinkStack.h

#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_typedef void LinkStack;//定義棧類型LinkStack* LinkStack_Create();//聲明創建棧函數void LinkStack_Destroy(LinkStack* stack);//聲明銷毀棧函數void LinkStack_Clear(LinkStack* stack);//聲明清空棧函數int LinkStack_Push(LinkStack* stack, void* item);//聲明添加數據進棧函數void* LinkStack_Pop(LinkStack* stack);//聲明取出數據出棧函數void* LinkStack_Top(LinkStack* stack);//聲明獲取棧頂數據函數不移除節點int LinkStack_Size(LinkStack* stack);//聲明獲取棧當前大小函數#endif

LinkStack.c

#include<stdio.h>
#include <malloc.h>
#include "LinkStack.h"
#include "LinkList.h"//注意: 該棧只給鏈表套多一層調用線性鏈表的函數typedef struct _tag_LinkStackNode//定義棧節點類型
{//注意 :棧只是將在鏈表的模式下的節點的信息封裝在該文件了,不在main.c定義了LinkListNode header;//頭節點 void* item;//指向插入數據的地址 
} TLinkStackNode;LinkStack* LinkStack_Create()//定義創建棧函數
{return LinkList_Create();//調用鏈表創建函數一個鏈表
}void LinkStack_Destroy(LinkStack* stack)//定義銷毀棧函數
{LinkStack_Clear(stack);//先清空棧內數據LinkList_Destroy(stack);//再調用鏈表銷毀函數,銷毀該鏈表
}void LinkStack_Clear(LinkStack* stack)//定義清空棧函數
{while( LinkStack_Size(stack) > 0 )//如果棧內還有數據全部取出來{LinkStack_Pop(stack);}
}//第二個參數是傳進來是變量地址 
int LinkStack_Push(LinkStack* stack, void* item)//定義添加數據進棧函數 
{   //注意:這個節點是動態添加,不用時要釋放內存TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));//申請新創一個節點int ret = (node != NULL) && (item != NULL);//判斷是否創建成功與插入數據是否正常if( ret ){node->item = item;//將傳來的變量地址給新創建的節點存放的數據賦值//插入鏈表第一個位置,到時取出就取第一個位置,實現先進后出ret  = LinkList_Insert(stack, (LinkListNode*)node, 0);}if( !ret )//如果插入不成功{free(node);//將剛申請的節點空間釋放}return ret;
}void* LinkStack_Pop(LinkStack* stack)//定義取出數據出棧函數
{//調用鏈表刪除函數 第一個位置的節點,因為會返回刪除節點TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);void* ret = NULL;if( node != NULL )//如果成功 ,表示棧內還有元素{ret = node->item;//取得節點內數據地址free(node);//釋放該節點}return ret;//返回節點內的數據地址
}void* LinkStack_Top(LinkStack* stack)//定義獲取棧頂數據函數不移除節點
{TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0);void* ret = NULL;if( node != NULL )//如果成功 ,表示棧內還有元素{ret = node->item;//取得節點內數據地址}//注意:沒有釋放移除節點的,節點還在return ret;//返回節點內的數據地址
}int LinkStack_Size(LinkStack* stack)//定義獲取棧當前大小函數
{return LinkList_Length(stack);
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"int main(int argc, char *argv[]) 
{LinkStack* stack = LinkStack_Create();int a[10];int i = 0;for(i=0; i<10; i++){a[i] = i;LinkStack_Push(stack, a + i);}printf("Top: %d\n", *(int*)LinkStack_Top(stack));printf("Length: %d\n", LinkStack_Size(stack));while( LinkStack_Size(stack) > 0 ){printf("Pop: %d\n", *(int*)LinkStack_Pop(stack));}LinkStack_Destroy(stack);getchar();return 0;
}

分析:

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

匯編:

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

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

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

相關文章

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…

Spyder打開報錯解決辦法

刪除C:\Users\Administrator路徑下.matplotlib和.spyder-py3&#xff08;你的有可能是.spyder2或.spyder3&#xff09;這兩個文件夾&#xff0c;然后再重啟Spyder即可 &#xff08;本人也是查找多篇大佬博客然后最后找到的解決方法&#xff09;

ERP軟件銷售的方法論--SPIN銷售法(SPIN Selling)

有許多人一直在做的ERP軟件產品的銷售&#xff0c;也接受了許多關于銷售方法的培訓&#xff0c;我所了解的就包括有C139&#xff0c;用友的《策略九問》等方法&#xff0c;但其實行業內早就有先驅創立了相關的銷售方法&#xff0c;那就是SPIN銷售法&#xff0c;之前一直都是只知…

ffmpeg - AVPacket內存問題分析(AVFrame一樣的)

目錄&#xff1a;1、av_packet_alloc()和av_packet_free()2、av_init_packet()的問題3、av_packet_move_ref()的問題4、av_packet_clone()的問題5、AVPacket的引用計數問題6、 AVFrame一樣的1、av_packet_alloc()和av_packet_free() 源碼中av_packet_unref()調用av_buffer_unre…

Java類class isSynthetic()方法及示例

類的類isSynthetic()方法 (Class class isSynthetic() method) isSynthetic() method is available in java.lang package. isSynthetic()方法在java.lang包中可用。 isSynthetic() method is used to check whether this Class is a synthetic class or not. isSynthetic()方法…

BNU OJ 第26303 題 Touchscreen Keyboard

BNU OJ第26303題Touchscreen Keyboard&#xff08;題目鏈接&#xff09;的解題報告。 原題如下&#xff1a; Touchscreen Keyboard Problem Description Nowadays, people do not use hardware keyboards but touchscreens. Usually, they touch on the wrong letters with the…

列表(二)

1&#xff0c;什么是列表&#xff1f; 列表由一系列按特定順序排列的元素組成。得知列表內的元素是有序的。 在Python中&#xff0c;用方括號&#xff08;[]&#xff09;來表示列表&#xff0c;并用逗號來分隔其中的元素。 color [red,blue,black,yellow]#定義一個字符串列表…

Zigbee在.Net Micro Framework系統中的應用

Zigbee是IEEE 802.15.4協議的代名詞。根據這個協議規定的技術是一種短距離、低功耗的無線通信技術。這一名稱來源于蜜蜂的八字舞&#xff0c;由于蜜蜂(bee)是靠飛翔和“嗡嗡”(zig)地抖動翅膀的“舞蹈”來與同伴傳遞花粉所在方位信息&#xff0c;也就是說蜜蜂依靠這樣的方式構成…