沉浸020903 2022-09-24 12:45 采纳率: 78.9%
浏览 17
已结题

关于#链表#的问题,如何解决?

问题遇到的现象和发生背景

题目:判断链表是否为非递增有序,是删除同值多余元素并就地逆置,否则输出相应信息
问题:链表每次初始化结束,就退出了,不能运行if的内容

用代码块功能插入代码,请勿粘贴截图

#include <stdio.h>
#include <stdlib.h>

typedef struct Link{
    int elem;
    struct  Link* next;
}link;


link* initLink(){
    link* p=(link*)malloc(sizeof (link));//创建头节点
    link* temp=p;//声明一个指针指向头节点
    //生成链表
    char s=' ';
    int b;

    while(s!='\n'){
        link* a=(link*)malloc(sizeof(link));
        scanf("%d",&b);
        a->elem=b;
        a->next=NULL;
        temp->next=a;
        temp=temp->next;
        scanf("%c",&s);

    }
    return p;
}


void display(link* p){
    link* temp=p;//将temp指针指向头指针
    //只要temp指针指向的节点的next不是NULL,就执行输出语句。
    while(temp->next){
        temp=temp->next;
        printf("%d",temp->elem);
    }
    printf("\n");
}



//判断链表是否非递增有序
int panduan(link* p){
    link* temp=p;//将temp指针指向头指针
    //只要temp指针指向的节点的next不是NULL,就执行输出语句。
    while(temp->next){
        temp=temp->next;
        if(temp->elem<temp->next->elem){
            printf("该链表不是非递增有序的!");
            return 0;
        }
    }
    return 1;

}


//删除多余值
link * shanchuduoyu(link* p){
    link* temp=p;//将temp指针指向头指针
    while(temp->next){
        temp=temp->next;
        if(temp->elem==temp->next->elem){
            link* del=temp->next;//单独设置一个指针指向被删除节点,以防丢失
            temp->next=temp->next->next;//删除
            free(del);//手动释放,防止内存泄漏
        }
    }
    return p;
}


//就地逆置链表
link* ReverseList(link* p){
    if(p==NULL||p->next==NULL){
        return p;
    }

    link *pRev=NULL;
    link *pCur=p;
    link* q=p->next;
    while(pCur!=NULL){
        link *pTemp=pCur;
        pCur=pCur->next;
        pTemp->next=pRev;
        pRev=pTemp;
    }
    p->next=pRev;
    q->next=NULL;
    return p;

}

int main() {
    //初始化链表
    printf("初始化链表为:\n");
    link *p = initLink();
    display(p);



    //判断链表是否为非递增有序,是删除同值多余元素并就地逆置,否则输出相应信息
    if(panduan(p)==1){
        p=shanchuduoyu(p);
        p=ReverseList(p);
        display(p);
    }

    return 0;


}

运行结果及报错内容

初始化链表为:
5 4 3 2
5432

我想要达到的结果

程序运行就结束了这是怎么回事?我希望程序能正常运行

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2022-09-24 13:08
    关注

    你还没有输入就结束了?

    int panduan(link* p){
        link* temp=p;//将temp指针指向头指针
        //只要temp指针指向的节点的next不是NULL,就执行输出语句。
        while(temp->next){
            temp=temp->next;
            if(temp->elem<temp->next->elem){
                printf("该链表不是非递增有序的!");
                return 0;
            }
        }
        return 1;
    
    }
    if(temp->elem<temp->next->elem){
    这里有问题,temp->next可能是空的啊
    

    以下是修改完的代码,你需要先检查temp->next是否为空,然后才能进行节点值得比较

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct Link{
        int elem;
        struct  Link* next;
    }link;
    
    
    link* initLink(){
        link* p=(link*)malloc(sizeof (link));//创建头节点
        link* temp=p;//声明一个指针指向头节点
        //生成链表
        char s=' ';
        int b;
    
        while(s!='\n'){
            link* a=(link*)malloc(sizeof(link));
            scanf("%d",&b);
            a->elem=b;
            a->next=NULL;
            temp->next=a;
            temp=temp->next;
            scanf("%c",&s);
    
        }
        return p;
    }
    
    
    void display(link* p){
        link* temp=p;//将temp指针指向头指针
        //只要temp指针指向的节点的next不是NULL,就执行输出语句。
        while(temp->next){
            temp=temp->next;
            printf("%d",temp->elem);
        }
        printf("\n");
    }
    
    
    
    //判断链表是否非递增有序
    int panduan(link* p){
        link* temp=p;//将temp指针指向头指针
        //只要temp指针指向的节点的next不是NULL,就执行输出语句。
        while(temp->next){
            temp=temp->next;
            if(temp->next != NULL && temp->elem<temp->next->elem){
                printf("该链表不是非递增有序的!");
                return 0;
            }
        }  
        return 1;
    
    }
    
    
    link * shanchuduoyu(link* p){
        link* temp=p->next;
        while(temp){
            if(temp->next != NULL && temp->elem==temp->next->elem){
                link* del=temp->next;//单独设置一个指针指向被删除节点,以防丢失
                temp->next=temp->next->next;//删除
                free(del);//手动释放,防止内存泄漏
            }
            else
                temp=temp->next;
        }
        return p;
    }
    
    
    //就地逆置链表
    link* ReverseList(link* p){
        if(p==NULL||p->next==NULL){
            return p;
        }
    
        link *pRev=NULL;
        link *pCur=p;
        link* q=p->next;
        while(pCur!=NULL){
            link *pTemp=pCur;
            pCur=pCur->next;
            pTemp->next=pRev;
            pRev=pTemp;
        }
        p->next=pRev;
        q->next=NULL;
        return p;
    
    }
    
    int main() {
        //初始化链表
        printf("初始化链表为:\n");
        link *p = initLink();
        display(p);
    
    
    
        //判断链表是否为非递增有序,是删除同值多余元素并就地逆置,否则输出相应信息
        if(panduan(p)==1){
            p=shanchuduoyu(p);
            p=ReverseList(p);
            display(p);
        }
        return 0;
    
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月24日
  • 已采纳回答 9月24日
  • 创建了问题 9月24日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度