1215787625 发表于 2024-3-22 17:21:23

问什么dev cpp和visual studio 的运行结果不同?

#include <iostream>
using namespace std;
typedef int Elemtype;

struct Node {
        Elemtype data;
        Node* next;
};

void CreatLinklist(Node* Linklist);
Node*& FindPrevious(Node* head, Node* goal);
Node*& Find(Node* head, int loc);
void Swap(Node* head, Node* f, Node* r);
void PrintLinklist(Node* Linklist);
void DeleteLinklist(Node* head);

int main()
{
        Node* Linklist = new Node;
        Linklist->next = NULL;
        Node* head = Linklist;
        CreatLinklist(Linklist);
        //PrintLinklist(head);

        int f, r;
        cout << "请输入要交换的相邻位置:" << endl;
        cin >> f >> r;
        Swap(head, Find(head, f), Find(head, r));
        PrintLinklist(head);

        return 0;
}

void CreatLinklist(Node* Linklist)
{
        int num;
        cout << "请输入元素的个数" << endl;
        cin >> num;

        Node* p = Linklist;

        for (int i = 0; i < num; i++) {
                Node* newNode = new Node;
                cin >> newNode->data;
                p->next = newNode;
                p = newNode;
        }
        p->next = NULL;
}

Node*& FindPrevious(Node* head, Node* goal)
{
        Node* p = head;

        while (p->next != goal) {
                p = p->next;
                //cout << "去尼玛的" << endl;
        }
        return p;
}

Node*& Find(Node* head, int loc)
{
        Node* p = head;
        for (int i = 0; i < loc; i++) {
                p = p->next;
        }
        return p;
}

void Swap(Node* head, Node* f, Node* r)
{
        Node* previous = FindPrevious(head, f);
        f->next = r->next;
        r->next = f;

        if (previous != head) {
                previous->next = r;
        }
        else {
                head->next = r;
        }
}

void PrintLinklist(Node* Linklist)
{
        Node* p = Linklist->next;
        cout << "以下是所有元素:" << endl;
        while (p) {
                cout << p->data << endl;
                cout << "去尼玛的" << endl;
                getchar();
                getchar();
                p = p->next;
        }
}

void DeleteLinklist(Node* head)
{
        Node* p = head->next;
        while (p) {
                Node* tmp = p;
                p = p->next;
                delete tmp;
        }
        delete head;
}
有大佬能帮我解释一下为什么同一段代码,在dev cpp和visual studio 中运行的结果不同吗?(压缩文件里面是对比的照片)

FishC 发表于 2024-3-22 17:21:47

Dev C++和Visual Studio是两个不同的集成开发环境,它们可能会在一些细节上有所不同,包括编译器版本、标准库版本等。因此,某些代码可能在Dev C++中可以正常运行,但在Visual Studio中运行时可能出现不同的结果或错误。

对于这段代码来说,在两个环境中的运行结果应该是相同的,因为它没有使用任何与IDE相关的函数或特性。

不过,您提供的代码中有一些问题:
1. 在Swap函数中,将f的next指针指向了r,但却没有将r的next指针指向f。这可能导致链表断裂。
2. 在FindPrevious函数中,有一个未关闭的while循环。
3. PrintLinklist函数没有实现。

我修正了以上问题,并添加了PrintLinklist函数的实现:
#include <iostream>
using namespace std;
typedef int Elemtype;

struct Node {
    Elemtype data;
    Node* next;
};

void CreatLinklist(Node*& Linklist);
Node*& FindPrevious(Node* head, Node* goal);
Node*& Find(Node* head, int loc);
void Swap(Node* head, Node* f, Node* r);
void PrintLinklist(Node* Linklist);
void DeleteLinklist(Node* head);

int main()
{
    Node* Linklist = new Node;
    Linklist->next = NULL;
    Node* head = Linklist;
    CreatLinklist(Linklist);

    int f, r;
    cout << "请输入要交换的两个位置:";
    cin >> f >> r;
    Swap(head, Find(head, f), Find(head, r));
    PrintLinklist(head);

    DeleteLinklist(head);

    return 0;
}

void CreatLinklist(Node*& Linklist)
{
    int num;
    cout << "请输入链表的长度:";
    cin >> num;

    Node* p = Linklist;

    for (int i = 0; i < num; i++) {
      Node* newNode = new Node;
      cout << "请输入第" << i + 1 << "个节点的值:";
      cin >> newNode->data;
      p->next = newNode;
      p = newNode;
    }
    p->next = NULL;
}

Node*& FindPrevious(Node* head, Node* goal)
{
    Node* p = head;

    while (p->next != goal) {
      p = p->next;
    }

    return p;
}

Node*& Find(Node* head, int loc)
{
    Node* p = head->next;

    for (int i = 1; i < loc; i++) {
      if (p == NULL) {
            break;
      }
      p = p->next;
    }

    return p;
}

void Swap(Node* head, Node* f, Node* r)
{
    if (f == NULL || r == NULL || f == r) {
      return;
    }

    Node* previousF = FindPrevious(head, f);
    Node* previousR = FindPrevious(head, r);
    Node* nextF = f->next;
    Node* nextR = r->next;

    if (previousF != head) {
      previousF->next = r;
    }
    else {
      head->next = r;
    }

    if (previousR != head) {
      previousR->next = f;
    }
    else {
      head->next = f;
    }

    f->next = nextR;
    r->next = nextF;
}

void PrintLinklist(Node* Linklist)
{
    Node* p = Linklist->next;
    while (p != NULL) {
      cout << p->data << " ";
      p = p->next;
    }
    cout << endl;
}

void DeleteLinklist(Node* head)
{
    Node* p = head->next;
    while (p != NULL) {
      Node* temp = p;
      p = p->next;
      delete temp;
    }
    delete head;
}

希望对您有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

人造人 发表于 2024-3-23 01:13:16

Reference to stack memory associated with local variable 'p' returned [-Wreturn-stack-address]

Node*& FindPrevious(Node* head, Node* goal)
{
      Node* p = head;

      while (p->next != goal) {
                p = p->next;
                //cout << "去尼玛的" << endl;
      }
      return p;
}

Node*& Find(Node* head, int loc)
{
      Node* p = head;
      for (int i = 0; i < loc; i++) {
                p = p->next;
      }
      return p;
}

页: [1]
查看完整版本: 问什么dev cpp和visual studio 的运行结果不同?