实现嵌套链表(列表列表)

时间:2011-02-27 23:48:49

标签: c++

我的链接列表是关于视频商店的。 我应该列出一个包含视频详细信息的列表(我知道这一部分)和一份客户详细信息。 现在CUSTOMER列表(第二个节点类型)就是我的问题所在。

我必须显示客户的名字,acc no。等等和该客户签入和签出的视频(删除并将视频插入客户列表) 所以我的疑问是,如何以一个人的名义删除和插入JUST视频..

EG:客户列表中有许多不同的客户,他们有不同的名称和帐号以及租借的视频。

一位顾客约翰出租了2到4个不同的视频,并出租了一些视频。

现在我如何显示只有John租用这些视频(我只能以他的名义插入视频,而不是任何其他客户)

我希望现在有人来找我...我想知道如何做到这一点?

4 个答案:

答案 0 :(得分:2)

如果我理解正确,这是一个设计问题,与C ++中的链表无关。

对于其余的实施,我假设如下:

  1. N个视频。
  2. 目前正在K出租,0 <= K <= N
  3. M位客户。 NM之间没有任何关系,但可以安全地假设可能有比视频更多的客户,而且大多数时候,大多数视频都没有租用({{ 1}}远大于M,远大于N)。
  4. 您已经开始了,所以您不了解课程Kstd::string
  5. 您有以下结构/类。

    struct Customer {     int account_number;     char * name;     // ...其他客户信息...... };

    struct Video {     char * title;     // ...其他视频信息...... };

  6. 解决方案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中的NULLnull在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 );