调用函数后,单链表无法输出

题目:将一带头结点的单链表L=(a1,b1,a2,b2……an,bn)拆成两个带头结点的链表,L1采用尾插,L2采用前插
问题: 调用split函数后无法正常输出L1,L2 。

img

//split函数

void split(LinkNode*L1,LinkNode*L2,LinkNode*L){
    LinkNode*p,*q,*r;
    L1 = (LinkNode*)malloc(sizeof(LinkNode));
    L2 = (LinkNode*)malloc(sizeof(LinkNode)); //建立L1,L2头结点 
    L1 = L;
    p = L->next;
    
    L2->next = NULL; //L2前插准备工作 
    r =  L1;  //L1后插准备工作
    while(p!=NULL){
        r->next = p;
        r = p;  //对原列表的后插操作
        p = p->next;
        q = p->next; //记录原列表的位置
        p->next = L2->next;
        L2->next = p;  //原列表的前插操作
        p = q; //回到记录点 
    } 
    r->next = NULL;
}

//main函数

int main(){
    LinkNode*L,*L1,*L2;
    int num,i;
    printf("请输入创建多少个结点的链表\n");    
    scanf("%d",&num);
    L = CreatLinkNode(L,num);
    DisPlayLinkNode(L);
    split(L1,L2,L);
    DisPlayLinkNode(L1);
    DisPlayLinkNode(L2);
    return 0;
}

//完整代码

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

LinkNode*CreatLinkNode(LinkNode*L,int n){
    int i;
    L = (LinkNode*)malloc(sizeof(LinkNode));
    L->next = NULL;
    LinkNode*s,*r;
    r = L;
    printf("请输入链表元素的值:\n");
    for(i=1;i<=n;i++){
        s =(LinkNode*)malloc(sizeof(LinkNode));
        scanf("%d",&s->data);
        s->next = NULL;
        r->next = s;
        r=s; 
    }
    printf("创建完毕\n");
    return L;
}

void DisPlayLinkNode(LinkNode*L){
    LinkNode*p;
    p = L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}

void split(LinkNode*L1,LinkNode*L2,LinkNode*L){
    LinkNode*p,*q,*r;
    L1 = (LinkNode*)malloc(sizeof(LinkNode));
    L2 = (LinkNode*)malloc(sizeof(LinkNode)); //建立L1,L2头结点 
    L1 = L;
    p = L->next;
    
    L2->next = NULL; //L2前插准备工作 
    r =  L1;  //L1后插准备工作
    while(p!=NULL){
        r->next = p;
        r = p;  //对原列表的后插操作
        p = p->next;
        q = p->next; //记录原列表的位置
        p->next = L2->next;
        L2->next = p;  //原列表的前插操作
        p = q; //回到记录点 
    } 
    r->next = NULL;
}


int main(){
    LinkNode*L,*L1,*L2;
    int num,i;
    printf("请输入创建多少个结点的链表\n");    
    scanf("%d",&num);
    L = CreatLinkNode(L,num);
    DisPlayLinkNode(L);
    split(L1,L2,L);
    DisPlayLinkNode(L1);
    DisPlayLinkNode(L2);
    return 0;
}

修改如下,供参考:

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

LinkNode*CreatLinkNode(LinkNode*L,int n){
    int i;
    L = (LinkNode*)malloc(sizeof(LinkNode));
    L->next = NULL;
    LinkNode*s,*r;
    r = L;
    printf("请输入链表元素的值:\n");
    for(i=1;i<=n;i++){
        s =(LinkNode*)malloc(sizeof(LinkNode));
        scanf("%d",&s->data);
        s->next = NULL;
        r->next = s;
        r=s;
    }
    printf("创建完毕\n");
    return L;
}
void DisPlayLinkNode(LinkNode*L){
    LinkNode*p;
    p = L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}
//单链表L=(a1,b1,a2,b2……an,bn)拆成两个带头结点的链表,L1采用尾插,L2采用前插
void split(LinkNode*&L1,LinkNode*&L2,LinkNode*L){
    int flg = 0;
    LinkNode*p,*p1,*pt=NULL;
    L1 = (LinkNode*)malloc(sizeof(LinkNode));
    L2 = (LinkNode*)malloc(sizeof(LinkNode)); //建立L1,L2头结点
    L1->next = NULL;
    L2->next = NULL; //L2前插准备工作
    p = L->next;
    p1 = L1;        //L1后插准备工作
    while(p!=NULL)
    {
        if(flg == 0){
            p1->next = p;
            p1 = p;  //对原列表的后插操作
            p = p->next;
            p1->next = NULL;
            flg = 1;
        }
        else{
            pt = p->next;
            p->next = NULL;
            p->next = L2->next;
            L2->next = p;//原列表的前插操作
            p = pt;
            flg = 0;
        }
    }
    free(L);
}
 
int main()
{
    LinkNode*L,*L1,*L2;
    int num,i;
    printf("请输入创建多少个结点的链表\n");    
    scanf("%d",&num);
    L = CreatLinkNode(L,num);
    DisPlayLinkNode(L);

    split(L1,L2,L);
    DisPlayLinkNode(L1);
    DisPlayLinkNode(L2);

    return 0;
}

img