链表的逆置,归并,拆分以及其他函数集合

#include <stdio.h>
#include <stdlib.h>
struct node
{
    int data;
    struct node *next;
};

struct node * creat1(int n)//逆序建立链表
{
    struct node *head,*p;
    int i;
    head=(struct node *)malloc(sizeof(struct node));
    head->next=NULL;
    for(i=1;i<=n;i++)
    {
        p=(struct node *)malloc(sizeof(struct node));
        scanf("%d",&p->data);
        p->next=head->next;
        head->next=p;
    }
    return (head);
}

struct node * creat2(int n)//顺序建立链表
{
    struct node *head,*p,*tail;
    int i;
    head=(struct node *)malloc(sizeof(struct node));
    head->next=NULL;
    tail=head;
    for(i=1;i<=n;i++)
    {
        p=(struct node *)malloc(sizeof(struct node));
        scanf("%d",&p->data);
        p->next=NULL;
        tail->next=p;
        tail=p;
    }
    return (head);
}

struct node *search(struct node *head,int key)//查找节点
{
    struct node *p;
    p=head->next;
    while(p!=NULL)
    {
        if(p->data==key)
            return (p);
        else
            p=p->next;
    }
    return NULL;
}
void insert(struct node *q,struct node *p,int key)//单链表节点的插入
{
    q=(struct node *)malloc(sizeof(struct node));
    if(!q)
    {
        printf("不能分配内存空间!n");
        exit(0);
    }
    q->data=key;
    q->next=NULL;
    q->next=p->next;
    p->next=q;
}

void del(struct node *head,int key)//删除节点
{
    struct node *p,*q;
    int flag=0;
    p=head;
    while(p->next!=NULL)
    {
        if(p->next->data==key)
        {
            flag=1;
            break;
        }
        else
            p=p->next;
        if(flag==1)
        {
            q=p->next;
            p->next=q->next;
            free(q);
        }
    }
}

void reverse(struct node *head)//单链表的逆置
{
    struct node *p,*q;
    p=head->next;
    head->next=NULL;
    q=p->next;
    while(p!=NULL)
    {
        p->next=head->next;
        head->next=p;
        p=q;
        if(q!=NULL)
            q=q->next;
    }
}

struct node *merge(struct node *head1,struct node *head2)//单链表的归并
{
    struct node *p1,*p2,*tail;
    p1=head1->next;
    p2=head2->next;
    tail=head1;
    free(head2);
    while(p1&&p2)
    {
        if(p1->data<p2->data)
        {
            tail->next=p1;
            tail=p1;
            p1=p1->next;
        }
        else
        {
            tail->next=p2;
            tail=p2;
            p2=p2->next;
        }
        if(p1)
            tail->next=p1;
        else
            tail->next=p2;
    }
    return (head1);
}

struct node *split(struct node *head1)//单链表的拆分
{
    struct node *head2,*p,*q;
    head2=(struct node*)malloc(sizeof(struct node));
    head2->next=NULL;
    p=head1->next;
    head1->next=NULL;
    q=p->next;
    while(p!=NULL)
    {
        if(p->data>=0)
        {
            p->next=head1->next;
            head1->next=p;
        }
        else
        {
            p->next=head2->next;
            head2->next=p;
        }
        p=q;
        if(q!=NULL)
            q=q->next;
    }
    return (head2);
}

int main()
{
    int m,n,k,d,j=0;
    struct node *q,*h,*a,*y,*z;
    scanf("%d",&n);
    h=creat2(n);
    //a=creat2(n);

    /*
    scanf("%d %d",&k,&m);
    y=search(h,k);//链表的查找节点
    insert(h,y,m);//在找到的节点后插入一个值
    */
    /*
    scanf("%d",&d);
    del(h,d);//删除节点
    */
    //reverse(h);//单链表的逆置
    /*
    z=merge(h,a);//单链表的归并
    q=z->next;
    y=split(h);
    q=y->next;
    */

    q=h->next;
    while(q!=NULL)
    {
         j++;
         if(j==n+1)
            printf("%d
",q->data);
         else
            printf("%d ",q->data);
         q=q->next;
    }
    return 0;
}


请dalao不吝赐教。
原文地址:https://www.cnblogs.com/liesun/p/7350353.html