我的链接列表是关于视频商店的。 我应该列出一个包含视频详细信息的列表(我知道这一部分)和一份客户详细信息。 现在CUSTOMER列表(第二个节点类型)就是我的问题所在。
我必须显示客户的名字,acc no。等等和该客户签入和签出的视频(删除并将视频插入客户列表) 所以我的疑问是,如何以一个人的名义删除和插入JUST视频..
EG:客户列表中有许多不同的客户,他们有不同的名称和帐号以及租借的视频。
一位顾客约翰出租了2到4个不同的视频,并出租了一些视频。
现在我如何显示只有John租用这些视频(我只能以他的名义插入视频,而不是任何其他客户)
我希望现在有人来找我...我想知道如何做到这一点?
答案 0 :(得分:2)
如果我理解正确,这是一个设计问题,与C ++中的链表无关。
对于其余的实施,我假设如下:
N
个视频。K
出租,0 <= K <= N
。M
位客户。 N
和M
之间没有任何关系,但可以安全地假设可能有比视频更多的客户,而且大多数时候,大多数视频都没有租用({{ 1}}远大于M
,远大于N
)。K
或std::string
。您有以下结构/类。
struct Customer { int account_number; char * name; // ...其他客户信息...... };
struct Video { char * title; // ...其他视频信息...... };
解决方案1:每个客户的租赁列表
在std::list
课程中添加“租借列表”。这对于按客户列出租赁很方便,但是当您需要验证视频是否已经租用时,这会有问题。第一个是常数时间,但第二个是Customer
中的线性(循环所有客户,然后是每个客户的租金)。
M+K
解决方案2:指向客户的每个视频指针
在#define MAX_RENTALS 5
struct Customer {
// regular fields, see above.
// ...
Video rentals[MAX_RENTALS];
int rental_count;
};
课程中添加“指向客户”。检查视频是否尚未租借是恒定时间(检查Video
是否设置为某个非默认值 - C中的video->customer
,Java中的NULL
,null
在Python等中,但列出由特定客户租用的电影在None
中是线性的。
N
解决方案3:租借列表
添加第3个列表以分别跟踪租借。定义一个struct Video {
// regular fields, see above.
// ...
Customer * rented_to;
};
类,其中包含指向Rental
的指针和指向Customer
的指针。然后,定义租赁列表。列出客户的所有租赁并检查视频是否已经租用Video
。
K
此解决方案为您提供了最佳的算法复杂性,并且更恰当地模仿您在实际商业应用程序中使用SQL数据库执行的操作,以跟踪视频商店的客户,视频和租借。
答案 1 :(得分:0)
将第二个列表的头部放在第一个列表内容的结构中。不是全局变量。
答案 2 :(得分:0)
在Customer类中保留Video
指针列表。
一旦客户租借视频,请将指针附加到我在上面提到的列表中的视频。
同时在Video类中保留Customer
类型的单个指针,以便您可以从视频列表中查找有关谁租借它的信息。
答案 3 :(得分:0)
客户节点需要自己的视频列表。通过添加指向视频节点的指针作为客户节点数据成员来执行此操作。
现在编写一个递归过程,该过程接受您要使用的搜索词和指向客户节点的指针。它应该返回客户节点,如果它找到它。即:
// New method to find the right node.
CustomerNode* find_customer( string name, CustomerNode* p_node ) {
将成员方法添加到客户节点,该客户节点走到该客户的视频列表的末尾,并将新视频放在最后(或者,将新视频作为头部并将当前列表附加到其中)
// New method to add a video to the customer
void CustomerNode::add_video( VideoNode* p_video ) {
然后您将在代码中使用它:
CustomerNode* p_john = find_customer( "John", customers_head );
if ( p_john != NULL )
p_john->add_video( p_new_video );