目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
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);//聲明刪除一個數據函數#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);//加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;
}
分析:
匯編: