C link

1 link2.h

#ifndef _LINK2_H
#define _LINK2_H
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    int data;
    struct node *next;
}NODE,*linknode;

linknode createNode_2();
linknode insertLink_2(linknode head,linknode p);
linknode insertLink_2h(linknode head,linknode p);
void showLink_2(linknode head);
int lengthLink_2(linknode head);
linknode searchLink_2(linknode head,int data);
linknode deleteLink_2(linknode hea,int data);
linknode deleteLink_h(linknode hea,int data);
void freeLink_2(linknode head);
#endif

2 link2.c

#include"link2.h"

linknode createNode_2()
{
    linknode p=(linknode)malloc(sizeof(NODE));
    if(p==NULL)
    {
    printf("申请空间失败:\n")    ;
    return NULL;
    }
    printf("请输入结点信息:\n");
    scanf("%d",&p->data);
    p->next=NULL;
    return p;
}

linknode insertLink_2(linknode head,linknode p)
{
    linknode tail=head;
    if(head==NULL)
    {
    head=p;
    head->next=p;
    return head;
    } 
    while(tail->next!=head)
    //tail->next!=NULL
    {
    tail=tail->next;
    //指针后移
    }
    tail->next=p;
    p->next=head;//尾结点指向头结点
    return head;
}

linknode insertLink_2h(linknode head,linknode p)
{
    linknode tail=head;
    if(head==NULL)
    {
    head=p;
    head->next=p;
    return head;
    }
//    while(tail!=NULL)
    while(tail->next!=head)
    {
    tail=tail->next;
    }

    p->next=head;
    head=p;
    tail->next=p;
    return head;
}

void showLink_2(linknode head)
{
    linknode p=head;
    if(head==NULL)
    {
    printf("空链表\n");
    return ;
    }
    while(1)//
    {
    printf("first=%d ",p->data);
    p=p->next;
    if(p==head)//证明为循环链表,打印第二次
    {
        printf("\n");
        while(1)
        {
        printf("second=%d ",p->data);
        p=p->next;
        if(p==head)
            break;
        }
        break;
    }
    }
    printf("\n");
}

int lengthLink_2(linknode head)
{
    int len=0;
    linknode p=head;
    if(head==NULL)
    return len;
    while(1)
    {
    p=p->next;
    len++;
    if(p==head)
    {
        return len;
    }
    }
}

linknode searchLink_2(linknode head,int data)
{
    linknode p=head;
    if(head==NULL)
    return NULL;
    while(1)
    {
    if(p->data==data)
        return p;
    p=p->next;
    if(p==head)
        return NULL;
    }
}

//单向循环链表的删除
linknode deleteLink_2(linknode head,int data)
{
    //增加表头
    linknode p=(linknode)malloc(sizeof(NODE));
    linknode ph=head;
    p->next=head;
    linknode s,tmp;
    if(p->next==NULL)//空链表
    {
    free(p);
    return NULL;
    }

    if(p->next->data==data)
    {
    if(p->next->next==head)
    //第一个结点为删除的数据且只有1个结点情况
    {
        free(head);
        free(p);
        return NULL;
    }
    else//第一个结点为删除数据,至少2个结点
    {
        s=p->next;
        p->next=s->next;
        free(s);
        ph=p->next;
        s=p->next;
        while(1)
        {
        if(s->next==head)
        {
            s->next=ph;
            free(p);
            return ph;
        }
        else
            s=s->next;
        }
    }

    }
    //删除其他的结点情况
    else
    {
    if(p->next->next==head)
    //只有一个结点且数据不为删除的数据
    {
        free(p);
        return head;
    }
    //删除其他结点
    tmp=p;//保存表头指针
    while(1)
    {
        p=p->next;
        if(p->next->data==data)
        {
            s=p->next;
            p->next=s->next;
            free(s);
            free(tmp);
            return head;
        }
    }

    }

}
void freeLink_2(linknode head)
{
    linknode p=head;
    linknode s=head;
    if(head==NULL)
    return;
    while(1)
    {
    if(p->next==head)
    {
        free(p);
        return;
    }
    else 
    {
        s=s->next;
        free(p);
        p=s;
    }
    }
}

3 main

#include"link2.h"

int main()
{
    int i,len,data;
    linknode p,head=NULL;
    for(i=0;i<5;i++)
    {
    p=createNode_2();
    if(p==NULL)
    {
        printf("结点创建失败:\n");
        continue;
    }
    head=insertLink_2(head,p);
    }
    showLink_2(head);
    len=lengthLink_2(head);
    printf("len=%d\n",len);
    printf("请输入查找的数据:\n");
    scanf("%d",&data);
    p=searchLink_2(head,data);
   if(p==NULL)
    printf("没有找到该数据\n");
    else
    printf("%d\n",p->data);
    printf("请输入删除的数据:\n");
    scanf("%d",&data);
    head=deleteLink_2(head,data);
    showLink_2(head);
    freeLink_2(head);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值