Luvdisc sometimes is carrying them when you catch them, so catch lots.
Heart scales are only in Pokemon emerald, ruby and sapphire but you can get one if you trade a heart scale from ruby or emerald or sapphire to leafgreen then take it but it will not do anything in the game.
you go to route 128 and surf and use super rod to fish. you will find a pokemon called luvdisc and catch it and they usually are holding heart scales.
You can get them if you find them somewhere. You can also get them if your Pokemon with pick up ability picked it up. If possible, you can fish in luvdiscs and use thief to steal heart scale that they usual hold.
underground
You can find them in the Underground
On wild Pokemon and serval locations.
To find heart scales on Pokemon diamond/pearl you need the explorer kit to go underground. once you are underground look for cracks inthe wall, and eventully you will find a heart scale in the cracks.
Heart Scales can be purchased in the Pokeathlon shop for 1000P
I only found heart scales in Ruby, Sapphire and Emerald but I'm not sure of the other games.
all you have to do is go on Serribi.net
They r dug up underground. They are hard to find
You can find the Heart Scale under ground by using the Explorer Kit.