Speaking as an NES emulator author, the most complex thing about writing an NES emulator is Memory Mappers. When you add mappers in to your emu, this is where you experience complexity.
So don't worry about them. Just support games like Baloon Fight, Mario, etc. that use "mapper 0": no mapper.
Zophar.net has enough info on the NES (under 'technical docs' section) to write your emulator. I'll give you a few steps:
I use C++, personally, as it's an elegant way of representing a machine, but you can use the same process in C if you want.
1) Create an NES class or object of some form. It should contain the PPU(picture processing unit), the system memory, the CPU, and the joystick input units.
2) READ UP ON the nes! nes.txt and nestech.txt from zophar.net are indespensible
3) Code up a simple routine to load the ROMs (since you won't be worrying about MMCs, you don't need a complex one, and you can just have a flat 64k array of memory to work with)
4) Now find something to get input and output with. I'd reccommend SDL or Allegro. Allegro.cc has info on Allegro, and SDL, well, google it. Allegro is great for starting out, but its timers kind of suck.
5) Program the memory reads/writes. Small task, but make sure to pay attention to the documentation!
6) Most of the work you'll do now is just writing the PPU.
It draws the pictures to the screen. Joysticks are a bit of a pain, but in the end, very easy and short.
And then...all of the sudden...you (hopefully) have a working NES emulator!
Unfortunately, programming the PPU is rather complex compared to the rest. Lots and lots of bit shifts and pointer maths. You can get it wrong very easy and have very little hope of debugging it. Just be very careful and make sure you understand the docs.