我正在C中练习,我必须找出两个列表之间是否存在连接(同一节点上的指针)。
我尝试使用两个for
循环并比较指针(或者我认为是这样......):
newList()
:创建一个简单的连接列表。findsize()
:返回节点数。synthesi()
:打印以控制公共节点的位置,并在节点处返回指针(如果存在)。编译器"抱怨"大约tmp = tmp->next
,偶尔大约cur = cur->next
,因为next
的最后list
指针为空(因为它应该在一个简单的列表中)。
struct list{
int num;
struct list *next;
};
struct list* synthesi(struct list*, struct list*);
int findSize(struct list*);
struct list* newList();
void main()
{
struct list *hd1, *hd2, *syn;
int sizeofhd1, sizeofhd2;
hd1 = newList();
hd2 = newList();
/*do{ test
printf("list1: %d\n", hd1->num);
printf("list1: %d\n", hd2->num);
hd1 = hd1->next;
hd2 = hd2->next;
} while (hd2!=NULL);
*/
sizeofhd1 = findSize(hd1);
sizeofhd2 = findSize(hd2);
//printf("list1: %d\n", sizeofhd1); test
//printf("list2: %d\n", sizeofhd2);
syn = (struct list*)malloc(sizeof(struct list));
syn = synthesi(hd1, hd2);
printf("synthesi: %d\n", syn->num);
}
int findSize(struct list *head)
{
struct list *cur;
int flag = 0;
cur = (struct list*)malloc(sizeof(struct list));
cur = head;
do
{
flag++;
cur = cur->next;
}while (cur!=NULL);
free(cur);
return flag;
}
struct list* synthesi(struct list *head1, struct list *head2)
{
int i,j, pos, sizeofhd1, sizeofhd2;
struct list *tmp;
tmp = (struct list*)malloc(sizeof(struct list));
sizeofhd1=findSize(head1);
sizeofhd2 = findSize(head1);
for (i = 0; i < sizeofhd1; i++)
{
for (j = 0; j < sizeofhd2; j++)
{
if (head1->next == tmp)
{
pos = i + i;
break;
}
tmp = tmp->next;
}
head1 = head1->next;
tmp = head2;
}
if (pos == 0)
{
puts("no connection!\n");
return (struct list*)NULL;
}
else{
puts("found at position: ");
printf("%d\n", pos);
return head1->next;
}
}
struct list* newList()
{
struct list *mylist, *hd;
int i;
hd = (struct list*)malloc(sizeof(struct list));
mylist = (struct list*)malloc(sizeof(struct list));
mylist->num = 7;
mylist->next = (struct list*)malloc(sizeof(struct list));
hd = mylist;
for (i = 0; i < 10; i++)
{
mylist->next = (struct list*)malloc(sizeof(struct list));
mylist->next->num = i + 1;
mylist = mylist->next;
mylist->next = (struct list*)NULL;
}
return hd;
}
答案 0 :(得分:0)
我怀疑是编译器“偶尔”抱怨。我打赌这个程序一旦编译和链接并不总是有效:
findsize
似乎有一些错误。首先,您分配一个新列表,然后覆盖新分配的列表,然后在例程结束时释放它,释放您尝试查找大小的列表。试试这个:
int findSize(struct list *node)
{
int num = 0;
for (; node ; node=node->next)
num++;
return num;
}
在synthesi
中,您无需特殊原因再次分配列表项。您需要做的就是逐步完成一个列表,然后逐步完成另一个列表。如果想要在两个列表上找到一个项目(即num
相同的地方),可以这样:
struct list *
findcommonnumber (struct list *lista, struct list *listb)
{
struct list *a;
struct list *b;
for (a=lista; a; a=a->next)
{
for (b=listb; b; b=b->next)
{
if (a->num == b->num)
{
printf ("Found %d at %p and %p\n", a->num, a, b);
return a;
}
}
}
return NULL;
}
这假设您实际上是在尝试在两个列表中找到具有相同编号的项目,因为相同的实际项目不应该在两个列表上(想一想)。
此外,您的list
结构似乎是一个列表项结构,应该是这样的。