#include<stdio.h>
#include<stdlib.h>
typedef struct link
{
int data;
struct link *pNext;
}Node,*PNode;
PNode creat()
{
PNode L=NULL;
L=(PNode)malloc(sizeof(Node));
if(!L)
return 0;
L->pNext=NULL;
return L;
}
void Insert(PNode L,int e)
{
PNode pcur=NULL,pnew=NULL,prear=NULL;
pnew=(PNode)malloc(sizeof(Node));
if(!pnew)
pnew=NULL;
pnew->pNext=NULL;
pnew->data=e;
if(L->pNext==NULL)
L->pNext=pnew;
else
{
pcur=L;
prear=pcur->pNext;
while(prear->data<=pnew->data)
{
pcur=pcur->pNext;
prear=pcur->pNext;
if(prear==NULL)
break;
}
pnew->pNext=prear;
pcur->pNext=pnew;
}
}
void print(PNode L)
{
PNode p=NULL;
p=L->pNext;
while(p)
{
printf("%d->",p->data);
p=p->pNext;
}
printf("\n");
}
void destroy(PNode L)
{
PNode p=NULL;
while(L)
{
p=L->pNext;
free(L);
L=p;
}
}
void Reverse(PNode L)
{
PNode pcur=NULL,pre=NULL,prear=NULL;
pre=L->pNext;
if(pre==NULL)
printf("该链表为空表\n");
else
{
pcur=pre->pNext;
prear=pcur->pNext;
while(prear!=NULL)
{
pcur->pNext=pre;
pre=pcur;
pcur=prear;
prear=prear->pNext;
}
pcur->pNext=pre;
L->pNext=pcur;
}
print(L);
}
int main()
{
PNode Lz=NULL,Lf=NULL;
int a;
Lz=creat();
Lf=creat();
while(scanf("%d",&a)==1)
{
if(a>0)
Insert(Lz,a);
else
Insert(Lf,a);
}
print(Lz);
print(Lf);
Reverse(Lz);
Reverse(Lf);
destroy(Lz);
destroy(Lf);
return 0;
}
1.先在自己电脑的环境里运行,确定这代码是能运行的,没有死循环
2.测试一下代码运行到底需要多久,然后针对性的优化
3.只运行一次就结束进程的程序,没必要循环delete,进程结束了自然所有内存都释放了
4.pcur和prear既然后面只需要用到一个,就不要在循环里一起操作它俩,除了双倍浪费时间没有意义
链表逆置不对,修改如下,改动处见注释,供参考:
#include<stdio.h>
#include<stdlib.h>
typedef struct link
{
int data;
struct link* pNext;
}Node, * PNode;
PNode creat()
{
PNode L = NULL;
L = (PNode)malloc(sizeof(Node));
if (!L)
return 0;
L->pNext = NULL;
return L;
}
void Insert(PNode L, int e)
{
PNode pcur = NULL, pnew = NULL, prear = NULL;
pnew = (PNode)malloc(sizeof(Node));
if (!pnew)
pnew = NULL;
pnew->pNext = NULL;
pnew->data = e;
if (L->pNext == NULL)
L->pNext = pnew;
else
{
pcur = L;
prear = pcur->pNext;
while (prear->data <= pnew->data)
{
pcur = pcur->pNext;
prear = pcur->pNext;
if (prear == NULL)
break;
}
pnew->pNext = prear;
pcur->pNext = pnew;
}
}
void print(PNode L)
{
PNode p = NULL;
p = L->pNext;
while (p)
{
printf("%d->", p->data);
p = p->pNext;
}
printf("\n");
}
void destroy(PNode L)
{
PNode p = NULL;
while (L)
{
p = L->pNext;
free(L);
L = p;
}
}
void Reverse(PNode L)
{
PNode pcur = NULL, pre = NULL, prear = NULL;
pre = L->pNext;
if (pre == NULL)
printf("该链表为空表\n");
else
{
L->pNext = NULL; // 修改
//pcur = pre->pNext;
//prear = pcur->pNext;
while (pre != NULL) //(prear != NULL)
{
pcur = pre;
//pre = pcur;
//pcur = prear;
pre = pre->pNext;
pcur->pNext = L->pNext;
L->pNext = pcur;
}
}
print(L);
}
int main()
{
PNode Lz = NULL, Lf = NULL;
int a;
Lz = creat();
Lf = creat();
while (scanf("%d", &a) == 1 && a) // 修改 输入 a = 0 时结束输入
{
if (a > 0)
Insert(Lz, a);
else if (a < 0) // 修改
Insert(Lf, a);
}
print(Lz);
print(Lf);
Reverse(Lz);
Reverse(Lf);
destroy(Lz);
destroy(Lf);
return 0;
}
本次回答,借鉴于GPT4
解决办法:合理限制scanf()的输入数据量。除上述方法外,也可以考虑:
我的建议是: