我正在编写一个需要横向投放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];
}
}
感谢您提前提供任何帮助,希望我很清楚。
答案 0 :(得分:1)
首先,对“问题”代码进行一些小评论:
void scanlist(int n)
{
int i = 0;
int j = 0;
似乎'j'未使用。
for(i=0; i < n; i++)
这或许会更有效率
for(i=0; i < (n-1); i++)
这将避免引用最后的'head []',因为它已被比较。
{
struct node *temp; //Declare temp
temp = heads[i]; //Assign Starting Address to temp
int x = i++;
为了将'x'初始化为'i + 1',也许'i'会递增;但是,这句话与'x = i等同; i = i + 1;',这对我来说似乎没有帮助。
struct node *temp2; //Declare temp2
temp2 = heads[x]; //Assign Starting Address to temp2
由于前面提到的错误初始化'x','temp'和'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-&gt; val == temp2-&gt; val)'[above]计算为'TRUE','continue'语句将导致程序流回到循环的顶部。 此外,语句'if(temp-&gt; val!= temp2-&gt; 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;
}