梓木子 2020-10-18 10:36 采纳率: 0%
浏览 251

[求大佬]不明原因导致访问越界(提示Process returned -1073741819 (0xC0000005))

实现将两段递增有序链表合并为一段递减有序链表时出现的错误.
代码如下:

//头文件
#ifndef LINKANDLINKNODEOFINTFORHOMEWORK_H_INCLUDED
#define LINKANDLINKNODEOFINTFORHOMEWORK_H_INCLUDED
using namespace std;
template<class T>
class LinkNode//节点类
{
public:
    T data;//数据域
    LinkNode<T> *next;//指针域
    LinkNode(T data = 0)
    {
        this->data = data;
        this->next = NULL;
    }
};

template<class T>
class Link//链表类模板(该链表无头节点)
{
private:
    int Size;
public:
    LinkNode<T> *head;
    LinkNode<T> *tail;
    Link(int Size = 0)
    {
        this->head = NULL;
        this->tail = NULL;
        this->Size = 0;
    }
    void push(T data)//输入数据
    {
        LinkNode<T> *x = new LinkNode<T>(data);
        if(tail == NULL)
        {
            head = tail = x;
        }
        else
        {
            tail->next = x;//尾节点后再加一位使之成为新的尾结点.
            tail = x;//让原来的尾结点成为新的数据存储点.
        }
        Size += 1;
    }
    void print()//输出链表
    {
        LinkNode<T> *p = this->head;
        for(;p!=tail;p = p->next)
        {
            cout << p->data;
        }
        cout << tail->data;
        cout << endl;
        cout<<"链表输出完毕。"<<endl;
    }
    LinkNode<T>* AddOfHead();//返回头节点地址
    LinkNode<T>* AddOfTail();//返回尾结点地址
    void upsidedown();//链表倒置
    void FunForLink(Link<T> *a,Link<T> *b,Link<T> *New);//将两个元素递减有序的链表整合为一个递减有序的链表
};

template<class T>
LinkNode<T>* Link<T> :: AddOfHead()
{
    return this->head;
}

template<class T>
LinkNode<T>* Link<T> :: AddOfTail()
{
    return this->tail;
}

template<class T>
void Link<T> :: upsidedown()//链表倒置
{
    LinkNode<T> *a = tail;
    LinkNode<T> *p;

    while(tail != head)
    {
        for(p = head;p->next!= tail;p = p->next)
        {
            ;//每一次循环都是查找当前tail节点的前一位
        }
        tail->next = p;//这一步是让tail的后继指针域指向p所指向的节点.
        tail=p;//让tail指向原来的它所指向的已经变化过的下一位节点.
    }

    head = a;
}

template<class T>
    void Link<T> :: FunForLink(Link<T> *a,Link<T> *b,Link<T> *New)//将两个的递减有序的链表整合为一个递减有序的链表
    {
        LinkNode<T>* tempa=new LinkNode<T>();
        LinkNode<T>* tempb=new LinkNode<T>();
        tempa=a->head;
        tempb=b->head;
        //cout<<tempa->data<<endl;
        //cout<<a->head->data<<endl;
        if(tempa->data==tempb->data)
        {
            New->push(tempa->data);
            tempa=tempa->next;
        }
        else
        {
            New->push(tempb->data);
            tempb=tempb->next;
        }
            while(tempa!=NULL||tempb!=NULL)
            {
                    if(tempa->data==NULL)
                    {
                        while(tempb!=NULL)
                        {
                            New->push(tempb->data);
                            tempb=tempb->next;
                        }
                    }
                    else if(tempb==NULL)
                    {
                        while(tempa!=NULL)
                        {
                            New->push(tempa->data);
                            tempa=tempa->next;
                        }
                    }
                    else if(tempa->data>=tempb->data)
                    {
                        New->push(tempa->data);
                        tempa=tempa->next;
                    }
                    else if(tempa->data<tempb->data)
                    {
                        New->push(tempb->data);
                        tempb=tempb->next;
                    }
            }
            delete tempa;
            delete tempb;
    }

