单链表的基本操作

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include "linklist.h"

//链表创建
linkptr linklist_create()
{
    linkptr L = NULL;
    L= (linkptr)malloc(sizeof(linknode));
    if(L)
    {
        //创建只有头结点的空链表
        L->data=0;
        L->count=0;
        L->next =NULL;
    }
    return L;
}
void linklist_show(linkptr L)
{
    while(L->next != NULL)
    {
        printf("%d\n",L->next->data);
        L=L->next;
    }
    
        
}
//头部插入
int linklist_head_insert(linkptr L,data_t x)
{
    linkptr p=(linkptr)malloc(sizeof(linknode));
    if(p)
    {
        p->data = x;
        p->next = L->next;
        L->next = p;
        
        L->count++;
        return 0;
    }else
        return -1;
}
//尾部插入,要找到尾部的位置才插入,比较耗时
int linklist_back_insert(linkptr L,data_t x)
{
    linkptr p = L;
    while(p && p->next != NULL)
    {
        p=p->next;
    }
    linkptr q=(linkptr)malloc(sizeof(linknode));
    if(q==NULL)
    {
        printf("q malloc null\n");
        return -1;
    }
    q->data = x;
    q->next = NULL;
    p->next = q;
    
    L->count++;
    
    return 0;
}
//任意位置插入
int linklist_index_insert(linkptr L,data_t x,int index)
{

    linkptr p,q;
    if(index < 0){
        printf("index <0\n");
        return -1;
    }else if(index==0){
        p=L;
        L->count++;
    }else{
        p =linklist_get_by_index(L,index-1);
        if(p==NULL){
            printf("index > length\n");
            return -1;
        }
        q=(linkptr)malloc(sizeof(linknode));
        if(q==NULL){
            printf("malloc q error\n");
            return -1;
        }
        q->data = x;
        q->next = p->next;
        p->next=q;
        L->count++;
    }
    return 0;
    
}

//按位置查找
linkptr linklist_get_by_index(linkptr L,int index)
{
    if(index < 0)
    {
        printf("index <0\n");
        return NULL;
    }
    //index>=0包括两种情况,一是index在有效范围内,二是大于链表的个数
    linkptr p = L;
    int i=-1;
    while(p->next && i<index)
    {
        p=p->next;
        i++;
    }
    if(i==index){
        return p;
    }else{    
        printf("index invalid\n");
        return NULL;
    }
        
}
//按data查找
linkptr linklist_get_by_data(linkptr L,data_t x)
{
    linkptr p = L->next;//从有数值的节点找起,头节点没有值跳过
    while(p && p->data != x)
    {
        p=p->next;
    }
    //循环跳出有两种情况:p为空/p->data == x
    return p;
}
//获取队列长度
int linklist_get_count(linkptr L)
{
    if(L) return L->count;
        
}
//按位置删除
int linklist_delete_by_index(linkptr L,int index)
{
    linkptr p,q;
    if(index < 0)
    {
        printf("index < 0\n");
        return -1;
    }
    if(index ==0)
    {
        p=L;
    }else{
        p = linklist_get_by_index(L,index-1);
    }
    if(p==NULL || p->next == NULL)//若index-1的next都为空已经指向末尾,没有可删除的元素
    {
        printf("index can't find\n");
        return -1;
    }else{
        q=p->next;//用q接收要删除的节点然后释放掉
        p->next = q->next;//p的next 节点指向待删除节点的下一个节点
        free(q);
        q=NULL;
        L->count--;
        return 0;
        
    }
}

//按值删除
int linklist_delete_by_data(linkptr L,data_t x)
{
    linkptr p = L->next;//从有数值的节点找起,头节点没有值跳过
    linkptr pre;
    while(p && p->data != x)
    {
        pre=p;
        p=p->next;
    }
    if(p==NULL)
    {
        printf("p is null\n");
        return -1;
    }
    if(p->next != NULL)
    {
        printf("find p\n");
        pre->next=p->next;
    }else{
        printf("p is the last\n");//若是最后一个节点,把前一个节点的next置空
        pre->next = NULL;
        
    }
    free(p);
    p=NULL;
    L->count--;
    return 0;
    
}
//链表倒置
void linklist_reverse(linkptr L)
{
    linkptr p,q;
    p=L->next;//p指向头节点的下一个节点
    L->next=NULL;//将原链表置空
    
    while(p!=NULL){
        q=p;
        p=p->next;
        q->next=L->next;
        L->next =q;
    }
    
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值