try this..
(defun listsubst (xlist xitem xsubst / val xlist2)
(setq val 0)
(setq xlist2 (mapcar '(lambda (x) (cons (setq val (1+ val)) x)) xlist))
(setq xlist2 (subst (cons xitem xsubst) (assoc xitem xlist2) xlist2))
(setq xlist2 (mapcar '(lambda (x) (cdr x))
(subst (cons xitem xsubst) (assoc xitem xlist2) xlist2)
)
)
)
;;test
(listsubst '(0 (B " C ") 0 123 0) 3 5)