#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->datadata) { 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函数时没有判断链表是否为空,导致程序陷入死循环。

修改后的代码:

#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函数用于删除链表中的最大节点。

希望以上内容对您有所帮助!

C语言单链表删除最大节点的代码问题及解决方法

原文地址: https://www.cveoy.top/t/topic/otgT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录