C语言单链表删除最大节点的代码问题及解决方法
#include<stdio.h> #include<malloc.h>
typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LinkNode;
void delmaxnode(LinkNode *&L) {
LinkNode *p=L->next,*pre=L,*maxp=p,*maxpre=pre;
while(p!=NULL){
if(maxp->data
maxpre=p;
}
pre=p;
p=p->next;
}
maxpre->next=maxp->next;
free(maxp);
if(L->next!=NULL) // 判断链表是否为空
delmaxnode(L);
}
bool ListInsert(LinkNode *&L,int i,ElemType e) { int j=0; LinkNode *p=L,*s; if(i<=0) return false; while(j<i-1&&p!=NULL){ j++; p=p->next; } if(p==NULL&&j<i-1) return false; else { s=(LinkNode *)malloc(sizeof(LinkNode)); s->data=e; s->next=p->next; p->next=s; return true; } }
void DispList(LinkNode *L) { LinkNode *p=L->next; while(p!=NULL){ printf('%d ',p->data); p=p->next; } printf(' '); }
void InitList(LinkNode *&L) { L=(LinkNode *)malloc(sizeof(LinkNode)); L->next=NULL; }
int main(){ LinkNode *L; InitList(L); ListInsert(L,1,7); ListInsert(L,2,9); ListInsert(L,3,8); ListInsert(L,4,5); ListInsert(L,5,4); ListInsert(L,6,9); DispList(L); delmaxnode(L); DispList(L); return 0; }
问题原因:
代码问题在于递归调用delmaxnode函数时没有判断链表是否为空,导致程序陷入死循环。
修改后的代码:
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
}LinkNode;
void delmaxnode(LinkNode *&L) {
LinkNode *p=L->next,*pre=L,*maxp=p,*maxpre=pre;
while(p!=NULL){
if(maxp->data<p->data) {
maxp=p;
maxpre=pre;
}
else if(maxp->data==p->data){
maxpre=p;
}
pre=p;
p=p->next;
}
maxpre->next=maxp->next;
free(maxp);
if(L->next!=NULL) // 判断链表是否为空
delmaxnode(L);
}
bool ListInsert(LinkNode *&L,int i,ElemType e) {
int j=0;
LinkNode *p=L,*s;
if(i<=0)
return false;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL&&j<i-1)
return false;
else {
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
void DispList(LinkNode *L) {
LinkNode *p=L->next;
while(p!=NULL){
printf('%d ',p->data);
p=p->next;
}
printf('
');
}
void InitList(LinkNode *&L)
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
}
int main(){
LinkNode *L;
InitList(L);
ListInsert(L,1,7);
ListInsert(L,2,9);
ListInsert(L,3,8);
ListInsert(L,4,5);
ListInsert(L,5,4);
ListInsert(L,6,9);
DispList(L);
delmaxnode(L);
DispList(L);
return 0;
}
修改说明:
在delmaxnode函数中添加了判断链表是否为空的语句:if(L->next!=NULL),只有当链表不为空时才递归调用delmaxnode函数。
注意:
- 代码中使用了
malloc函数分配内存,使用完后需要使用free函数释放内存,避免内存泄漏。 - 递归函数的使用需要谨慎,注意判断边界条件,避免陷入死循环。
- 代码中使用了
&符号,表示传递指针的地址,以便在函数内部修改指针指向的值。 - 代码中的
DispList函数用于打印链表,可以方便地观察链表的结构。 - 代码中的
InitList函数用于初始化链表,分配头结点的内存空间。 - 代码中的
ListInsert函数用于在链表中插入节点。 - 代码中的
delmaxnode函数用于删除链表中的最大节点。
希望以上内容对您有所帮助!
原文地址: https://www.cveoy.top/t/topic/otgT 著作权归作者所有。请勿转载和采集!