Just do the same testing you do for the user (if it is deleted or not...)
The following would solve it:
The query should look like this:
$query = array(
'SELECT' => 'r.id, r.post_id, r.topic_id, r.forum_id, r.reported_by, r.created, r.message, t.subject, f.forum_name, u.username AS reporter, p.id AS post_exists',
'FROM' => 'reports AS r',
'JOINS' => array(
array(
'LEFT JOIN' => 'topics AS t',
'ON' => 'r.topic_id=t.id'
),
array(
'LEFT JOIN' => 'forums AS f',
'ON' => 'r.forum_id=f.id'
),
array(
'LEFT JOIN' => 'users AS u',
'ON' => 'r.reported_by=u.id'
),
array(
'LEFT JOIN' => 'posts AS p',
'ON' => 'r.post_id=p.id'
)
),
'WHERE' => 'r.zapped IS NULL',
'ORDER BY' => 'r.created DESC'
);
And then, modify this variable in the loop:
$post_id = ($cur_report['post_exists'] != '') ? '<a href="'.pun_link($pun_url['post'], $cur_report['post_id']).'">Post #'.$cur_report['post_id'].'</a>' : $lang_admin['Deleted post'];
This way it should work.