seth: Vereinfachung folgender Abfrage

Beitrag lesen

gudn tach!

deine erste vereinfachung setzt voraus, dass anfang!=ende gilt (die zweite aber nicht).
mit dieser voraussetzung (anfang!=ende) ginge es dann noch einfacher:

  
if(runner!=ende)  
  runner.get_next().set_last(runner.get_last());  
else  
  ende=runner.get_last();  
if(runner!=anfang)  
   runner.get_last().set_next(runner.get_next());  
else  
   anfang=runner.get_next();

(runner!=anfang) erlaubt ja auch (runner==ende), falls (anfang!=ende).

man kann solche probleme uebrigens mit einer kleinen tabelle loesen

werte fuer | runner==ende ||
runner     | (runner!=ende &&
(disjunkt) |  runner!=anfang)
-----------+-----------------
anfang     | 0
ende       | 1
else       | 1

also waere die vereinfachung des ausdrucks: (runner!=anfang)

falls auch anfang==ende gelten koennte, wuerde die tabelle etwas komplizierter:

werte fuer                    | runner==ende ||
runner                        | (runner!=ende &&
(disjunkt)                    |  runner!=anfang)
------------------------------+-----------------
anfang (aber nicht ende)      | 0
ende (und nicht anfang)       | 1
anfang (==ende)               | 1
else (weder anfang noch ende) | 1

und als ausdruck wuerde sich (runner!=anfang || runner==ende) ergeben.

eine andere moeglichkeit, die aber nicht jedem leichter faellt, ist das umformen:

r=runner, a=anfang, e=ende

(r==a) || ((r!=a) && (r!=e))
<=> ((r==a) || (r!=a)) && ((r==a) || (r!=e))
<=>        true        && ((r==a) || (r!=e))
<=>                       ((r==a) || (r!=e))
eigentlich fertig. falls jedoch (a!=e) vorausgesetzt wird, kann man noch einen schritt weiter umformen:
<=> (fuer a!=e)           (r!=e)

auf der sicheren seite ist man also mit:

  
if(runner==anfang || runner!=ende)  
  runner.get_next().set_last(runner.get_last());  
else  
  ende=runner.get_last();  
if(runner==ende || runner!=anfang)  
   runner.get_last().set_next(runner.get_next());  
else  
   anfang=runner.get_next();

prost
seth