预定程序员 2023-01-26 17:25 采纳率: 68.3%
浏览 37
已结题

调用move函数(让小于0 的排在大于0的之前)后,printf和DispList不输出

题目:某非空单链表L中所有元素为整数,设计一个算法将所有小于零的节点移到所有大于等于零的节点的前面
问题:为什么调用move函数后,第二个DispList函数不输出,第二个printf也不输出。
提示:L1是不带头节点的,这样可以直接连到L最后一个结点的后面

#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Lnode
{
    int data;
    struct Lnode *next; 
}LinkNode;
void InitList(LinkNode *&L)
{
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;
}
void CreatList(LinkNode *&L,int a[],int n)
{
    LinkNode *s;
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;
    for(int i=0;i<n;i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));
        s->data=a[i];
        s->next=L->next;
        L->next=s;
    }
}
void DispList(LinkNode *L)
{
    LinkNode *p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
}
void move(LinkNode *&L)
{
    LinkNode *L1,*r=L,*r1,*p=L->next;
    L1=NULL;
    L->next=NULL;
    while(p!=NULL)
    {
        if(p->data>0)
        {
            if(L1->next==NULL)
             {L1=p;r1=p;}
            else
             {r1->next=p;
              r1=p;}
        }
        else
        {
            r->next=p;
            r=p;
        }
        p=p->next;
    }
    r->next=r1->next=NULL;
    r->next=L1;
} 
int main()
{
    LinkNode *L;
    int a[5];
    InitList(L);
    printf("请输入:");
    for(int i=0;i<5;i++)
    {
        scanf("%d",&a[i]);
    }
    CreatList(L,a,5);
    printf("请输出:");
    DispList(L);
    move(L);
    printf("移动后请输出:");
    DispList(L);
}

img

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-01-28 02:04
    关注

    修改如下,改动处见注释,供参考:

    #include<stdio.h>
    #include<malloc.h>
    typedef int ElemType;
    typedef struct Lnode
    {
        int data;
        struct Lnode *next;
    }LinkNode;
    void InitList(LinkNode *&L)
    {
        L=(LinkNode *)malloc(sizeof(LinkNode));
        L->next=NULL;
    }
    void CreatList(LinkNode *&L,int a[],int n)
    {
        LinkNode *s;
        //L=(LinkNode *)malloc(sizeof(LinkNode)); 修改
        //L->next=NULL;                           修改
        for(int i=0;i<n;i++)
        {
            s=(LinkNode *)malloc(sizeof(LinkNode));
            s->data=a[i];
            s->next=L->next;
            L->next=s;
        }
    }
    void DispList(LinkNode *L)
    {
        LinkNode *p=L->next;
        while(p!=NULL)
        {
            printf("%d ",p->data);
            p=p->next;
        }
        printf("\n");
    }
    void move(LinkNode *&L)
    {
        LinkNode *L1=NULL,*r=NULL,*r1=L,*p=L->next;  //L1=NULL;修改
        L->next=NULL;
        while(p!=NULL)
        {
            r = p;          //修改
            p = p->next;    //修改
            r->next = NULL; //修改
            if(r->data >= 0)//修改
            {
                r->next = L1;//修改
                L1 = r;      //修改
            }
            else
            {
                r1->next = r;//修改
                r1 = r;      //修改
                //r->next = p;
                //r = p;
            }
                //p = p->next;
        }
                //r->next=r1->next=NULL;
        r1->next = L1;  //修改  r->next=L1;
    }
    int main()
    {
        LinkNode *L;
        int a[5];
        InitList(L);
        printf("请输入:");
        for(int i=0;i<5;i++)
        {
            scanf("%d",&a[i]);
        }
        CreatList(L,a,5);
        printf("请输出:");
        DispList(L);
        
        move(L);
        printf("移动后请输出:");
        DispList(L);
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月5日
  • 已采纳回答 1月28日
  • 修改了问题 1月26日
  • 创建了问题 1月26日

悬赏问题

  • ¥100 数字取证课程 关于FAT文件系统的操作
  • ¥15 如何使用js实现打印时每页设置统一的标题
  • ¥15 安装TIA PortalV15.1报错
  • ¥15 能把水桶搬到饮水机的机械设计
  • ¥15 Android Studio中如何把H5逻辑放在Assets 文件夹中以实现将h5代码打包为apk
  • ¥15 使用小程序wx.createWebAudioContext()开发节拍器
  • ¥15 关于#爬虫#的问题:请问HMDB代谢物爬虫的那个工具可以提供一下吗
  • ¥15 vue3+electron打包获取本地视频属性,文件夹里面有ffprobe.exe 文件还会报错这是什么原因呢?
  • ¥20 用51单片机控制急停。
  • ¥15 孟德尔随机化结果不一致