栈-顺序表(代码、分析、汇编)
生活随笔
收集整理的這篇文章主要介紹了
栈-顺序表(代码、分析、汇编)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
SeqList.h
#ifndef _SEQLIST_H_ #define _SEQLIST_H_typedef void SeqList;//定義順序表類(lèi)型 typedef void SeqListNode;//定義順序表節(jié)點(diǎn)類(lèi)型SeqList* SeqList_Create(int capacity);void SeqList_Destroy(SeqList* list);void SeqList_Clear(SeqList* list);int SeqList_Length(SeqList* list);int SeqList_Capacity(SeqList* list);int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);SeqListNode* SeqList_Get(SeqList* list, int pos);SeqListNode* SeqList_Delete(SeqList* list, int pos);#endifSeqList.c
#include <stdio.h> #include <malloc.h> #include "SeqList.h"typedef unsigned int TSeqListNode;//定義實(shí)際使用的順序表節(jié)點(diǎn)類(lèi)型typedef struct _tag_SeqList //定義實(shí)際使用的順序表類(lèi)型 {int capacity;//容量int length;//當(dāng)前長(zhǎng)度長(zhǎng)度TSeqListNode* node; //節(jié)點(diǎn)指針(數(shù)組) } TSeqList;SeqList* SeqList_Create(int capacity) //定義創(chuàng)建表函數(shù) {TSeqList* ret = NULL;if( capacity >= 0 ){ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);}if( ret != NULL )//如果創(chuàng)建成功{ret->capacity = capacity;//容量賦值ret->length = 0;//當(dāng)前長(zhǎng)度賦值ret->node = (TSeqListNode*)(ret + 1);//表內(nèi)的指針等于第一個(gè)節(jié)點(diǎn)}return ret;//返回新建表 }void SeqList_Destroy(SeqList* list) //定義銷(xiāo)毀表函數(shù) {free(list); }void SeqList_Clear(SeqList* list) //定義清空重設(shè)表函數(shù) {TSeqList* sList = (TSeqList*)list;if( sList != NULL ){sList->length = 0;//重設(shè)置0} }int SeqList_Length(SeqList* list) //定義獲取表當(dāng)前長(zhǎng)度函數(shù) {TSeqList* sList = (TSeqList*)list;int ret = -1;if( sList != NULL ){ret = sList->length;//獲取當(dāng)前表長(zhǎng)度}return ret;//返回長(zhǎng)度 }int SeqList_Capacity(SeqList* list) //定義獲取表容量函數(shù) {TSeqList* sList = (TSeqList*)list;int ret = -1;if( sList != NULL ){ret = sList->capacity;//獲取容量}return ret;//返回容量 }int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) //定義插入節(jié)點(diǎn)函數(shù) {TSeqList* sList = (TSeqList*)list;int ret = (sList != NULL);int i = 0;ret = ret && (sList->length + 1 <= sList->capacity);//判斷表是否為空與表是否有節(jié)點(diǎn)插入新節(jié)點(diǎn)ret = ret && (0 <= pos);//判斷pos是否正常if( ret ){if( pos >= sList->length )//如果pos大于當(dāng)前長(zhǎng)度{pos = sList->length;//將插入位置設(shè)為最后一位}for(i=sList->length; i>pos; i--)//節(jié)點(diǎn)數(shù)據(jù)后移{sList->node[i] = sList->node[i-1];}sList->node[i] = (TSeqListNode)node;//將地址轉(zhuǎn)成使用的表節(jié)點(diǎn)類(lèi)型(數(shù)值)賦給節(jié)點(diǎn)sList->length++;//長(zhǎng)度增加}return ret; }SeqListNode* SeqList_Get(SeqList* list, int pos)//定義獲取節(jié)點(diǎn)數(shù)據(jù)函數(shù) {TSeqList* sList = (TSeqList*)list;SeqListNode* ret = NULL;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判斷表是否為空與pos是否在范圍{ret = (SeqListNode*)(sList->node[pos]);//獲取節(jié)點(diǎn)數(shù)據(jù)}return ret; }SeqListNode* SeqList_Delete(SeqList* list, int pos)//定義刪除表節(jié)點(diǎn)函數(shù) {TSeqList* sList = (TSeqList*)list;SeqListNode* ret = SeqList_Get(list, pos);//取得要?jiǎng)h除節(jié)點(diǎn)int i = 0;if( ret != NULL )//節(jié)點(diǎn)不為空{for(i=pos+1; i<sList->length; i++)//節(jié)點(diǎn)數(shù)據(jù)前移更改要?jiǎng)h除節(jié)點(diǎn)數(shù)據(jù){sList->node[i-1] = sList->node[i];}sList->length--;//長(zhǎng)度減少}return ret;//返回刪除節(jié)點(diǎn) }SeqStack.h
#ifndef _SEQSTACK_H_ #define _SEQSTACK_H_typedef void SeqStack;//定義棧類(lèi)型SeqStack* SeqStack_Create(int capacity);void SeqStack_Destroy(SeqStack* stack);void SeqStack_Clear(SeqStack* stack);int SeqStack_Push(SeqStack* stack, void* item);void* SeqStack_Pop(SeqStack* stack);void* SeqStack_Top(SeqStack* stack);int SeqStack_Size(SeqStack* stack);int SeqStack_Capacity(SeqStack* stack);#endifSeqStack.c
#include "SeqStack.h" #include "SeqList.h"//注意: 該棧只是套多一層調(diào)用順序表的函數(shù)SeqStack* SeqStack_Create(int capacity)//定義創(chuàng)建棧函數(shù) {return SeqList_Create(capacity);//調(diào)用創(chuàng)建順序表函數(shù) }void SeqStack_Destroy(SeqStack* stack)//定義銷(xiāo)毀棧函數(shù) {SeqList_Destroy(stack);//調(diào)用銷(xiāo)毀順序表函數(shù) }void SeqStack_Clear(SeqStack* stack)//定義清除棧函數(shù) {SeqList_Clear(stack);//調(diào)用清除順序表函數(shù) }int SeqStack_Push(SeqStack* stack, void* item)//定義添加數(shù)據(jù)到棧(進(jìn)棧) {return SeqList_Insert(stack, item, SeqList_Length(stack));//調(diào)用順序表插入函數(shù),始終插入到最后一個(gè)位置 }void* SeqStack_Pop(SeqStack* stack)//定義取出數(shù)據(jù)從棧(出棧) {return SeqList_Delete(stack, SeqList_Length(stack) - 1);//調(diào)用順序表刪除函數(shù)。刪除最一個(gè)節(jié)點(diǎn),因?yàn)榉祷貏h除節(jié)點(diǎn) }void* SeqStack_Top(SeqStack* stack)//定義取出數(shù)據(jù)(不稱除節(jié)點(diǎn)) {return SeqList_Get(stack, SeqList_Length(stack) - 1);//調(diào)用順序表獲取最一個(gè)節(jié)點(diǎn)數(shù)據(jù) }int SeqStack_Size(SeqStack* stack)//定義獲取當(dāng)前棧長(zhǎng)度函數(shù) {return SeqList_Length(stack);//調(diào)用獲取順序表長(zhǎng)度函數(shù) }int SeqStack_Capacity(SeqStack* stack)//定義獲取棧容量函數(shù) {return SeqList_Capacity(stack); }main.c
#include <stdio.h> #include <stdlib.h> #include "SeqStack.h"int main(int argc, char *argv[]) {SeqStack* stack = SeqStack_Create(20);int a[10];int i = 0;for(i=0; i<10; i++){a[i] = i;SeqStack_Push(stack, a + i);}printf("Top: %d\n", *(int*)SeqStack_Top(stack));printf("Capacity: %d\n", SeqStack_Capacity(stack));printf("Length: %d\n", SeqStack_Size(stack));while( SeqStack_Size(stack) > 0 ){printf("Pop: %d\n", *(int*)SeqStack_Pop(stack));}SeqStack_Destroy(stack);return 0; }分析:
匯編:
總結(jié)
以上是生活随笔為你收集整理的栈-顺序表(代码、分析、汇编)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 栈-线性表(代码、分析、汇编)
- 下一篇: 原神训练有素的考古学家如何获得