幸运五五 2022-10-22 15:12 采纳率: 62.5%
浏览 33
已结题

单链表的删除问题,为什么这个代码没有报错,但是main函数部分if下面的部分不执行?

main.cpp部分


#include<stdio.h>
#include "linklist.h"
int main()
{
    LinkNode *L;
    int n=10,i,e;

    ElemType a[]= {1,2,3,4,5,6,7,8,9,10};
    InitList(L);
    CreateListR(L,a,n);
    printf("L:");
    DispList(L);
    printf("请输入要删除的位置:\n");
    scanf("%d",&i);

    if(ListDelete(L,i,e)==1)
    {
         ListDelete(L,i,e);
        printf("删除完成后的链表为:\n");
        DispList(L);
        printf("删除的元素为:");
        printf("%d",e);
//

    }

    else
        printf("位置错误无法删除");


}

linklist.cpp部分

#include "linklist.h"                //声明单链表结点类型

void CreateListR(LinkNode *&L,ElemType a[],int n)
//尾插法建立单链表
{
    LinkNode *s,*r;
    L=(LinkNode *)malloc(sizeof(LinkNode));      //创建头结点
    L->next=NULL;
    r=L;                    //r始终指向终端结点,开始时指向头结点
    for (int i=0; i<n; i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
        s->data=a[i];
        r->next=s;            //将结点s插入结点r之后
        r=s;
    }
    r->next=NULL;            //终端结点next域置为NULL
}
void InitList(LinkNode *&L)
{
    L=(LinkNode *)malloc(sizeof(LinkNode));      //创建头结点
    L->next=NULL;
}
void DestroyList(LinkNode *&L)
{
    LinkNode *pre=L,*p=pre->next;
    while (p!=NULL)
    {
        free(pre);
        pre=p;
        p=pre->next;
    }
    free(pre);    //此时p为NULL,pre指向尾结点,释放它
}
bool ListEmpty(LinkNode *L)
{
    return(L->next==NULL);
}
int ListLength(LinkNode *L)
{
    LinkNode *p=L;
    int i=0;
    while (p->next!=NULL)
    {
        i++;
        p=p->next;
    }
    return(i);
}
void DispList(LinkNode *L)
{
    LinkNode *p=L->next;
    while (p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

bool ListDelete(LinkNode *&L,int i,ElemType &e)
{

    // 在带头结点的单链线性表L的第i个元素之前删除元素e
    /********** Begin **********/
    int j=0;
    LinkNode *p=L,*q;
    if(i<0)
        return false;
    while(j<i-1&&p!=NULL)
    {
        j++;
        p=p->next;

    }
    if (p=NULL)
        return false;
    else
    {
        q=p->next;
        if(q=NULL)
            return false;
        e=q->data;
        p->next=q->next;
        free(q);
        return true;

    }




    /********** End **********/







}

linklist.h部分


#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

#include <malloc.h>
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;        //指向后继结点
} LinkNode;
void InitList(LinkNode *&L);
void DispList(LinkNode *L);
bool ListInsert(LinkNode *&L,int i,ElemType e);
void CreateListR(LinkNode *&L,ElemType a[],int n);
bool ListDelete(LinkNode *&L,int i,ElemType &e);



#endif // LINKLIST_H_INCLUDED

为什么int main部分if部分输入大于0的数就不执行了?想要得到下面的测试结果,怎么修改代码?

img

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-10-22 20:27
    关注

    改动处见注释,供参考:
    main.cpp部分

    #include<stdio.h>
    #include "linklist.h"
    int main()
    {
        LinkNode *L;
        int n=10,i,e;
    
        ElemType a[]= {1,2,3,4,5,6,7,8,9,10};
        InitList(L);
        CreateListR(L,a,n);
        printf("L:");
        DispList(L);
        printf("请输入要删除的位置:\n");
        scanf("%d",&i);
    
        if(ListDelete(L,i,e)==1)
        {
            //ListDelete(L,i,e); //ListDelete(L,i,e);中文()修改
            printf("删除完成后的链表为:\n");
            DispList(L);
            printf("删除的元素为:");
            printf("%d\n",e);
        }
        else
            printf("位置错误无法删除");
        return 0;
    }
    
    

    linklist.cpp部分

    #include "linklist.h"                //声明单链表结点类型
    
    void CreateListR(LinkNode *&L,ElemType a[],int n)
    //尾插法建立单链表
    {
        LinkNode *s,*r;
        L=(LinkNode *)malloc(sizeof(LinkNode));      //创建头结点
        L->next=NULL;
        r=L;                    //r始终指向终端结点,开始时指向头结点
        for (int i=0; i<n; i++)
        {
            s=(LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
            s->data=a[i];
            r->next=s;            //将结点s插入结点r之后
            r=s;
        }
        r->next=NULL;            //终端结点next域置为NULL
    }
    void InitList(LinkNode *&L)
    {
        L=(LinkNode *)malloc(sizeof(LinkNode));      //创建头结点
        L->next=NULL;
    }
    void DestroyList(LinkNode *&L)
    {
        LinkNode *pre=L,*p=pre->next;
        while (p!=NULL)
        {
            free(pre);
            pre=p;
            p=pre->next;
        }
        free(pre);    //此时p为NULL,pre指向尾结点,释放它
    }
    bool ListEmpty(LinkNode *L)
    {
        return(L->next==NULL);
    }
    int ListLength(LinkNode *L)
    {
        LinkNode *p=L;
        int i=0;
        while (p->next!=NULL)
        {
            i++;
            p=p->next;
        }
        return(i);
    }
    void DispList(LinkNode *L)
    {
        LinkNode *p=L->next;
        while (p!=NULL)
        {
            printf("%d ",p->data);
            p=p->next;
        }
        printf("\n");
    }
    
    bool ListDelete(LinkNode *&L,int i,ElemType &e)
    {
    
        // 在带头结点的单链线性表L的第i个元素之前删除元素e
        /********** Begin **********/
        int j=0;
        LinkNode *p=L,*q;
        if(i < 1)      //if(i<0) 修改
            return false;
        while(j<i-1&&p!=NULL)
        {
            j++;
            p=p->next;
     
        }
        if (p==NULL)  //if (p=NULL)修改
            return false;
        else
        {
            q=p->next;
            if(q==NULL) //if(q=NULL)修改
                return false;
            e=q->data;
            p->next=q->next;
            free(q);
            return true;
        }
        /********** End **********/
    }
    
    

    linklist.h部分

    #ifndef LINKLIST_H_INCLUDED
    #define LINKLIST_H_INCLUDED
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    #include <malloc.h>
    typedef int ElemType;
    typedef struct LNode
    {
        ElemType data;
        struct LNode *next;        //指向后继结点
    } LinkNode;
    void InitList(LinkNode *&L);
    void DispList(LinkNode *L);
    bool ListInsert(LinkNode *&L,int i,ElemType e);
    void CreateListR(LinkNode *&L,ElemType a[],int n);
    bool ListDelete(LinkNode *&L,int i,ElemType &e);
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月23日
  • 已采纳回答 10月23日
  • 修改了问题 10月22日
  • 修改了问题 10月22日
  • 展开全部

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分