单链表的简单操作

typedef struct Node
{
    int date;
    struct Node *next;
}node;

//链表的初始化
void Init(node **head)
{
    if (*head != NULL)
    {
        node * p = (node*)malloc(sizeof(node));
        p->next = NULL;
        (*head) = p;
    }
}
//创建头插法
void create_from_head(node *head)
{
    if (head != NULL)
    {
        int date = 0;
        scanf("%d", &date);
        while (-1 != date)
        {
            node *p = (node *)malloc(sizeof(node));
            p->date = date;
            p->next = head->next;
            head->next = p;
            scanf("%d", &date);
        }
    }
}
//尾插法
void create_from_tail(node *head)
{
    if (head != NULL)
    {
        int date = 0;
        scanf("%d", &date);
        node *q = head;
        while (-1 != date)
        {
            node *p = (node*)malloc(sizeof(node));
            p->date = date;
            q->next = p;
            q = q->next;
            scanf("%d", &date);
        }
        q->next = NULL;
    }
}
//插入
int insert(node *head,int insert_date,int pre)//在pre之前插入insert_date
{
    if (head != NULL)
    {
        node *p = (node *)malloc(sizeof(node));
        p = head->next;

        while (p)
        {
            if (p->next->date == pre)
            {
                node *date = (node *)malloc(sizeof(node));
                date->date = insert_date;
                date->next = p->next;
                p->next = date;
                return 1;//成功
            }
            p = p->next;
        }
    }
    return -1;//失败
}
//输出
void Printf(node *head)
{
    if (head != NULL)
    {
        node *p = head->next;
        while (p)
        {
            printf("%d -> ", p->date);
            p = p->next;
        }
        printf("\b\b\b\b");
        printf("    ");
    }
}
//删除节点
void delete_node(node *head,int date)
{

    if (head != NULL)
    {
        node *p = (node*)malloc(sizeof(node));
        p = head;
        while (p->next)
        {
            if (p->next->date == date)
            {
                node *q = (node*)malloc(sizeof(node));
                q = p->next;
                p->next = p->next->next;
                free(q);
            }
            p = p->next;
        }
    }
}
//将两个节点合并,并且使用原来提供的链表,但是会对原来的链表造成破坏。
void mermy(node *A, node *B)
{
    if (A != NULL&&B != NULL)
    {
        node *C = A;;
        node *pa = A->next;
        node *pb = B->next;

        while (pa&&pb)//同时不为空
        {
            if (pa->date < pb->date)
            {
                C->next = pa;
                pa = pa->next;
            }
            else
            {
                C->next = pb;
                pb = pb->next;
            }
            C = C->next;
        }
        if (pa)
        {
            C->next = pa;
        }
        if (pb)
        {
            C->next = pb;
        }
    }
}
//求长度
void Length(node *head,int &length)
{
    if (head != NULL)
    {
        node *p = head->next;
        while (p)
        {
            p = p->next;
            length++;
        }
    }
}
//查找
node * search(node *head,int date)
{
    node *result = (node*)malloc(sizeof(node));
    result->date = -1;
    if (head != NULL)
    {
        node *p = (node *)malloc(sizeof(node));
        p = head->next;

        while (p)
        {
            if (p->date == date)
            {
                result = p;
                return result;//成功
            }
            p = p->next;
        }
    }
    return result;//失败
}
//根据位置查找
node * search_site(node *head, int date)
{
    node *result = (node*)malloc(sizeof(node));
    result->date = -1;
    if (head != NULL)
    {
        node *p = (node *)malloc(sizeof(node));
        p = head->next;
        int i = 1;
        while (p)
        {
            if (i == date)
            {
                result = p;
                return result;//成功
            }
            p = p->next;
        }
    }
    return result;//失败
}
int main(void)
{

#if 1

    node *head;

    //初始化
    Init(&head);

    //创建链表,头插法
    create_from_head(head);
    printf("\n");
    Printf(head);
    printf("\n");

    //查找,按值
    node *p = (node*)malloc(sizeof(node));
    p = search(head,10);
    printf("\n");
    printf("%d",p->date);
    printf("\n");

    //查找,按位置
    node *q = (node*)malloc(sizeof(node));
    q = search_site(head, 1);
    printf("\n");
    printf("%d", q->date);
    printf("\n");

    //长度
    int lenght = 0;
    Length(head, lenght);
    printf("%d\n", lenght);

#endif

#if 0

    //创建链表,尾插法
    node *head1;
    Init(&head1);
    create_from_tail(head1);
    printf("\n");
    Printf(head1);
    printf("\n");

    //插入,按值插入
    insert(head1, 10,20);
    printf("\n");
    Printf(head1);
    printf("\n");

    //删除
    delete_node(head1,10);
    printf("\n");
    Printf(head1);
    printf("\n");

#endif

#if 0

    //合并
    node *head1;
    node *head2;
    Init(&head1);
    create_from_tail(head1);
    Init(&head2);
    create_from_tail(head2);
    mermy(head1,head2);
    printf("\n");
    Printf(head1);
    printf("\n");

#endif

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值