白天的星星️ 2021-10-03 17:33 采纳率: 100%
浏览 63
已结题

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

题目:将一带头结点的单链表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;
}

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-10-04 00:35
    关注

    修改如下,供参考:

    #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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月12日
  • 已采纳回答 10月4日
  • 创建了问题 10月3日

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?