list.c

来自「在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LE」· C语言 代码 · 共 211 行

C
211
字号
/****************************************************************
**                                                              *
**  FILE         :  List.C                                      *
**  COPYRIGHT    :  (c) 2001 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**  By : CCH 2002.1.15                                          *
****************************************************************/
#include "includes.h"
#include "list.h"


BOOLEAN CheckList(LIST *Lp)
{
    INT32U    count;
    LISTNODE *curnode;
	
    if (Lp == 0) return FALSE;
	
    count = 0;
    curnode = Lp->Head;
    while(curnode != 0)
    {
        count++;
        curnode = curnode->next;
    }
    if (count != Lp->Item) return FALSE;
	
    count = 0;
    curnode = Lp->Tail;
    while(curnode != 0)
    {
        count++;
        curnode = curnode->prv;
    }
    if (count != Lp->Item) return FALSE;
    else return TRUE;
}

BOOLEAN InitList(LIST *Lp)
{
    if (Lp == 0) return FALSE;
	
    Lp->Head = 0;
    Lp->Tail = 0;
    Lp->Item = 0;
    return TRUE;
}

INT32U ListItem(LIST *Lp)
{
    if (Lp == 0) return 0;
    else return (Lp->Item);
}

LISTMEM *GetListHead(LIST *Lp)
{
    if (Lp == 0 || Lp->Item == 0) return 0;
    else return ((LISTMEM *)Lp->Head + sizeof(NODE));
}

LISTMEM *GetListTail(LIST *Lp)
{
    if (Lp == 0 || Lp->Item == 0) return 0;
    else return ((LISTMEM *)Lp->Tail + sizeof(NODE));
}

LISTMEM *ListNextEle(LISTMEM *Bp)
{
    LISTNODE *curnode;
	
    if (Bp == 0) return 0;
    curnode = (LISTNODE *)(Bp - sizeof(NODE));
    if ((curnode = curnode->next) == 0) return 0;
    else return ((LISTMEM *)curnode + sizeof(NODE));
}

LISTMEM *ListPrvEle(LISTMEM *Bp)
{
    LISTNODE *curnode;

    if (Bp == 0) return 0;
    curnode = (LISTNODE *)(Bp - sizeof(NODE));
    if ((curnode = curnode->prv) == 0) return 0;
    else return ((LISTMEM *)curnode + sizeof(NODE));
}

/* Return: pointer to Bp's next element */
LISTMEM *DelListEle(LIST *Lp, LISTMEM *Bp)
{
    LISTNODE *curnode, *prvnode, *nextnode;

    if (Lp == 0 || Bp == 0) return 0;
    if (Lp->Item == 0) return 0;

    Lp->Item--;
    curnode  = (LISTNODE *)(Bp - sizeof(NODE));
    prvnode  = curnode->prv;
    nextnode = curnode->next;
    if (prvnode == 0) Lp->Head = nextnode;
    else {
        prvnode->next = nextnode;
    }
    if (nextnode == 0) {
        Lp->Tail = prvnode;
        return 0;
    } else {
        nextnode->prv = prvnode;
        return ((LISTMEM *)nextnode + sizeof(NODE));
    }
}

/* Return: List head */
LISTMEM *DelListHead(LIST *Lp)
{
    LISTMEM *Bp;

    if (Lp == 0 || Lp->Item == 0) return 0;

    Bp = (LISTMEM *)Lp->Head + sizeof(NODE);
    DelListEle(Lp, Bp);
    return Bp;
}

/* Return: List Tail */
LISTMEM *DelListTail(LIST *Lp)
{
    LISTMEM *Bp;

    if (Lp == 0 || Lp->Item == 0) return 0;

    Bp = (LISTMEM *)Lp->Tail + sizeof(NODE);
    DelListEle(Lp, Bp);
    return Bp;
}

BOOLEAN AppendListEle(LIST *Lp, LISTMEM *Bp)
{
    LISTNODE *curnode;

    if (Lp == 0 || Bp == 0) return FALSE;

    curnode = (LISTNODE *)(Bp - sizeof(NODE));
    curnode->prv = Lp->Tail;
    if (Lp->Item == 0) {
        Lp->Head = curnode;
    } else {
        Lp->Tail->next = curnode;
    }
    curnode->next = 0;
    Lp->Tail = curnode;
    Lp->Item++;
    return TRUE;
}

BOOLEAN BInsertListEle(LIST *Lp, LISTMEM *CurBp, LISTMEM *InsBp)
{
    LISTNODE *curnode, *insnode;
	
    if (Lp == 0 || CurBp == 0 || InsBp == 0) return FALSE;
    if (Lp->Item == 0) return FALSE;

    curnode  = (LISTNODE *)(CurBp - sizeof(NODE));
    insnode  = (LISTNODE *)(InsBp - sizeof(NODE));

    insnode->next = curnode;
    insnode->prv  = curnode->prv;
    if (curnode->prv == 0){
        Lp->Head = insnode;
    } else {
        curnode->prv->next = insnode;
    }
    curnode->prv = insnode;
    Lp->Item++;
    return TRUE;
}

BOOLEAN AInsertListEle(LIST *Lp, LISTMEM *CurBp, LISTMEM *InsBp)
{
    LISTNODE *curnode, *insnode;

    if (Lp == 0 || CurBp == 0 || InsBp == 0) return FALSE;
    if (Lp->Item == 0) return FALSE;
    
    curnode = (LISTNODE *)(CurBp - sizeof(NODE));
    insnode = (LISTNODE *)(InsBp - sizeof(NODE));
    
    insnode->next = curnode->next;
    insnode->prv  = curnode;
    if(curnode->next == 0){
        Lp->Tail = insnode;
    } else {
        curnode->next->prv = insnode;
    }
    curnode->next = insnode;
    Lp->Item++;
    return TRUE;
}

BOOLEAN InitMemList(LIST *memLp, LISTMEM *addr, INT32U nblks, INT32U blksize)
{
    if (!InitList(memLp)) return FALSE;

    addr += sizeof(NODE);
    for(; nblks > 0; nblks--){
        AppendListEle(memLp, addr);
        addr += blksize;
    }
    return TRUE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?