鱼C论坛

 找回密码
 立即注册
查看: 176|回复: 2

[已解决]问什么dev cpp和visual studio 的运行结果不同?

[复制链接]
发表于 2024-3-22 17:21:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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 中运行的结果不同吗?(压缩文件里面是对比的照片)
最佳答案
2024-3-23 01:13:16
  1. Reference to stack memory associated with local variable 'p' returned [-Wreturn-stack-address]
复制代码

  1. Node*& FindPrevious(Node* head, Node* goal)
  2. {
  3.         Node* p = head;

  4.         while (p->next != goal) {
  5.                 p = p->next;
  6.                 //cout << "去尼玛的" << endl;
  7.         }
  8.         return p;
  9. }

  10. Node*& Find(Node* head, int loc)
  11. {
  12.         Node* p = head;
  13.         for (int i = 0; i < loc; i++) {
  14.                 p = p->next;
  15.         }
  16.         return p;
  17. }
复制代码

不同的结果.zip

1.5 MB, 下载次数: 0

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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函数的实现:
  1. #include <iostream>
  2. using namespace std;
  3. typedef int Elemtype;

  4. struct Node {
  5.     Elemtype data;
  6.     Node* next;
  7. };

  8. void CreatLinklist(Node*& Linklist);
  9. Node*& FindPrevious(Node* head, Node* goal);
  10. Node*& Find(Node* head, int loc);
  11. void Swap(Node* head, Node* f, Node* r);
  12. void PrintLinklist(Node* Linklist);
  13. void DeleteLinklist(Node* head);

  14. int main()
  15. {
  16.     Node* Linklist = new Node;
  17.     Linklist->next = NULL;
  18.     Node* head = Linklist;
  19.     CreatLinklist(Linklist);

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

  25.     DeleteLinklist(head);

  26.     return 0;
  27. }

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

  33.     Node* p = Linklist;

  34.     for (int i = 0; i < num; i++) {
  35.         Node* newNode = new Node;
  36.         cout << "请输入第" << i + 1 << "个节点的值:";
  37.         cin >> newNode->data;
  38.         p->next = newNode;
  39.         p = newNode;
  40.     }
  41.     p->next = NULL;
  42. }

  43. Node*& FindPrevious(Node* head, Node* goal)
  44. {
  45.     Node* p = head;

  46.     while (p->next != goal) {
  47.         p = p->next;
  48.     }

  49.     return p;
  50. }

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

  54.     for (int i = 1; i < loc; i++) {
  55.         if (p == NULL) {
  56.             break;
  57.         }
  58.         p = p->next;
  59.     }

  60.     return p;
  61. }

  62. void Swap(Node* head, Node* f, Node* r)
  63. {
  64.     if (f == NULL || r == NULL || f == r) {
  65.         return;
  66.     }

  67.     Node* previousF = FindPrevious(head, f);
  68.     Node* previousR = FindPrevious(head, r);
  69.     Node* nextF = f->next;
  70.     Node* nextR = r->next;

  71.     if (previousF != head) {
  72.         previousF->next = r;
  73.     }
  74.     else {
  75.         head->next = r;
  76.     }

  77.     if (previousR != head) {
  78.         previousR->next = f;
  79.     }
  80.     else {
  81.         head->next = f;
  82.     }

  83.     f->next = nextR;
  84.     r->next = nextF;
  85. }

  86. void PrintLinklist(Node* Linklist)
  87. {
  88.     Node* p = Linklist->next;
  89.     while (p != NULL) {
  90.         cout << p->data << " ";
  91.         p = p->next;
  92.     }
  93.     cout << endl;
  94. }

  95. void DeleteLinklist(Node* head)
  96. {
  97.     Node* p = head->next;
  98.     while (p != NULL) {
  99.         Node* temp = p;
  100.         p = p->next;
  101.         delete temp;
  102.     }
  103.     delete head;
  104. }
复制代码


希望对您有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-23 01:13:16 | 显示全部楼层    本楼为最佳答案   
  1. Reference to stack memory associated with local variable 'p' returned [-Wreturn-stack-address]
复制代码

  1. Node*& FindPrevious(Node* head, Node* goal)
  2. {
  3.         Node* p = head;

  4.         while (p->next != goal) {
  5.                 p = p->next;
  6.                 //cout << "去尼玛的" << endl;
  7.         }
  8.         return p;
  9. }

  10. Node*& Find(Node* head, int loc)
  11. {
  12.         Node* p = head;
  13.         for (int i = 0; i < loc; i++) {
  14.                 p = p->next;
  15.         }
  16.         return p;
  17. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 18:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表