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

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

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

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

#include 
#include 

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->elemnext->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

我想要达到的结果

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

你还没有输入就结束了?

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;


}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632