将 3 个列表合并到一个大列表中
Merging 3 lists in one big list
所以我有几个列表(HeadFirstCl,HeadNoSm,HeadSm),我想连接它们并创建一个大列表(HeadByPlace),而其他列表的指针仍然存在。我的问题是为什么我的连接列表功能不起作用?
#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");
}
我想我发现了你的一些问题。您的连接列表函数有一个主要问题,即 while 循环永远不会终止。在C++中,如果指针不为 null,则从指针到 bool 的隐式转换返回 true,如果指针为 null,则返回 false。您的循环无限检查以查看 A 是否为空。显然,如果你给函数一个空指针,它不会做任何事情,但如果你给它一个有效的 A 指针,它将永远循环,因为函数中的 A 没有被更改。这是一个简单的函数,它实际上将合并您的列表而不会出现此问题:
void ConnectLists(Point P, Point A) {
while (P->NextByPlace != nullptr) {
P = P->NextByPlace;
}
P->NextByPlace = A;
}
此函数循环到列表末尾,然后将 A 添加到末尾。请注意,对于 A 或 P 为 null 的情况,它不会执行任何错误处理。如果你用这个函数替换你的函数,它会按照你的要求去做。
您提供的代码也存在非常基本的问题。如果创建多个相同类型的条目,则创建函数会出现段错误。此外,您的测试用例存在缺陷。每次调用 Connect Lists,您都会向 connectLists函数传递指针 HeadByPlace for P。HeadByPlace 为空,因此尝试访问它的任何值(例如 nextByPlace)都会导致分段错误。如果要确保我提供的connectLists函数的代码正常工作,请初始化每种列表类型(HeadFirstCl,HeadNoSM和HeadSM)之一,并尝试连接它们,或者只是为HeadByPlace分配内存。
另外,我有一条不请自来的建议。您可能想看一下 STL 容器C++:http://www.cplusplus.com/reference/stl/。我认为其中一些数据结构,例如向量或列表,可能对您对于这个项目有用。
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何在C++中使用pybind11加载一个pickle python列表
- 链表,将列表复制到另一个列表
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 测试迭代器是否位于列表中的最后一个
- 我如何创建一个列表,然后从中创建两个列表,其中一个用于偶数,另一个用于奇数?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 给定一个源文件,有没有办法要求 gcc 返回仅直接包含的头文件的列表?
- 如何将列表从一个类复制到另一个类
- 删除链接列表中剩余的最后一个节点
- 处理程序的模块列表中有一个错误的模块"WebSocketModule"
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 在 c++ 中创建一个类似 python 的列表
- 将两个列表合并为一个蛇形列表
- 如何将一个单词拆分成字母,并将它们放入一个无序的列表/集合中
- 遍历列表包含排除最后一个元素的内容
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素