These normals are slightly off; my guess is that they'll make the cylinder look like it's bulging strangely.  As opposed to the hemisphere, where the normals are the same as the vertices, the cylinder's normals should be (sin(theta), 0, cos(theta)).  The easiest way to do this is to double the size of vertexData, write each normal before each vertex, and adjust the stride/offset arguments of glVertexPointer/glNormalPointer: something like glNormalPointer(GL_FLOAT, 6 * sizeof(float), 0)/glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), 3 * sizeof(float)).