【问题标题】:Merging 3 lists in one big list将 3 个列表合并到一个大列表中
【发布时间】:2017-10-26 14:59:30
【问题描述】:

所以我有几个列表(HeadFirstCl、HeadNoSm、HeadSm),我想连接并制作一个大列表(HeadByPlace),而其他人的指针仍然存在。我的问题是为什么我的 ConnectLists 功能不起作用?

#include <iostream>
#include <string>
using namespace std;

struct Item {
    string naprav;
    string chasizl;
    string chaskac;
    int termizl;
    int termkac;
    char fime[5];
    int mqsto;
    Item *NextByPlace;
};

typedef Item *Point;
Point HeadByPlace, HeadFirstCl, HeadNoSm, HeadSm;

void ConnectLists(Point &P, Point A) {
    while (A) {
        if (P->NextByPlace == NULL)
            P->NextByPlace = A;
        P = P->NextByPlace;
    }
}

void PrintOut(Point P) {
    while (P) {
        cout << P->fime<<endl;
        cout << P->chasizl << endl;
        cout << P->chaskac << endl;
        cout << P->mqsto << endl;
        cout << P->naprav << endl;
        cout << P->termizl << endl;
        cout << P->termkac << endl;
        P = P->NextByPlace;
    }
}

void Create(Point &Head, int i) {
    Point Last, P;
    Last = NULL;
    P = new Item;
    P->mqsto = i;
    cout << "Enter destination" << endl;
    cin >> P->naprav;
    cout << "Enter departure HOUR" << endl;
    cin >> P->chasizl;
    cout << "Enter arrival HOUR" << endl;
    cin >> P->chaskac;
    cout << "Enter # of leaving terminal" << endl;
    cin >> P->termizl;
    cout << "Enter # of entering terminal" << endl;
    cin >> P->termkac;
    cout << "Last name of traveler" << endl;
    cin >> P->fime;
    P->NextByPlace = NULL;
    if (Head == NULL) {
        Head = P;
    } else {
        Last->NextByPlace = P;
    }
    Last = P;
}

void Delete(char name[], Point &Head) {
    Point Pprev, P;
    P = new Item;
    Pprev = new Item;
    cin >> name;
    while (Head) {
        if (strcmp(Head->fime, name) == 1) {
            Pprev = P->NextByPlace;
            *P = *Pprev;
            delete Pprev;
        }
    }
}

void main() {
    char ch;
    HeadByPlace = NULL;
    HeadFirstCl = NULL;
    HeadNoSm = NULL;
    HeadSm = NULL;
    int i;
    cout << "New element? (Y/N)? : ";
    cin >> ch;
    while (ch == 'Y' || ch == 'y') {
        cout << "Enter seat #: ";
        cin >> i;
        if (i < 7) Create(HeadFirstCl,i);
        else if (i > 7 && i < 25) Create(HeadNoSm,i);
        else if (i > 25) Create(HeadSm,i);
        cout << " New element? (Y/N) ?: ";
        cin >> ch;
    }

    ConnectLists(HeadByPlace, HeadFirstCl);
    ConnectLists(HeadByPlace, HeadNoSm);
    ConnectLists(HeadByPlace, HeadSm);
    PrintOut(HeadByPlace);

    system("pause");
}

【问题讨论】:

  • 查看调用Connect列表前后P的值。我的猜测是它会是一样的。在 c 中,将指针传递给函数允许您更改指向的内容,但对指针本身的更改不会在函数之外持续存在(对 P 的更改: P = P->NextByPlace; 丢失)。为了让它像我认为你想要的那样工作,你需要使用指针指针。 (即 Point ** P)并在您的函数中取消引用它。

标签: c++ list data-structures merge


【解决方案1】:

我想我发现了你的一些问题。您的连接列表函数有一个主要问题,您的 while 循环永远不会终止。在 C++ 中,如果指针不为空,则从指针到布尔的隐式转换返回 true,如果指针为空,则返回 false。您的循环会无限检查 A 是否为空。显然,如果你给函数一个空指针,它不会做任何事情,但是如果你给它一个 A 的有效指针,它会永远循环,因为 A 在函数中没有被改变。这是一个简单的函数,可以实际组合您的列表而不会出现此问题:

void ConnectLists(Point P, Point A) {
    while (P->NextByPlace != nullptr) {  
        P = P->NextByPlace;           
    }
    P->NextByPlace = A;
}

此函数循环直到列表的末尾,然后将 A 添加到末尾。请注意,对于 A 或 P 为空的情况,它不会进行任何错误处理。如果你用这个替换你的函数,它会按照你的要求做。

您提供的代码也存在非常根本的问题。如果您创建多个相同类型的条目,则您的 create 函数会出现段错误。此外,您的测试用例存在缺陷。每次调用它时,您都将指针 HeadByPlace 传递给 connectLists 函数。 HeadByPlace 为 null,因此尝试访问其任何值(例如 nextByPlace)会导致分段错误。如果您想确保我提供的 connectLists 函数的代码有效,请初始化您的每种列表类型(HeadFirstCl、HeadNoSM 和 HeadSM)并尝试连接它们,或者只是为 HeadByPlace 分配内存。

另外,我有一条不请自来的建议。您可能想看看 C++ STL 容器:http://www.cplusplus.com/reference/stl/。我认为其中一些数据结构,例如向量或列表,可能对您对这个项目有用。

【讨论】:

  • 了解如何创建正确的循环,孩子们。非常感谢伙计。我没有注意到
猜你喜欢
  • 2017-03-15
  • 2016-04-18
  • 2012-01-27
  • 2014-01-27
  • 1970-01-01
  • 2021-01-10
  • 2014-05-16
相关资源
最近更新 更多