带头单链表实现

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


typedef struct LinkNode{
    LinkNode *next;
    int data;
}LinkNode;

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

    LinkNode*head = (LinkNode*)malloc(sizeof(LinkNode));
    head->next= NULL;

    for (int i=0;i<10;i++)
    {

        LinkNode*p = (LinkNode*)malloc(sizeof(LinkNode));
        p->data = i;//+rand()%10;
        p->next= head->next;
        head->next=p;
    }
    return head;
}

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

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

        LinkNode*p = (LinkNode*)malloc(sizeof(LinkNode));
        p->data = i;//+rand()%10;
        p->next = NULL;
        q->next = p;
        q = p;
    }

    return head;
}

void PrintfList(LinkNode*h)
{

    if (h==NULL||h->next==NULL)
    {
        return;
    }

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

    printf("\n");
}

void TailInsert(LinkNode*h,int i){

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

    LinkNode*p = (LinkNode*)malloc(sizeof(LinkNode));
    p->data = i;
    p->next=NULL;

    q->next = p;
}



LinkNode* ReverseList1(LinkNode*head)
{

    if (head==NULL||head->next==NULL)
    {
        return NULL;
    }

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

    return head;
}


LinkNode* ReverseList(LinkNode*head)
{

    if (head==NULL||head->next==NULL)
    {
        return NULL;
    }

    LinkNode*p = head->next;
    LinkNode*q = p->next;
    LinkNode*s;

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

    head->next = p;
    return head;
}

int GetLengthOfList(LinkNode*head)
{
    if (head==NULL||head->next==NULL)
    {
        return -1;
    }

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

    return count;
}

bool InsertIndex(LinkNode*head,int idx,int val)
{
    int len = GetLengthOfList(head);

    if (head==NULL||idx<0||idx>=len)
    {

        return false;
    }

    int i=0;
    LinkNode*p=head;

    while(p->next!=NULL)
    {
        if (i==idx)
        {
            LinkNode*q = (LinkNode*)malloc(sizeof(LinkNode));
            q->data = val;
            q->next= p->next;
            p->next= q;
            return true;
        }

        i++;
        p=p->next;
    }

    return false;
}

bool DeleteNode(LinkNode*head,int idx)
{

    int len = GetLengthOfList(head);
    if (head==NULL||idx<0||idx>len)
    {
        return false;
    }

    int i=0;
    LinkNode*p=head;

    while(p->next!=NULL)
    {
        if (idx==i){
            LinkNode*q = p->next;
            p->next=q->next;
            free(q);
            return true;
        }
        i++;
        p=p->next;
    }
    return false;
}


bool IsEmpty(LinkNode*head)
{

    if (head==NULL||head->next ==NULL){
        return true;
    }

    return false;
}

void DetroyNode(LinkNode*head)
{
    if (head==NULL||head->next ==NULL){
        return ;
    }

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

   free(head);
}


//  合并两个有序
LinkNode* MergeList(LinkNode*h1,LinkNode*h2)
{
    if (h1==NULL&&h2==NULL)
    {
        return NULL;
    }

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

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

    LinkNode*p=h1->next;
    LinkNode*q=h2->next;
    LinkNode*s = h1;
    LinkNode*s1 = s;

    while(p!=NULL&&q!=NULL)
    {
        if (p->data<q->data)
        {
            s->next=p;
            p=p->next;
        }else{
            s->next=q;
            q=q->next;
        }
        s=s->next;
    }

if (p==NULL)
{
    s->next=q->next;
}

    if (q==NULL)
    {
        s->next=p->next;
    }
    return s1;

}


bool IsHaveCirle(LinkNode*head)
{
    if (head==NULL||head->next==NULL)
    {
        return false;
    }


    LinkNode *slow = head->next;
    LinkNode*fast = slow->next;

     while( fast !=NULL){
          if (fast==slow) {
           return true;
           }

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

    return false;

}


int main() {
    printf("hello \n");

    LinkNode*list1 = HeadCreat();
    LinkNode*list2 = TailCreat();
    PrintfList(list1);
    PrintfList(list2);

    LinkNode list3;
    for (int i=0;i<10;i++){
        TailInsert(&list3,i*2);
    }
    PrintfList(&list3);
    LinkNode *list4= MergeList(list2,&list3);
    PrintfList(list4);
if (!IsHaveCirle(&list3)){
        printf("环\n");
    }

    printf("%d\n",GetLengthOfList(list1));
    if (InsertIndex(list1,-1,99))
    {
        PrintfList(list1);
    }else{
        printf("插入失败1 \n");
        PrintfList(list1);
    }


    if (DeleteNode(list1,0))
    {
        PrintfList(list1);
    }

    if (InsertIndex(list1,20,99))
    {
        PrintfList(list1);
    }else{
        printf("插入失败2\n");
        PrintfList(list1);
    }

    if ( InsertIndex(list1,0,99))
    {
        PrintfList(list1);
    }else{
        printf("插入失败3\n");
        PrintfList(list1);
    }

    if ( InsertIndex(list1,4,99))
    {
        PrintfList(list1);
    }else{
        printf("插入失败4\n");
        PrintfList(list1);
    }

    LinkNode*list6 = ReverseList1(list1);
    PrintfList(list6);

    if (IsEmpty(list1)){
        printf("空");
    }else{
        printf("非空 \n");
    }

    DetroyNode(list1);
    if (IsEmpty(list1)){
        printf("空 \n");
    }

    return 0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值