2011-02-27 59 views
0

我的链表是关于视频商店的。 我应该列出视频详细信息(我知道这部分)和客户详细信息列表。 现在,CUSTOMER列表(第二个节点类型)是我的问题所在。实现嵌套链表(列表清单)

我必须显示客户的姓名,等等,以及该客户签入和签出的视频(将视频删除并插入到客户名单中) 所以我的疑问是,我如何在一个人的名字下删除和插入JUST视频..

EG:客户名单中有许多不同的客户,其中包含不同的姓名和acc号码以及租用的视频。

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

现在我该怎样表明,只有约翰租用这些影片(即我已经插入视频下了他的名字,而不是任何其他客户)

我现在希望大家让我......我想知道如何做到这一点?

+0

因为这是一个C++项目,也许你不必从头开始实现链表。您可以使用[STL列表](http://www.cplusplus.com/reference/stl/list/)。 – bits 2011-02-28 00:22:13

+0

但是,只有你知道,如果你的课程实际上可能意味着你要教授实现链接列表,如果它的话然后忽略我以前的评论 – bits 2011-02-28 00:23:05

回答

2

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

对于执行的其余部分,我认为以下几点:

  1. N视频。
  2. 目前K出租,其中0 <= K <= N
  3. 还有M的客户。有NM没有关系,但它是安全的假设,可能会有更多的客户比视频及大部分的时间,大部分的影片不租(MN大得多,这是更大的比K)。
  4. 你开始,所以你不知道班,std::stringstd::list
  5. 您有以下结构/类。

    结构客户{ INT ACCOUNT_NUMBER; char * name; // ...其他客户信息... };

    结构视频{ 的char *称号; // ...其他视频信息... };

解决方案1:每个客户出租

列表添加一个你Customer类 “租金列表”。这对于列出客户的租赁非常方便,但是当您需要验证某个视频尚未租用时,则会出现问题。第一个是恒定时间,但第二个线性为M+K(循环遍及所有客户,然后是每个客户的租金)。

#define MAX_RENTALS 5 
struct Customer { 
    // regular fields, see above. 
    // ... 
    Video rentals[MAX_RENTALS]; 
    int rental_count; 
}; 

解决方案2:每个视频指针客户

Video类添加一个 “点,以客户”。检查视频是否已经被租用是恒定时间(检查video->customer设置为某个非默认值 - C中的NULL,Java中的null,Python中的None等),但列出特定客户租用的电影是线性在N

struct Video { 
    // regular fields, see above. 
    // ... 
    Customer * rented_to; 
}; 

解决方案3:出租

列表添加一个第三清单分别跟踪租金。定义一个Rental类,该类具有指向Customer的指针和指向Video的指针。然后,定义一个租赁列表。在K中列出客户的所有租金并检查视频是否已租用都是线性的。

#define MAX_RENTALS 100 
struct Rental { 
    Video * video; 
    Customer * customer; 
}; 
Rental rentals[MAX_RENTALS]; 
int rental_count = 0; 

该解决方案为您提供了最好的算法的复杂性和恰好也是更紧密地你会在跟踪一个音像店的顾客,视频和租金真实的商业应用的SQL数据库做什么模仿。

+0

哇......看起来令人惊叹和复杂,甚至我...嗯感谢所有的帮助,我会看到我能做什么,但再次感谢! – Surya 2011-02-28 00:51:30

+0

究竟是什么#define MAX_RENTALS 100的意思是......看起来很熟悉......是Oracle的一些东西?SQL?它在C++上工作吗? – Surya 2011-02-28 01:03:00

+0

是的,它是C++。这是一个C风格的常量定义。更改值以适合您的需求。当你学习更高级的编程课程时,老师会告诉你如何避免提前决定你需要多少内存。它只是用来避免一次引入太多的概念。 – 2011-02-28 04:37:12

0

将第二个列表的头部放入第一个列表的内容结构中。不是全局变量。

+0

什么是一个全局变量?你的意思是在我的第一个列表的内容? – Surya 2011-02-28 00:02:20

+0

@Ovas:这是你有史以来第一个编程类吗?如果是的话,你的教授走得太快了。如果不是,你怎么能不知道全局变量是什么? – 2011-02-28 00:10:03

+0

教授的方式太快了,但我不能失去这一点。我想收集任何可以得到的信息,所以我来到这里。我认为你的全球变量是'节点类型'吗? – Surya 2011-02-28 00:15:43

0

保持在Customer类Video指针列表。

只要视频是由客户租出去了,指针追加到该列表中我上面提到的那个视频。 另请在Video类中保留一个Customer类型的单一指针,以便您可以从视频列表中查找谁租用它。

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);