Unless it’s a typo in your post, the problem might be the address you are using. The PCF8574 address range is 0x20 to 0x27 - instead of x39, your’s might be at x27.
You can confirm the address by running “i2c-detect -r -y 3”. The i2c-detect command is part of the i2c-tools package.
You are right about the PC8574 not using register addresses: you just send or read a byte. In Python, I use SMBus’ write_byte(address, value) method, so I think the syntax you are using in C is correct.