目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
SeqList.h
#ifndef _SEQLIST_H_
#define _SEQLIST_H_typedef void SeqList;//定義順序表類型
typedef void SeqListNode;//定義順序表節點類型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);#endif
SeqList.c
#include <stdio.h>
#include <malloc.h>
#include "SeqList.h"typedef unsigned int TSeqListNode;//定義實際使用的順序表節點類型typedef struct _tag_SeqList //定義實際使用的順序表類型
{int capacity;//容量int length;//當前長度長度TSeqListNode* node; //節點指針(數組)
} TSeqList;SeqList* SeqList_Create(int capacity) //定義創建表函數
{TSeqList* ret = NULL;if( capacity >= 0 ){ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);}if( ret != NULL )//如果創建成功{ret->capacity = capacity;//容量賦值ret->length = 0;//當前長度賦值ret->node = (TSeqListNode*)(ret + 1);//表內的指針等于第一個節點}return ret;//返回新建表
}void SeqList_Destroy(SeqList* list) //定義銷毀表函數
{free(list);
}void SeqList_Clear(SeqList* list) //定義清空重設表函數
{TSeqList* sList = (TSeqList*)list;if( sList != NULL ){sList->length = 0;//重設置0}
}int SeqList_Length(SeqList* list) //定義獲取表當前長度函數
{TSeqList* sList = (TSeqList*)list;int ret = -1;if( sList != NULL ){ret = sList->length;//獲取當前表長度}return ret;//返回長度
}int SeqList_Capacity(SeqList* list) //定義獲取表容量函數
{TSeqList* sList = (TSeqList*)list;int ret = -1;if( sList != NULL ){ret = sList->capacity;//獲取容量}return ret;//返回容量
}int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) //定義插入節點函數
{TSeqList* sList = (TSeqList*)list;int ret = (sList != NULL);int i = 0;ret = ret && (sList->length + 1 <= sList->capacity);//判斷表是否為空與表是否有節點插入新節點ret = ret && (0 <= pos);//判斷pos是否正常if( ret ){if( pos >= sList->length )//如果pos大于當前長度{pos = sList->length;//將插入位置設為最后一位}for(i=sList->length; i>pos; i--)//節點數據后移{sList->node[i] = sList->node[i-1];}sList->node[i] = (TSeqListNode)node;//將地址轉成使用的表節點類型(數值)賦給節點sList->length++;//長度增加}return ret;
}SeqListNode* SeqList_Get(SeqList* list, int pos)//定義獲取節點數據函數
{TSeqList* sList = (TSeqList*)list;SeqListNode* ret = NULL;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判斷表是否為空與pos是否在范圍{ret = (SeqListNode*)(sList->node[pos]);//獲取節點數據}return ret;
}SeqListNode* SeqList_Delete(SeqList* list, int pos)//定義刪除表節點函數
{TSeqList* sList = (TSeqList*)list;SeqListNode* ret = SeqList_Get(list, pos);//取得要刪除節點int i = 0;if( ret != NULL )//節點不為空{for(i=pos+1; i<sList->length; i++)//節點數據前移更改要刪除節點數據{sList->node[i-1] = sList->node[i];}sList->length--;//長度減少}return ret;//返回刪除節點
}
SeqStack.h
#ifndef _SEQSTACK_H_
#define _SEQSTACK_H_typedef void SeqStack;//定義棧類型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);#endif
SeqStack.c
#include "SeqStack.h"
#include "SeqList.h"//注意: 該棧只是套多一層調用順序表的函數SeqStack* SeqStack_Create(int capacity)//定義創建棧函數
{return SeqList_Create(capacity);//調用創建順序表函數
}void SeqStack_Destroy(SeqStack* stack)//定義銷毀棧函數
{SeqList_Destroy(stack);//調用銷毀順序表函數
}void SeqStack_Clear(SeqStack* stack)//定義清除棧函數
{SeqList_Clear(stack);//調用清除順序表函數
}int SeqStack_Push(SeqStack* stack, void* item)//定義添加數據到棧(進棧)
{return SeqList_Insert(stack, item, SeqList_Length(stack));//調用順序表插入函數,始終插入到最后一個位置
}void* SeqStack_Pop(SeqStack* stack)//定義取出數據從棧(出棧)
{return SeqList_Delete(stack, SeqList_Length(stack) - 1);//調用順序表刪除函數。刪除最一個節點,因為返回刪除節點
}void* SeqStack_Top(SeqStack* stack)//定義取出數據(不稱除節點)
{return SeqList_Get(stack, SeqList_Length(stack) - 1);//調用順序表獲取最一個節點數據
}int SeqStack_Size(SeqStack* stack)//定義獲取當前棧長度函數
{return SeqList_Length(stack);//調用獲取順序表長度函數
}int SeqStack_Capacity(SeqStack* stack)//定義獲取棧容量函數
{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;
}
分析:
匯編: