我正在编写一个程序,该程序需要横向抛出64个链表。(每个节点有一个名为val的整数变量)它需要比较每个节点,如果val等于任何列表的任何其他节点中的另一个val,它必须记录它。
我写了一个函数,它横向抛出列表,但在打印出它们相等的结果后,它崩溃了,我的函数看起来是这样的(n=64):
void scanlist(int n)
{
int i = 0;
int j = 0;
for(i=0; i < n; i++)
{
struct node *temp; //Declare temp
temp = heads[i]; //Assign Starting Address to temp
int x = i++;
struct node *temp2; //Declare temp2
temp2 = heads[x]; //Assign Starting Address to temp2
while(temp != NULL)
{
if(temp->val == temp2->val)
{
printf("theyre on the same line, %d = %d n", temp->val, temp2->val);
temp2 = temp2->next;
continue;
}
else if(temp->val != temp2->val)
{
temp2 = temp2->next;
continue;
}
else if(temp2 == NULL)
{
temp = temp->next;
temp2 = heads[x];
continue;
}
}
}
}
我的链接列表代码如下:
struct node
{
int val;
struct node *next;
} ;
struct node* heads[64]; // array with the roots of the lists
struct node* currs[64]; // array holding pointers to current positions in list
struct node* create_list(int val, int listNo){
struct node *ptr = (struct node*)malloc(sizeof(struct node));
ptr->val = val;
ptr->next = NULL;
heads[listNo] = currs[listNo] = ptr;
return ptr;
}
void setup_list_array(int n){
int i;
for(i=0; i<n; i++)
{
heads[i] = NULL;
currs[i] = heads[i];
}
}
谢谢你提前给我的帮助,希望我是清白的。
首先,对"问题"代码的一些小评论:
void scanlist(int n)
{
int i = 0;
int j = 0;
"j"似乎未使用。
for(i=0; i < n; i++)
也许这对来说会更有效
for(i=0; i < (n-1); i++)
这将避免引用最后一个"heads[]",因为它已经被比较过了。
{
struct node *temp; //Declare temp
temp = heads[i]; //Assign Starting Address to temp
int x = i++;
也许"i"是递增的,以便将"x"初始化为"i+1";然而,这个陈述等价于'x=i;i=i+1;',这在我看来没有帮助。
struct node *temp2; //Declare temp2
temp2 = heads[x]; //Assign Starting Address to temp2
由于前面提到的"x"初始化错误,"temp"one_answers"temp2"现在指向同一个"head[]"元素。
while(temp != NULL)
{
if(temp->val == temp2->val)
{
printf("theyre on the same line, %d = %d n", temp->val, temp2->val);
temp2 = temp2->next;
continue;
}
else if(temp->val != temp2->val)
此处可以省略'else'语句。如果"(temp->val=temp2->val)"[上面]的计算结果为"TRUE",则"continue"语句将导致程序流回到循环的顶部。此外,语句"if(temp->val!=temp2->val)"可以省略,因为它将始终计算为"TRUE"
{
temp2 = temp2->next;
continue;
}
else if(temp2 == NULL)
由于此"else"语句,如果上述"if"语句中的任何一个的求值结果为"TRUE",则不会执行此代码。这似乎是一个缺陷。
{
temp = temp->next;
temp2 = heads[x];
continue;
}
}
}
}
下面是实现此方法的另一种方法(包含的注释描述了正在发生的事情)。
void scanlist(
int n
)
{
int i;
/* Iterate the list heads. */
for(i=0; i < (n-1); ++i)
{
struct node *temp = heads[i]; // Declare temp and assign Starting Address
/* Iterate primary list nodes. */
while(temp)
{
int j;
/* Iterate list heads to compare */
for(j=i+1; j < n; ++j)
{
struct node *temp2 = heads[j]; //Declare temp2 and assign Starting Address
/* Iterate list nodes to compare */
while(temp2)
{
if(temp->val == temp2->val)
printf("theyre on the same line, %d = %d n", temp->val, temp2->val);
temp2=temp2->next;
}
}
}
temp=temp->next;
}
return;
}