C复制带有两个指针的链表

时间:2018-12-30 12:29:16

标签: c pointers linked-list char assert

这是针对学校项目的,我需要完成一个功能来复制看起来像这样的员工的链表

typedef struct TEmployee
{
    struct TEmployee * m_Next;
    struct TEmployee * m_Bak;
    char * m_Name;
} TEMPLOYEE;

这是我的复制功能

TEMPLOYEE * cloneList(TEMPLOYEE * src)
{
    TEMPLOYEE* current = src;
    TEMPLOYEE* newList = NULL;
    TEMPLOYEE* tail = NULL;

    while(current != NULL)
    {
        if(newList==NULL)
        {
            newList = (TEMPLOYEE*)malloc(sizeof(TEMPLOYEE));
            newList -> m_Name = current -> m_Name;
            newList -> m_Next = NULL;
            newList -> m_Bak = NULL;
            tail = newList;
        }
        else
        {
            tail -> m_Next = (TEMPLOYEE*)malloc(sizeof(TEMPLOYEE));
            tail = tail -> m_Next;
            tail -> m_Name = current -> m_Name;
            tail -> m_Next = NULL;
            tail -> m_Bak = current -> m_Bak;
        }
        current = current -> m_Next;
    }

    return newList;
}

这可以正常工作,但是不能正确复制m_Bak,因此当我尝试执行此操作时,断言m_Next和m_Bak应该相同,但不相同

assert ( b && ! strcmp ( b -> m_Name, "Maria" ) && b -> m_Bak == b -> m_Next );

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

此行

toMap

是错误的,因为它会使新列表指向当前列表。

您宁愿需要:

Seq(1,2,3).permutations.map(p => (p.head, p.tail)).toMap
res50: scala.collection.immutable.Map[Int,Seq[Int]] = Map(1 -> List(3, 2), 2 -> List(3, 1), 3 -> List(2, 1))

请注意,您的代码不会复制名称,因此两个列表都将指向相同的名称对象。如果您想复制名称,请查看tail -> m_Bak = current -> m_Bak;

也请注意:

您不需要强制转换 else { tail -> m_Next = (TEMPLOYEE*)malloc(sizeof(TEMPLOYEE)); tail -> m_Next -> m_Bak = tail; // New line tail = tail -> m_Next; tail -> m_Name = current -> m_Name; tail -> m_Next = NULL; // tail -> m_Bak = current -> m_Bak; Delete this line } 返回的值。但是,您应该检查strdup是否返回NULL

答案 1 :(得分:0)

这是我的解决方案:

public float damage = .10f;

private void OnTriggerEnter2D(Collider2D collision)
{  
    if(collision.isTrigger!=true && collision.CompareTag("Enemy"))
    {
        Debug.Log("Enemy is Damaged");
        EHealthBar.TakeDamage(damage);
    }
}

希望我能正确理解您的问题...