C:链接列表中的搜索功能

时间:2012-03-21 11:49:26

标签: c file linked-list

我有两个链接列表。

typedef struct node
{
   char value[256];
   struct node *next;
} Node_t;

    typedef struct node1
    {
       char value1[256];
       int count;
       struct node1 *next;
    } Node1_t;

两个链表都有数据,我想比较两个链表之间的数据,哪些数据很常见,有没有办法找到两个链表之间的类似数据?

感谢。

2 个答案:

答案 0 :(得分:3)

如果两个列表都已排序,那么您可以使用以下算法(伪代码,运行时复杂度O(n+m)):

INPUT: list1, list2 (first nodes of the lists you want to compare, sorted!)

while list1 != null AND list2 != null
    if list1->value < list2->value
        list1->value = list1->next

    elseif
        list2->value < list1->value
          list2->value = list2->next

    else
        list3->appendValue(list1->value)
        list1->next

如果其中一个列表未排序,则必须将第一个列表中的每个元素与第二个列表中的每个元素进行比较(运行时复杂度O(n*m)):

INPUT: list1, list2 (first nodes of the lists you want to compare)

while list1 != null
    list2temp = list2

    while list2temp != null
        if list1->value == list2temp->value
            list3->appendValue(list1->value)
        list2temp = list2temp->next
    list1 = list1->next

首先对列表进行排序然后使用第一种方法通常会更好,这将导致运行时复杂度为O(n log n + m log m)。 在这两种情况下,list3都将包含两个列表的公共元素。

答案 1 :(得分:2)

list = head;
while (list) {
  list1 = head1;
  while (list1) {
    if (yourcompare(list->value, list1->value) == 0) {
      // do something with common data
      // if only possible case: then break;
    }
    list1 = list1->next;
  }
  list = list->next;
}

如果list1中曾经匹配的值不再匹配,您可以添加“短更新”之类的簿记数据。所以你需要'if(!list1-&gt;更新){...; list1-&gt; updated = TRUE;}'在内在的内部。