I personally don't like the DH approach to solving forward/inverse kinematics problems (though I know many people who do, and I'm not saying it's a bad approach!). I wrote a MATLAB program once upon a time to solve the forward kinematics of any multi-link robot arm... The basic idea behind it is that you specify the axes of rotations for your joints, the length of each link in the arm, and the angles of each joint, and it will spit back the Cartesian coordinates of each point and draw a pretty picture.

So basically, you have your generic transormation matrix:

T = |1+(1-c)*(ux^2-1) (1-c)*ux*uy-uz*s (1-c)*ux*uz + uy*s 0|

|(1-c)*ux*uy+uz*s 1+(1-c)*(uy^2-1) (1-c)*uy*uz-ux*s 0|

|(1-c)*ux*uz-uy*s (1-c)*uy*uz+ux*s 1+(1-c)*(uz^2-1) 0|

|0 0 0 1|

Where c = cos(a) and s = sin(a) and ux, uy, and uz are the x, y, and z components of the unit vector that your angle is rotating about. So if you had a joint which rotates 30 degrees about the Z axis, a = 30 and u = [0 0 1].

To transform a point in space you do:

new_point = T * point

To get each successive joint location in your arm you do:

position = previous_position + T_previous * T * link_length_vector

The thing I like about this approach is that you only need to specify 1 angle per joint and it's corresponding unit vector. It works equally well in 2D and 3D space and it's pretty straightforward to write an algorithm that will solve the forward kinematics for any number or combination of joint unit vectors, which means you don't have to solve the forward kinematics ever again

It also allows you to do gradient tracing algorithms pretty easily instead of deriving the inverse kinematics for every concievable arm geometery. I can post some MATLAB code later that shows some of this stuff when I get home later if you're interested.