#endif // LINKANDLINKNODEOFINTFORHOMEWORK_H_INCLUDED



以下是实现.

#include<iostream>
#include"LinkAndLinknodeOfIntForHomework.h"

using namespace std;

int main()
{
    Link<int> *a=new Link<int>(0);
    Link<int> *b=new Link<int>(0);
    int lenofa=0;
    int lenofb=0;
    Link<int> *newlink=new Link<int>(0);
    cout<<"请输入"<<endl;
    cout<<"①a链表(递增有序)的长度:"<<endl;
    cin>>lenofa;
    int sta=lenofa;
    while(lenofa!=0)
    {
        int tempa=0;
        cout<<"请输入第"<<sta-lenofa+1<<"个数字"<<endl;
        cin>>tempa;
        a->push(tempa);
        lenofa--;
    }
    a->upsidedown();
    cout<<"②b链表(递增有序)的长度:"<<endl;
    cin>>lenofb;
    int stb=lenofb;
    while(lenofb!=0)
    {
        int tempb=0;
        cout<<"请输入第"<<stb-lenofb+1<<"个数字"<<endl;
        cin>>tempb;
        b->push(tempb);
        lenofb--;
    }
    b->upsidedown();
    cout<<"接下来开始执行主程序:"<<endl;
    newlink->FunForLink(a,b,newlink);
    cout<<newlink->head->data;
    return 1;
}

运行窗口:
图片说明
求大佬指点迷津.

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 02:56
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    您的代码在尝试将两个递增有序的链表合并成一个递减有序的链表时出现了问题。具体来说,您在 FunForLink 函数中使用了错误的方法来比较两个链表中的节点值。

    首先,我们需要理解递增和递减有序链表之间的差异:

    • 递增 有序链表意味着每个节点的值都比它的前一个节点的大。
    • 递减 有序链表则相反,即每个节点的值都比它的后一个节点小。

    当您尝试将这两个链表合并成一个递减有序链表时,由于您在 FunForLink 函数中没有正确地处理这些节点值,结果可能会导致错误。

    解决此问题的最佳方法是在遍历链表之前就确定两个链表的顺序,并确保它们按正确的顺序进行比较。这样可以避免在合并过程中遇到的问题。

    根据您的描述,我建议对 FunForLink 函数稍作修改以实现正确的排序逻辑:

    template<class T>
    LinkNode<T>* Link<T>::FunForLink(LinkNode<T> *a, LinkNode<T> *b, LinkNode<T> *New)
    {
        if (!a || !b)
            return New; // 如果一个或两个链表为空,则直接创建新链表
    
        // 现在我们有正确的顺序,可以按照递减有序的方式合并链表
        while (a && b) {
            if (a->data <= b->data) {
                New->push(a->data); // 将较小的数据插入到新链表中
                a = a->next;
            } else {
                New->push(b->data); // 将较大(更早)的数据插入到新链表中
                b = b->next;
            }
        }
    
        // 添加剩余的节点
        while (a) {
            New->push(a->data);
            a = a->next;
        }
    
        while (b) {
            New->push(b->data);
            b = b->next;
        }
    
        return New;
    }
    

    现在,这个函数应该能正确地将两个递增有序的链表合并成一个递减有序的链表。您可以继续使用这个修改后的版本来解决问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何提取京东订单生成QQ支付链接
  • ¥50 游戏中的像素着色器获取到的法线贴图错误怎么解决
  • ¥15 把从欧空局下载的哨兵一号数据导入snap的时候出现这个问题该怎么解决😥
  • ¥15 蓝桥杯stm322016年省赛试题中遇到的问题
  • ¥15 有没有ND4J能用的MAVEN地址
  • ¥15 外接电阻采用星形连接,测量一个电阻的相电压,用数据采集卡进行显示,而电机旋转转速有1300r/min,按照此电机的转速常数,应该电压值为15v左右
  • ¥100 oracle sgd 部署概要
  • ¥20 escpos打印到CUPS打印机
  • ¥15 MATLAB读取TXT,并添加度分秒
  • ¥15 excel提示内存不足