c:找到两个简单列表之间的连接(公共节点)

时间:2014-02-09 20:15:11

标签: c list

我正在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;
}

1 个答案:

答案 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结构似乎是一个列表项结构,应该是这样的。