顺序表(代码、分析、汇编)
生活随笔
收集整理的這篇文章主要介紹了
顺序表(代码、分析、汇编)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
SeqList.h
#ifndef _SEQLIST_H_ #define _SEQLIST_H_ typedef void SeqList; //定義鏈表數據類型,void因為要適用不同鏈表數據類型 typedef void SeqListNode; //定義鏈表節點類型 void因為要適用不同節點類型 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; 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);//加1 剛好是數組首元素地址}return ret; //返回自定義的鏈表數據類型 }void SeqList_Destroy(SeqList* list) //定義刪除鏈表函數 {free(list); }void SeqList_Clear(SeqList* list)//定義清除鏈表長度重設為0 {TSeqList* sList = (TSeqList*)list;if( sList != NULL ){sList->length = 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); //判斷要插入的位置不能小于0if( ret ) //上面條件滿足{if( pos >= sList->length ) //是否大于當前的長度下標{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) ) //判斷不能超出范圍{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; }smain.c
#include <stdio.h> #include <stdlib.h> #include "SeqList.h"int main(int argc, char *argv[]) {SeqList* list = SeqList_Create(5);int i = 10;int j = 11;int k = 12;int x = 13;int y = 14;int z = 15;int index = 0;SeqList_Insert(list, &i, 0);SeqList_Insert(list, &j, 0);SeqList_Insert(list, &k, 0);SeqList_Insert(list, &x, 0);SeqList_Insert(list, &y, 0);SeqList_Insert(list, &z, 0);for(index=0; index<SeqList_Length(list); index++){int* p = (int*)SeqList_Get(list, index);printf("%d\n", *p);}printf("\n");while( SeqList_Length(list) > 0 ){int* p = (int*)SeqList_Delete(list, 0);printf("%d\n", *p);}SeqList_Destroy(list);getchar();return 0; }分析:
匯編:
總結
以上是生活随笔為你收集整理的顺序表(代码、分析、汇编)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浴室柜多少钱啊?
- 下一篇: 线性表(代码、分析、汇编)