圆形链表中两个节点之间的距离

时间:2018-04-01 08:51:37

标签: c data-structures linked-list circular-list

我想在圆形链表中找到两个节点之间的距离(它们之间的节点数)。

节点是:

typedef struct node
{
    int data;
    struct node *next;
}nodal;

nodal *distance(nodal *start)
{
    int n1,n2,d1=0,d2=0,c=0;
    if(start==NULL)
    {
        printf("\nList is empty");
    }
    else
    {
        printf("\nEnter the fist node element : ");
        scanf("%d",&n1);
        printf("\nEnter the second node element : ");
        scanf("%d",&n2);
        nodal *ptr=start;
        while(ptr->next!=start)
        {
            c++;
            if(ptr->data==n1)
            {
                d1=c;
            }
            if(ptr->data==n2)
            {
                d2=c;
            }
        }
    }
    printf("The distance between two nodes is %d",(d2-d1));
    return start;
}

我没有提供任何输出。

另外假设循环列表包含以下数据:

  

1,2,3,4,5,6,7,8,9

如果我提供输入

  

第一个节点元素为9

     

第二个节点元素为4

然后这个算法不起作用。 有关改变的任何建议吗?

3 个答案:

答案 0 :(得分:2)

当您找到第一个节点时开始计数,当您找到第二个节点时停止计数,例如:

int inc = 0, dist = 0;

if (n1 == n2) {
    return 0;
}
node = start;
while (node) {
    dist += inc;
    if ((node->data == n1) || (node->data == n2)) {
        if (inc++ == 1) return dist;
    }
    node = node->next;
    if (node == start) break;
}
return 0;

答案 1 :(得分:0)

首先你必须转到输入的第一个元素,在这个过程中,计数不会增加。然后开始增加计数直到你到达第二个元素。

代码如下:

ptr=start;
while(ptr->data!=n1)
{
   ptr=ptr->next;
}
//---now we have reached the first number----

while(ptr->data!=n2)
{
  count++;
ptr=ptr->next;
}

答案 2 :(得分:0)

您的代码中存在多个问题:

  • 列表末尾的测试阻止您测试最后一个节点。
  • 您通过返回n1 == n2来处理0的情况,这可能不是预期的结果。
  • 如果n1出现在n2之前,则n2n1之间的距离将为负数,这是不正确的:因为列表是圆形的,如果您继续扫描{ {1}},在包裹第一个节点后,您将在正距离处遇到n1

这是另一种解决方案:

n2