不带头单链表实现

#include<stdio.h>
#include<stdlib.h>
#include "list.h"

//不带头单链表
typedef struct LinkNode{
    LinkNode *next;
    int data;
}LinkNode;

//头插创建
LinkNode*HeadCreatList()
{

    LinkNode*first =(LinkNode*)malloc(sizeof(LinkNode));
    first->next=NULL;
    int flag = 1;

    for (int i=0;i<10;i++)
    {
        LinkNode*p = (LinkNode*)malloc(sizeof(LinkNode));
        p->data =i;
        p->next =NULL;

        if(flag)
        {
            first = p;
            flag = 0;
        }else{
            p->next= first;
            first=p;
        }
    }
    return first;
}


//尾插创建
LinkNode* TailCreatList(){


    LinkNode*first =(LinkNode*)malloc(sizeof(LinkNode));
    first->next=NULL;
    LinkNode*s ;
    int flag = 1;

    for (int i=0;i<10;i++)
    {
        LinkNode*p = (LinkNode*)malloc(sizeof(LinkNode));
        p->data =i;
        p->next =NULL;

        if(flag){
            first=p;
            s=p;
            flag=0;
        }else{
            s->next=p;
            s=p;
        }
    }

    return first;
}


//打印
void PrintfLinkList(LinkNode*h)
{

    if (h==NULL)
    {
        return;
    }

    LinkNode*p=h;
    while (p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }

    printf("\n");
}

//长度
int GetLength(LinkNode*head)
{
    if (head==NULL )
    {
        return 0;
    }

    int count=0;
    LinkNode*p=head;
    while (p!=NULL)
    {
        count++;
        p=p->next;
    }

    return count;
}

//指定节点前插入
LinkNode*InsertNode(LinkNode*h,int elem,int val)
{
    if (h==NULL)
    {
        return NULL;
    }

    LinkNode*p=h;
    if (p->data == elem){
        LinkNode*q =(LinkNode*)malloc(sizeof(LinkNode));
        q->data =val;
        q->next = p;
        h=q;
        return h;
    }
    LinkNode *s=p;
    while(p->next!=NULL)
    {
        if (p->next->data == elem){

            LinkNode*q =(LinkNode*)malloc(sizeof(LinkNode));
            q->data =val;

            q->next=p->next;
            p->next=q;
            return h;
        }
        s=p;
        p=p->next;
    }

    if (p->data==elem)
    {
        LinkNode*q =(LinkNode*)malloc(sizeof(LinkNode));
        q->data =val;
        q->next = p;
        s->next =q;
    }

    return h;
}



//删除节点
LinkNode* DeleteNodeList(LinkNode*h,int elem)
{
    if (h==NULL)
    {
        return NULL;
    }

    if (h->data==elem)
    {
        LinkNode*tmp = h;
        h=h->next;
        free(tmp);
        return h;
    }

    LinkNode*p=h;
    LinkNode*q = p;
    while (p->next!=NULL)
    {
        if (p->next->data==elem){
            LinkNode*s = p->next;
            p->next = s->next;
            free(s);
            return h;
        }
        q=p;
        p=p->next;
    }

    if (p->data==elem){
        q->next =NULL;
        free(p);
    }

    return h;
}

//销毁
void DestroyLinkList(LinkNode **h)
{
    if (h==NULL){
        return ;
    }

    LinkNode *p = *h;
    *h=NULL;

    while(p != NULL)
    {
        LinkNode *q =p;
        p = p->next;
        free(q);
    }
}

//逆置
LinkNode* ReverseLinkList(LinkNode*h)
{
    if (h==NULL||h->next==NULL)
    {
        return h;
    }

    LinkNode*p =h;
    LinkNode*q = p->next;
    while(q!=NULL)
    {
       p->next = q->next;
       q->next=h;
       h=q;
       q=p->next;
    }

    return h;
}

//合并两个有序
LinkNode*MergeLinkList(LinkNode*h1,LinkNode*h2)
{

    if (h1==NULL&&h2==NULL)
    {
        return NULL;
    }

    if (h1==NULL)
    {
        return h2;
    }

    if (h2==NULL)
    {
        return h1;
    }

    LinkNode*p1=h1;
    LinkNode*p2=h2;
    LinkNode*h3;
    LinkNode*s;
    int flag =1;

    while(p1!=NULL&&p2!=NULL)
    {
        if (flag){
            if (p1->data>p2->data)
            {
                h3=p1;
                p1=p1->next;
            }else{
                h3=p2;
                p2=p2->next;
            }
            s = h3;
            flag = 0;
        }else{
            if (p1->data>p2->data)
            {
                s->next = p1;
                p1=p1->next;
            }else{
                s->next = p2;
                p2=p2->next;
            }

            s=s->next;
        }
    }

    if (p1==NULL)
    {
        s->next = p2;
    }

    if (p2==NULL)
    {
        s->next = p1;
    }

    return h3;
}


//是否有环
bool isLinkListHaveCircle(LinkNode*h)
{
    if (h==NULL || h->next == NULL)
    {
        return false;
    }

    LinkNode*p = h;
    LinkNode*slow =p;
    LinkNode*fast =p->next;

    while(slow!=NULL&&fast!=NULL)
    {
        if (slow==fast){
            return true;
        }
        slow = slow->next;
        fast = fast->next;

        if(fast!=NULL){
            fast = fast->next;
        }
    }

    return false;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值