题目:判断链表是否为非递增有序,是删除同值多余元素并就地逆置,否则输出相应信息
问题:链表每次初始化结束,就退出了,不能运行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->elem 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
程序运行就结束了这是怎么回事?我希望程序能正常运行
你还没有输入就结束了?
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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!