我想在圆形链表中找到两个节点之间的距离(它们之间的节点数)。
节点是:
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
然后这个算法不起作用。 有关改变的任何建议吗?
答案 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
之前,则n2
和n1
之间的距离将为负数,这是不正确的:因为列表是圆形的,如果您继续扫描{ {1}},在包裹第一个节点后,您将在正距离处遇到n1
。这是另一种解决方案:
n2