Amannama 2022-02-07 18:03 采纳率: 100%
浏览 21
已结题

按照严慧敏版的《数据结构》里写了一段链表初始化和删除之类的代码想自己实操试试看,但是输出的不是想要的查找结果,而是一个7位数的随机数,用debug也看不出来,如何解决?

就是按照严慧敏版的《数据结构》里写了一段链表初始化和删除之类的代码想自己实操试试看,然后输入都是正常的,就是输出的不是想要的查找结果,而是一个 7 位数的随机数,用 debug 也看不出来。C++的基础比较薄弱,望指教~


#include <iostream>
#include <stdio.h>

typedef int Status; //定义状态函数

#define ERROR -1

#define OK 1

typedef enum //定义布尔符号
{
    FALSE = 0,
    TRUE = 1
} BOOL;

typedef struct LNode //定义链表
{
    int data;
    struct LNode *next;
} LNode, *LinkList;

Status InitList(LinkList &L) //构建一个空链表
{
    L = new LNode; //new出来的需要用delete指令删除
    L->next = NULL;
    return OK;
}

Status GetElem(LinkList L, int i, int &e) //在带头结点的单链表L中根据序号l.获取元素的值,用e返回L中第l.个数据元素的值
{
    int j;
    LNode *p; //定义LNode类型的p指针才能调用
    p = L->next;
    j = 1;
    while (p && j < i)
        p = p->next;
    ++j;
    if (!p || j > i)
        return ERROR;
    e = p->data;
    return OK;
}

LNode *LocateElem(LinkList L, int e) //在带头结点的单链表L中查找e元素
{
    LNode *p;
    p = L->next; //初始化,p指向首元结点
    while (p && p->data != e)
        p = p->next;
    return p;
}

Status ListInsert(LinkList &L, int i, int e) //在带头结点的单链表L中第i个位置插入数据域为e的新结点
{
    LNode *p = L;
    int j = 0;
    while (p && (j < i - 1))
    {
        p = p->next;
        ++j;
    }
    if (!p || j > i - 1)
        return ERROR;
    LNode *s = new LNode;
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

Status ListDelete(LinkList &L, int i) //删除第i个元素
{
    LNode *p = L;
    LNode *q = new LNode;
    int j = 0;
    while ((p->next) && (j < i - 1))
    {
        p = p->next;
        ++j;
    }
    if (!(p->next) || (j > i - 1))
        return ERROR;
    q = p->next; //临时保存被删结点的地址未来释放,避免内存泄漏
    p->next = q->next;
    delete q;
    return OK;
}

//创建单链表的方式

void CreateList_H(LinkList &L, int n) //前插法创建单链表
{
    L = new LNode;
    L->next = NULL;
    for (int i = 0; i < n; ++i)
    {
        LNode *p = new LNode;  //创建数据新结点
        scanf("%d", &p->data); //插入数据
        p->next = L->next;
        L->next = p;
    }
}

void CreateList_R(LinkList &L, int n) //后插法创建单链表
{
    L = new LNode;
    L->next = NULL;
    LNode *r = new LNode;
    r = L;
    for (int i = 0; i < n; ++i)
    {
        LNode *p = new LNode;
        scanf("%d", &p->data);
        p->next = NULL;
        r->next = p;
        r = p;
    }
}


int main()
{
    printf("主程序开展:\n");
    LinkList first;
    printf("请输入长度为4的数据\n");
    CreateList_H(first, 4);
    int a, e;
    printf("请输入要搜索的项:\n");
    scanf("%d", &a);
    GetElem(first, a, e);
    printf("%d", e);
    return OK;

}


主程序开展:
请输入长度为4的数据
4 3 2 1
请输入要搜索的项:
3
45509436%

我感觉就是初始化都没有成功,因为曾经尝试用

if(GetElem(first, a, e)==OK)
    {
        printf("查找成功!!!\n");
        printf("%d", e);
        return OK;
    }
    else
    {
        printf("查找错误!!!\n");
        return ERROR;
    }

返回的就是“查找错误!”,
但是我也不清楚是哪个代码初始化失败了。因为我是跨专业考试自学的,没有同学可以问。已经困扰我一个春节了,感谢各位!

  • 写回答

3条回答 默认 最新

  • _GX_ 2022-02-07 18:33
    关注

    GetElem()函数里while循环少了花括号,修改如下

    while (p && j < i)
    {
        p = p->next;
        ++j;
    }
    

    ListDelete()函数中没必要为q分配一个新节点,把LNode* q = new LNode;改为LNode* q;
    同样CreateList_R()函数中,没必要为r分配新节点,直接定义其为指针即可,把LNode *r = new LNode;改为LNode *r;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月15日
  • 已采纳回答 2月7日
  • 创建了问题 2月7日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