按照严慧敏版的《数据结构》里写了一段链表初始化和删除之类的代码想自己实操试试看,但是输出的不是想要的查找结果,而是一个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;
    }

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

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;

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;

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632