C语言实现单向链表

单向链表
注意:
1.头结点的指针域指向链表第一个节点,数据域不使用
2.单链表最后一个节点的指针域必须设置为NULL
单向链表
-单向链表节点

typedef int T;
//节点
typedef struct node{
    T data;//数据域,存放节点的数据
    struct node *next;//指针域,指向下一个节点
}linknode_t,*linklist_t;

C语言实现

  • 创建空链表
linklist_t create_emptylist()
{
    //分配头节点空间
    linklist_t head = (linklist_t)malloc(sizeof(linknode_t));
    if(head)
    {
        head->next = NULL;//头节点的指针域指向NULL
        //head->data = -1;
    }

    return head;
}
  • 插入节点
    失败返回NULL
//从指定位置之后插入
static linklist_t insert(linklist_t p,T dt)
{
    //1.构造节点
    linklist_t newnode = (linklist_t)malloc(sizeof(linknode_t));
    if(newnode)
    {
        newnode->data = dt;
        //将新节点的指针域指向插入位置的下一个节点
        newnode->next = p->next;
        //将插入位置的指针域指向新节点
        p->next = newnode;
    }

    return newnode;
}

//从头部插入
linklist_t insert_from_head(linklist_t head,T dt)
{
    return insert(head,dt);
}

//从尾部插入
linklist_t insert_from_tail(linklist_t head,T dt)
{
    //找到尾部
    while(head->next)
        head = head->next;
    //往尾部插入
    return insert(head,dt);
}
  • 查找节点
    失败返回NULL
//按位置查找
linklist_t find_by_index(linklist_t head,int index)
{
    int i = 1;
    //略过头节点
    head = head->next;

    while(head)
    {
        if(i==index)
            return head;
        head = head->next;
        i++;
    }
    
    return NULL;
}

//按值查找
linklist_t find_by_value(linklist_t head,T dt)
{
    //略过头节点
    head = head->next;

    while(head)
    {
        if(head->data==dt)
            return head;
        head = head->next;
    }
    
    return NULL;
}
  • 删除节点
    失败返回NULL
//按位置删除,返回删除节点的前一个节点的地址
linklist_t delete_by_index(linklist_t head,int index)
{
    if(index<1)
    {
        printf("error index!\n");
        return NULL;
    }

    linklist_t prev = NULL,del_node = NULL;
    //如果要删除的节点不存在,直接退出
    del_node = find_by_index(head,index);
    if(!del_node)
        return NULL;

    //删除的是第一个节点,前一个节点是头节点
    if(index==1)
        prev = head;
    else
        prev = find_by_index(head,index-1);

    //将要删除节点的前一个节点的指针域指向要删除节点的下一个节点
    prev->next = del_node->next;
    //释放删除节点空间
    free(del_node);
    del_node = NULL;

    return prev;
}

//按值删除
linklist_t delete_by_value(linklist_t head,T dt)
{
    //prev记录前一个节点
    linklist_t prev = head;
    head = head->next;

    while(head)
    {
        if(head->data==dt)
            break;
        //记录head的前一个
        prev = head;
        head = head->next;
    }

    if(!head)
        return NULL;

    //删除节点的前一个节点的指针域指向要删除节点的下一个节点
    prev->next = head->next;
    //释放节点空间
    free(head);
    head = NULL;

    return prev;
}
  • 遍历
void travel(linklist_t head)
{
    //略过头节点
    head = head->next;

    while(head){
        printf("%d ",head->data);//打印单链表内容
        head = head->next;
    }
    printf("\n");
}
  • 清空
void clear(linklist_t head)
{
    linklist_t p = head->next,q = NULL;

    //将头节点的指针域指向NULL
    head->next = NULL;

    //释放链表的其他节点
    while(p){
        q = p;
        p = p->next;
        free(q);
    }
    q = NULL;
}
  • 销毁
void destroy(linklist_t *phead)
{
    //释放除头节点以外的所有节点
    clear(*phead);
    //释放头节点
    free(*phead);
    *phead = NULL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值