简单的带头节点的单链表建立和一些基本运算

利用链表的头节点来操作链表

代码如下:

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

typedef int data_t;

typedef struct node
{
    data_t data;
    struct node *next;
}linklist;

//初始化

linklist *creatLinKlist(void)
{
    linklist *head=(linklist *)malloc(sizeof(linklist));
    if(head==NULL)
    {
        perror("malloc");
        return NULL;
    }

    head->next=NULL;
    head->data=-1;

    return head;
}

//判空
int linklist_is_empty(linklist *head)
{
    return (head->next==NULL)?1:0;
}

//求表长
int linklist_length(linklist *head)
{
    int len=0;
    linklist *p=head->next;
    while(p!=NULL)
    {
        len++;
        p=p->next;
    }
    return len;
}

//按位置添加节点

int linklist_add(linklist *head,int pos,data_t data)
{
    int len=linklist_length(head);
    if(pos<0 || pos>len)
    {
        printf("pos输入不合法\n");
        return -1;
    }

    //准备新节点
    linklist *new=(linklist *)malloc(sizeof(linklist));
    new->data=data;
    new->next=NULL;

    //插入前,找到pos节点的前一个节点
    linklist *p=head;

    while(pos--)
    {
        p=p->next;
    }

    //先连后断
    new->next=p->next;
    p->next=new;

    return 0;
}


//按位置节点删除

int linklist_shanchu(linklist *head,int pos)
{
    if(linklist_is_empty(head))
    {
        printf("biao is null\n");
        return -1;
    }
    int len=linklist_length(head);

    if(pos<0 || pos>=len)
    {
        printf("pos不合法\n");
        return -1;
    }
    //找到pos前一个节点
    linklist *p=head;

    while(pos--)
    {
        p=p->next;
    }
    linklist *q=p->next;
    p->next=q->next;

    free(q);

    q=NULL;

    return 0;
}


//按位置查找节点
data_t linklist_weicha(linklist *head,int pos)
{
    if(linklist_is_empty(head))
    {
        printf("biao is null\n");
        return -1;
    }
    int len=linklist_length(head);
    if(pos<0 || pos>len)
    {
        printf("pos不合法\n");
        return -1;
    }
    linklist *p=head;

    while(pos--)
    {
        p=p->next;
    }

    return p->data;
}

//按位置修改节点

int linklist_weixiu(linklist *head,int pos,data_t data)
{
    if(linklist_is_empty(head))
    {
        printf("biao is null\n");
        return -1;
    }
    int len=linklist_length(head);

    if(pos<0)
    {
        printf("pos 不合法\n");
        return -1;
    }

    linklist *p=head;
    while(pos--)
    {
        p=p->next;
    }
    p->data=data;

    return 0;

}

//按值查找节点
int linklist_zhicha(linklist *head,data_t data)
{
    if(linklist_is_empty(head))
    {
        printf("biao is null\n");
        return -1;
    }

    linklist *p=head;
    int i=0;
    while(p!=NULL)
    {
        if(p->data==data)
        {
            return i;
        }
        i++;
        p=p->next;
    }

    printf("没有这个值\n");
    return -1;
}

//按值删除节点
void linklist_zhishan(linklist *head,data_t data)
{
    int a=linklist_zhicha(head,data);
    linklist_shanchu(head,a);

    // return 0;
}

//按值修改节点
int linklist_zhixiu(linklist *head,data_t old,data_t new)
{
    int a=linklist_zhicha(head,old);
    linklist_weixiu(head,a,new);

    return 0;
}

//清空链表
int linklist_clear(linklist *head)
{
    if(linklist_is_empty(head))
    {
        printf("biao is null\n");
        return -1;
    }
    linklist *p=head->next;
    linklist *q=NULL;
    head->next=NULL;

    while(p!=NULL)
    {
        q=p->next;
        free(p);
        p=NULL;
        p=q;
    }
    return 0;
}

//销毁链表
void linklistdestory(linklist **head)
{
    linklist_clear(*head);
    free(*head);

    *head=NULL;
}

//打印链表
void linklistdisplay(linklist *head)
{
    linklist *p=head->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }

    puts("");
}

//链表逆序
void linklistnixu(linklist *head)
{
    linklist *p=head->next;
    head->next=NULL;
    linklist *q=NULL;

    while(p!=NULL)
    {
        q=p->next;
        p->next=head->next;
        head->next=p;
        p=q;
    }
}


int main(int argc, char *argv[])
{ 

    linklist *head=creatLinKlist();
    if(head==NULL)
    {
        perror("creatsLinKlist");
        return -1;
    }

    //赋值,插入
    int i=0;
    while(i<10)
    {

        linklist_add(head,i,i+1);
        i++;
    }
    
    //打印
    linklistdisplay(head);

    //判断是否为空
    int m;
    m=linklist_is_empty(head);
    printf("m=%d\n",m);

    //求表长
    int len=linklist_length(head);
    printf("len=%d\n",len);
    
    linklist_shanchu(head,6);
    linklistdisplay(head);

    //按位置查找
    
    data_t a;
    a=linklist_weicha(head,9);

    printf("%d\n",a);

    //按位置进行修改
    linklist_weixiu(head,8,66);
    linklistdisplay(head);

    //按值进行删除
    linklist_zhishan(head,66);
    linklistdisplay(head);

    //按值进行修改
    linklist_zhixiu(head,8,99);
    linklistdisplay(head);

    //销毁
    linklistnixu(head);
    linklistdisplay(head);

    linklistdestory(&head);
    linklistdisplay(head);
    return 0;
} 

链表要想真正的学好,就是要不断的去敲,不断的改进!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值