The interrupt one is pretty reasonable in itself, but by no means 100% accurate.
The programmed one is only one way of doing it - and by no means the ideal one!
eg. An interrupt based system can have a regular interrupt, often called a clock interrupt, where several different I/O devices or buffers are checked, and if the one being checked does not need any action at that instant, it's skipped (not waited for) and the other things checked in the same way, then the interrupt exits and the main program execution resumes.
Pure programmed I/O can be done in the same way; if a program runs in a fast enough "loop" through its normal functions without ever stalling, it can check for I/O actions needed or do them every time, again skipping forward rather than waiting if something is not ready in that pass through the loop.
Or a mixture of the two.
Pure programmed I/O as that flowchart shows (with no interrupts used) with where the program loops waiting for something to happen is very rare in the real world, usually it's restricted to simple example programs or applications that are themselves near trivially simple.
In the majority of applications the program must respond to user input and do other things at the same time, so perpetually sitting in a wait loop is not feasible.