?? _list_.c
字號:
#include "_List_.h"
#ifndef NULL
#define NULL 0
#endif
/*
* 張向陽 為SIMGUI開發
* 此程序實現一個帶有索引的鏈表基礎,可用來支持設計多種類型的鏈表
* 以及存放你想存放的任何結構構和數據
*/
/*
*獲得一個結點內存區的大小
*/
int GetListNodeSize(pLIST list,int nodorder)
{
if(list == NULL) return -1;
if(nodorder < 0 || nodorder >= list->useditems) return -1;
return list->items[nodorder].datasize;
}
/*
*建立鏈表
*/
pLIST CreateList(int nodnums)
{
pLIST list = NULL;
if(nodnums <= 0)
{
list = (pLIST)malloc(sizeof(LIST));
list->items = ( pDATANOD) malloc(ITEMS_DEFNUM * sizeof(DATANOD));
memset(list->items,0,ITEMS_DEFNUM * sizeof(DATANOD));
}
else
{
list = (pLIST)malloc(sizeof(LIST)) ;
list->items = (pDATANOD)malloc(nodnums *sizeof(DATANOD));
memset(list->items,0,nodnums * sizeof(DATANOD));
}
if(list)
{
list->itemnums = (nodnums <= 0)?ITEMS_DEFNUM:nodnums;
list->useditems = 0;
}else return NULL;
return list;
}
/*
*得到LIST中存儲的結點總數
*/
int GetListNodsCount(pLIST list)
{
if(list == NULL) return -1;
if(list->items == NULL) return -1;/*validate*/
if(list->useditems > list->itemnums)return -1;
return list->useditems;
}
/*把數據按照指定序號加入鏈表*/
int AddDataToListByOrder(pLIST list,void *point,int datasize,int order)
{
/*未實現,沒有必要*/
return 1;
}
/*把指針按照指定序號加入鏈表*/
int AddPointerToListByOrder(pLIST list,void *point,int order)
{
/**/
return 1;
}
/*只向鏈表中增加加一個指針不開辟空間復制*/
int AddPointerToList(pLIST list,void *point)
{
/**/
return AddDataToList( list,point, -1);
}
/*把數據放入LIST中,采用另外開空間并復制的方式*/
int AddDataToList(pLIST list,void *data, int datasize)
{
unsigned char *dataspace = NULL;
if(list == NULL || data == NULL) return -1;
if(list->items == NULL)/*null strlist */
{
list->items = ( pDATANOD) malloc(ITEMS_DEFNUM * sizeof(DATANOD));
memset(list->items,0,ITEMS_DEFNUM * sizeof(DATANOD));
list->itemnums = ITEMS_DEFNUM;
list->useditems = 0;
}
if(list->useditems >= list->itemnums -1)/*not enought space*/
{
list->items = (pDATANOD)realloc(list->items,(list->itemnums + ITEMS_DEFNUM) * sizeof(DATANOD));
memset(&list->items[list->itemnums - 1],0,sizeof(DATANOD)*ITEMS_DEFNUM );
list->itemnums += ITEMS_DEFNUM;
}
if(datasize > 0)
dataspace = (unsigned char*)malloc(datasize + 1);
if(dataspace)/*這里簡單的把開辟的空間交給鏈表保存,以后考慮增加內存管理功能:開辟的空間不被刪掉可復用*/
{
memcpy(dataspace,data,datasize);
dataspace[datasize] = 0;
list->items[list->useditems].data = dataspace;
list->items[list->useditems].datasize = datasize;
list->useditems++;
return list->useditems - 1;
}else if(datasize <= 0)/*增加一個指針型的結點*/
{
list->items[list->useditems].data = data;
list->items[list->useditems].datasize = -1;
list->useditems++;
return list->useditems - 1;
}
return -1;
}
/*
*由ORDER獲得某個結點
*/
void * GetListNod(pLIST list,int order)
{
if(list == NULL) return NULL;
if(list->useditems < order)return NULL;
return list->items[order].data;
}
/*
*由ORDER釋放某個結點,但非LIST開辟的內存不會被釋放
*/
BOOL FreeListNod(pLIST list,int order)
{
if(list==NULL) return 0;
if(list->useditems <= order)
return 0;
/*指針存在,而且是鏈表自己開的空間,若是指針狀態的結點則不釋放*/
if(list->items[order].data && list->items[order].datasize > 0)
{
free(list->items[order].data);
list->useditems -- ;
list->items[order].data = 0;
list->items[order].datasize = 0;
}else
{
list->useditems -- ;
list->items[order].data = 0;
}
memcpy(&list->items[order],&list->items[order+ 1],sizeof(DATANOD)*(list->useditems - order));
memset( &(list->items[list->useditems ]),0,sizeof(DATANOD));
return 1;
}
/*釋放所有由LIST開辟的空間*/
BOOL FreeListPrivateSpace(pLIST list)
{
if(FreeListNods(list) == 0)
return 0;
if(list->items)
{
free( list->items);/*釋放索引表*/
list->items = NULL;
}
return 1;
}
/*
*把所有由鏈表開辟的ITEM空間釋放出來
*/
BOOL FreeListNods(pLIST list)
{
int i;
if(list == NULL) return 0;
if(list->useditems > 0)
for( i = list->useditems -1;i >= 0 ;i--)
FreeListNod(list,0);
return 1;
}
/*
*刪除由CreateList創建的鏈表
*/
void DeleteList(pLIST list)
{
if(list == NULL)return;
FreeListPrivateSpace(list);
free(list);
}
/*修改一個結點的內容*/
BOOL ModifyListNod(pLIST list,void *data,int datasize,int order)
{
if(list == NULL ||data == NULL ) return 0;
if(datasize <= 0||order < 0)return 0;/*無效的引用序號和指針形結點不能處理*/
if(list->useditems <= order) return 0;
if(list->items[order].data && list->items[order].datasize <= 0)
return 0;/*指針結點則返回不處理*/
if(list->items[order].data == NULL)/*是空結點就直接使用*/
{
list->items[order].data = (void*)malloc(datasize + 1);
list->items[order].datasize = datasize ;
}
if(list->items[order].datasize < datasize)
{
free(list->items[order].data);
list->items[order].data = (void*)malloc(datasize + 1);
list->items[order].datasize = datasize ;
}
/*error judge*/
if(list->items[order].data == NULL )
return 0;
memset(list->items[order].data,0, list->items[order].datasize + 1);
memcpy(list->items[order].data,data,datasize);
return 1;
}
/*改變兩個結點的位置*/
BOOL ChangeTwoNods(pLIST list,int srcnodorder,int dsknodorder)
{
DATANOD tempnod;
if(srcnodorder < 0 || dsknodorder < 0) return 0;
if(list == NULL)return 0;
if(list->useditems <= srcnodorder ||list->useditems <= srcnodorder )
return 0;
tempnod = list->items[srcnodorder];
list->items[srcnodorder] = list->items[dsknodorder];
list->items[dsknodorder] = tempnod;
return 1;
}
int GetListNodeOrder(pLIST list,void *item,int itemsize)
{
int i;
void *nod;
if(list ==NULL || item == NULL || itemsize <= 0) return -1;
if(list->useditems <= 0)return -1;
for(i = 0;i < GetListNodsCount(list);i++)
{
nod = (void *)GetListNod(list,i);
if(nod)
if(memcmp(nod,item,itemsize)== 0)
return i;
}
return -1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -