两个链表的联合(有序的值集及其频率)

时间:2015-12-12 12:08:50

标签: linked-list pascal freepascal

我们正在学校学习pascal编程,我无法理解链接列表的操作。如果你能提供帮助,我将非常感激。

我有两个由这些记录组成的链接列表:

TYPE
    pa = A^;
    A = record
            v : integer; {the value}
            f : integer; {frequency}
            next : pa; {points to next item in the list, last item points to nil}
        end;

我想将它们联合到一个新的链表中,而不会破坏旧列表。

旧列表按值(v)排序,新订单也应按顺序排序。如果两个先前列表中存在相同的值,那么在新列表中它将只有一次,但频率(f)加在一起。

所以我对如何做到这一点的想法是这样的:

  • 创建一个将新项目添加到列表中的函数(参数:列表(通过ref),频率和值)
  • 创建一个主程序,从一端循环两个列表并比较值
  • 它采用较低的值并将其添加到新列表中,如果它们相等则会添加频率并将项目添加到新列表中。

这会有用吗?你会怎么编码?

所以我试着把它写下来,这就是我得到的:

procedure Unite(list1,list2,var result : pa)
  var head,akt,l1,l2 : pa;
  begin
    l1 := list1; {current position in list1}
    l2 := list2; {current position in list2}
    if(l1 <> nil and l2 <> nil) then begin
      new(head); {head of our new list}
      akt := head; {current position in new list}
      while (l1 <> nil OR l2 <> nil) do begin
        if(l1 = nil and not l2 = nil) then begin
          akt^.v := l2^.v;
          akt^.f := l2^.f;
          l2 := l2^.next;
          akt := new(akt^.next);
          Continue;
        end;
        if(l2 = nil and not l1 = nil) then begin
          akt^.v := l1^.v;
          akt^.f := l1^.f;
          l1 := l1^.next;
          akt := new(akt^.next);
          Continue;
        end;
        if(l1^.v = l2^.v) then begin
          akt^.v = l1^.v;
          akt^.f = l1^.f + l2^.f;
          l1 := l1^.next;
          l2 := l2^.next;
        end else if(l1^.v < l2^.v) then begin
          akt^.v := l1^.v;
          akt^.f := l1^.f;
          l1 := l1^.next;
        end else
          akt^.v := l2^.v;
          akt^.f := l2^.f;
          l2 := l2^.next;
        end;
        akt := new(akt^.next);
      end;
    end;
  end;

0 个答案:

没有答案