简单的单链表 接口

1 篇文章 0 订阅

链表具有头部节点,省的总处理头节点麻烦

提出api

typedef void CALLBACK onDataCbk(int Id, char* data);
typedef struct linklist
{
    char* data;
    struct linklist* next;
}list, * plist;


extern plist create_list();
extern void print_list(plist head, onDataCbk Cbk);
extern bool delete_node(plist head, char* DataP);
extern bool insert_node(plist head, char* DataP, int DataLen, int Inx);
extern int len_list(plist head);
extern bool clear_list(plist head);
extern bool delete_next_node(plist preNode);

//在回调中做特定处理,indata是判断条件,由回调中用
int delete_node_with_cbk(plist head,char*InData,onDataCbk Cbk);
  1.  
 /*创建链表*/
plist create_list()
{
    plist phead = (plist)malloc(sizeof(list));
    phead->data = NULL;
    phead->next = NULL;
    return phead;
}
/*打印输出*/
void print_list(plist head, onDataCbk Cbk)
{
    head = head->next;
    while (head)
    {
        Cbk(0,head->data);
        head = head->next;
    }
}
/*按序号查找结点值 从1开始计算*/
plist get_elem(plist head, int inx)
{
    //本算法取出单链表L(带头结点)中第i个位置的结点指针
    int j = 1;  //计数,初始为1
    plist pHd = head;  //头结点指针赋给p
    while ((pHd->next) && j < inx) {  
        pHd = pHd->next;
        j++;
    }
    return pHd;
}
/*插入结点*/
bool insert_node(plist head, char* DataP,int DataLen,int Inx)
{
    plist DesNode = get_elem(head, Inx);
    plist pNew = (plist)malloc(sizeof(list));
    pNew->data = (char*)malloc(DataLen+1);
    ZeroMemory(pNew->data, DataLen + 1);
    memcpy(pNew->data, DataP, DataLen);

    pNew->next = DesNode->next;  
    DesNode->next = pNew;  
    return true;
}
int len_list(plist head)
{
    int Len = 0;
    while (head) {
        head = head->next;
        Len++;
    }
    return Len-1;
}
void base_free(char*msg)
{
    if(msg != NULL){
        free(msg);
    }
}

bool clear_list(plist head)
{
    plist pTemp = head;
    while (head) {
        pTemp = head;
        head = head->next;
        base_free(pTemp->data);/*释放被删除的data占用的空间*/
        base_free((char*)pTemp);/*释放被删除的结点占用的空间*/

    }
    return true;
}
/*删除下一结点*/
bool delete_next_node(plist preNode)
{
    plist pTemp = preNode->next;
    preNode->next = pTemp->next;
    base_free(pTemp->data);/*释放被删除的data占用的空间*/
    base_free((char*)pTemp);/*释放被删除的结点占用的空间*/
    return true;
}

/*删除结点,采用回调函数*/
int delete_node_with_cbk(plist head,char*InData,onDataCbk Cbk)
{
    int Count = -1;
    if (head == NULL) {
        win_log(LOG_WARN, "-----head is null-----------");
        return Count;
    }
    plist PreNode = head;
    plist CuNode = head->next;

    Count = 0;
    while (CuNode)
    {
        if (Cbk(1, InData, CuNode->data) == true) {
            PreNode->next = CuNode->next; /*elem前一个结点的next指向elem元素后一个结点*/
            base_free(CuNode->data);/*释放被删除的data占用的空间*/
            base_free((char*)CuNode);/*释放被删除的结点占用的空间*/
            CuNode = PreNode;
            Count++;
        }
        PreNode = CuNode;
        CuNode = CuNode->next;
    }
    return Count;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值