搞开发也有些时间了,想记下些实用的东西,总是一拖在拖,一是每次都懒的不行,二是举的这东西难以上的了厅堂!最近闲的DT,还是整理一下吧!都是C开发非常常用的东西!
链表这东西应该是C
这个链表是仿linux内核做的,只不过简化了很多,只保留了最基本的一些操作!以为是仿,所以难免有疏漏!所以各位高人看到有什么错误或者不合理!就尽管板砖吧!(前提是你能够指出代码的谬误之处)。语法命名什么的也可以!
svLst.h就是链表了,需要链表的地方包含这个就可以了!
#ifndef __SVLST_H__
#define __SVLST_H__
#include <stddef.h>
/*
*double linked node;
*You must put the struct varable into your structure,
*regardless whar position it is;
*you can use 'CONTAIN_OFF' to find your struct varable's ptr
*/
typedef struct svLstNode{
struct svLstNode* pPre;
struct svLstNode* pNext;
}svLstNode;
/*
*Declare a svLstNode and init it;
*
*YOU MUST DECLARE a head node before you create a link!
*/
#define SVLST_MAKE_HEAD(name) svLstNode (name) = {&name, &name}
/*
*Init a svLstNode ;
*
*YOU MUST Init a head node before you use it!
*/
#define SVLST_INIT_HEAD(name) \
do{(name).pPre = &name; (name).pNext = &name;}while(0)
/*
*walk each node in the list;
*
*You can't del the node you get, because it is not save;
*if you want to del the node, use 'SVLST_NEXT_EACH_SAVE'
*instead;
*/
#define SVLST_NEXT_EACH(each, head) \
for((each) = (head)->pNext; (each) != head; (each) = (each)->pNext)
/*
*walk each node in the list;
*
*You can del the node you get, because it is save;
* The 'save' is used to save the current node.
*/
#define SVLST_NEXT_EACH_SAVE(each, save, head) \
for((each) = (head)->pNext, (save) = (each)->pNext; (each) != head; (each) = (save), (save) = (each)->pNext)
/*
*Get your struct pointor, according to your svLstNode* value;
*
*
*/
#define CONTAIN_OFF(structType, member, ptr) \
(structType*)((int)(ptr) - (int)(&(((structType*)0)->member)))
static inline int SVLST_INSERT(svLstNode* phead, svLstNode* pNode)
{
if((NULL == phead) || (NULL == pNode))
return -1;
pNode->pPre = phead;
pNode->pNext = phead->pNext;
phead->pNext = pNode;
pNode->pNext->pPre = pNode;
return 0;
}
static inline int SVLST_INSERT_TAIL(svLstNode* phead, svLstNode* pNode)
{
if((NULL == phead) || (NULL == pNode))
return -1;
pNode->pNext = phead;
pNode->pPre = phead->pPre;
phead->pPre = pNode;
pNode->pPre->pNext = pNode;
return 0;
}
static inline int SVLST_DEL(svLstNode* phead, svLstNode* pDel)
{
if(NULL == pDel)
return -1;
if(phead->pNext == phead)
return -1;
if(pDel->pPre)
pDel->pPre->pNext = pDel->pNext;
if(pDel->pNext)
pDel->pNext->pPre = pDel->pPre;
pDel->pPre = NULL;
pDel->pNext = NULL;
return 0;
}
#endif
代码都相对简单,就不在解释了,中间也有些注释。
main.c是一个使用链表的demo
#include <stdio.h>
#include <stdlib.h>
#include "svLst.h"
typedef struct memb
{
svLstNode mNode;
int num;
int count;
}memb;
memb mylst;
int main(int argc, char *argv[])
{
int i = 0;
memb* pMemb = NULL;
svLstNode * pNode = NULL, * pSave = NULL;
srand(time(NULL));
SVLST_INIT_HEAD(mylst.mNode);
for(i = 0; i < 10; i++)
{
pMemb = (memb *)malloc(sizeof(memb));
pMemb->num = rand() % 4;
pMemb->count = i;
// SVLST_INSERT(&mylst.mNode, &pMemb->mNode);
SVLST_INSERT_TAIL(&mylst.mNode, &pMemb->mNode);
}
SVLST_NEXT_EACH(pNode, &mylst.mNode)
{
pMemb = CONTAIN_OFF(memb, mNode, pNode);
printf("before %d: %d\n", pMemb->count, pMemb->num);
}
SVLST_NEXT_EACH_SAVE(pNode, pSave, &mylst.mNode)
{
pMemb = CONTAIN_OFF(memb, mNode, pNode);
if(pMemb->num == 3)
{
printf("delete %d: %d\n", pMemb->count, pMemb->num);
SVLST_DEL(&mylst.mNode, &pMemb->mNode);
free(pMemb);
pMemb = NULL;
}
}
SVLST_NEXT_EACH(pNode, &mylst.mNode)
{
pMemb = CONTAIN_OFF(memb, mNode, pNode);
printf("after %d: %d\n", pMemb->count, pMemb->num);
}
return 0;
}
话说这OSC的C语法没有高亮吗?
PS:转的注明出处吧!http://my.oschina.net/acikee/blog/198478