在C程序中设计地址簿的数据结构?

时间:2010-04-25 14:31:02

标签: c

我希望地址簿项目的数量可变 - 事先不知道;我在想使用链表是正确的选择吗?

  

“用户可以输入新的人员数据,或打印给定名称的数据,询问数据不必是名称,也可以是电话号码上的地址,程序打印有关人的全部信息,打印按字母顺序排列的书籍内容。将一些数据存储在一个文件中;检索后将其保存并在安装后将其保护。

     

程序应该将文件写入磁盘并从中检索文件。应该用参数调用程序。“

我将使用malloc,但我不知道何时以及如何。

是否有人做了类似的任务或有想法可以帮助我,拜托?

4 个答案:

答案 0 :(得分:3)

对于“玩具”程序,链表就足够了。链表的问题在于,如果你有很多记录。在更糟糕的情况下,您将不得不搜索整个列表以查找条目。最好的方法是散列或散列和树的组合。如果使用指针,则必须使用malloc()。我建议您检查关于链接列表实现的Wikipedia article。他们甚至在C中有一个例子。

答案 1 :(得分:2)

您可以使用链接列表或双向链接列表,但其中一个标准是您可以按排序顺序显示数据。当然,目前尚不清楚姓氏(姓氏)或名字(姓名),城镇或者......是否按字母顺序排列。

您可能需要使用比列表更适合排序的结构,尤其是在不同时间排序标准可能不同的情况下。一般来说,对任意单链表进行排序实际上很难并不是特别有效,但效率可能与此无关。有一些方法可以对双向链表进行排序更容易排序,效率更高。您经常会得到一个数组或某种堆或树结构,因为它们可以更有效地排序。

但是,如果您有一个固定的排序标准,并且可以在构建列表时按顺序放置项目,那么单链接列表就可以了。

创建新条目时将使用malloc() - 每个条目可能会多次使用。{/ p>

当您写入磁盘时,您可能会生成一个文本文件(因为如果文件是全文,则更容易看到需要修复的内容)。您需要标记每个条目的开头和结尾。

答案 2 :(得分:2)

经过仔细考虑,我提供了以下示例(请注意,您可以翻页并对条目进行排序,因此我建议使用双向链接列表,您将其误认为是[ ]数组..)

alt text http://toastytech.com/guis/bobaddressbook.gif

我的原始答案如下(是的,我希望找到Microsoft Bob的屏幕截图,而不是为您提供完成家庭作业所需的完整源代码):

好吧,让我们考虑一下人们感兴趣的所有内容:

typedef struct person {
    char *firstname;
    char *lastname;
    char *phone;
    struct person *prev;
    struct person *next;
    unsigned fname_hash;
    unsigned lname_hash;
    unsigned full_name_hash;
} person_t;

请注意第一个,最后一个和全名的哈希值,这是人们通常搜索地址簿的方式。

然后看看一个非常非常基本的散列算法(从ini文件解析器中拉出来(基本上只是一个字典)that I maintain):

unsigned simple_hash(char *key)
{
 int len;
 unsigned hash;
 int i;

 len = strlen(key);
 for (hash = 0, i = 0; i < len; i++) {
  hash += (unsigned) key[i];
  hash += (hash << 10);
  hash ^= (hash >> 6);
 }
 hash += (hash << 3);
 hash ^= (hash >> 11);
 hash += (hash << 15);
 return hash;
}

上面的散列函数不是防碰撞。当你认为你有匹配时,你仍然需要比较字符串,只是为了确定。但是,使用该哈希(或其他)是搜索链表的最快方法。您将比较无符号值,而不是字符串(除非当然是哈希匹配,然后您只需检查以确保它不是冲突)。

开始时,为列表中的n个条目分配足够的空间(3 - 4应该没问题)。之后,您需要为每次添加或删除重新分配。

当然,大多数人都希望他们的地址簿按字母顺序显示,因此插入和删除节点只是战斗的一半。您还需要对列表进行排序。你提供的东西很难帮助你。

我可以说地址簿通常包含公司信息,因此您可能会遇到“1A害虫控制”。在这种情况下,您可能需要查看natural language string comparison

最后,如果这必须适用于宽字符集,则需要编辑并重新标记您的问题。

答案 3 :(得分:1)

实际上链表不会将您的数据存储到硬盘中。您可以使用FILE来存储数据。您可以查看http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html链接以获取一个小参考。