מבוא לתכנות ב- JAVA תרגול 11
רשימה מקושרת אוסף סדור של איברים מאותו טיפוס. קודקוד ברשימה )Node( מכיל את המידע + הצבעה לקודקוד הבא ברשימה data next first רשימה :)List( מיוצגת ע"י מצביע לאיבר הראשון ברשימה data next data next data next Object1 Object2 Object3 null
מערך לעומת רשימה מקושרת מערך גודל קבוע מראש רשימה מקושרת גודל משתנה בכל הכנסה ומחיקת איבר ברשימה גישה "מהירה" לכל מקום במערך גישה "לא מהירה" למיקום ספציפי הכנסת איבר חדש דורשת השקעה הכנסת איבר חדש בצורה מהירה )addfirst( קל לשימוש מסובך יותר ממערך 3
המחלקה Node public class Node <T>{ private T data; private Node<T> nextnode; public Node(T data){ this.data = data; // class Node<T> constructor1 public Node(T data, Node<T> nextnode){ this.data = data; this.nextnode = nextnode; // class Node<T> constructor2
המחלקה Node )המשך( public void setdata(t data){ this.data =data; public T getdata() { return this.data; public void setnext(node<t> nextnode){ this.nextnode = nextnode; public Node<T> getnext(){ return this.nextnode; { public String tostring() { return " " + this.data;
תיאור השיטות במחלקה Node מטרה שיטה T getdata() void setdata(t data) מחזיר את ה- data Getter - Setter משנה את הערך של השדה data להיות this.data void setnext(node<t> nextnode) Node<T> getnext() - Setter משנה את הערך של השדה nextnode להיות this.nextnode nextnode מחזיר את הערך של Getter
Simple Usage public static void main(string[] args) { Node<Character> bob = new Node<Character>('a', null); Node<Character> joe = new Node<Character>('b', bob); Node<Character> tom = new Node<Character>('c', joe); System.out.println(tom.getData()); System.out.println(tom.getNext().getData());
המחלקה List public class List<T> { private Node<T> first; // class List attribute public List() { this.first = null; // class List constructor public Node<T> getfirst() { return this.first; // getfirst public boolean isempty() { return this.first == null; // isempty
בהמשך נראה את המימוש של הכנסת איבר, כעת נבין שהפונקציה מקבלת מיקום נוכחי וערך עבור יצירת צומת חדשה עוקבת לנוכחית ברשימה )ודוחפת את השאר "ימינה" אם צריך( Simple Usage public static void main(string[] args) { List<Integer> l = new List<Integer>(); l.insert(null, 5); l.insert(null, 6); l.insert(l.getfirst(), 7); System.out.println(l.getFirst().getData()); System.out.println(l.getFirst().getNext().getData()); System.out.println(l.getFirst().getNext().getNext().getData()); 6 7 5
תרגיל: חישוב אורך רשימה נוסיף למחלקה List שיטה לחישוב אורך הרשימה. נשלים את השיטה length כך שהערך המוחזר יהיה אורך הרשימה. public int length(){ int ans = 0; Compute length return ans;
תרגיל: חישוב אורך רשימה נוסיף למחלקה List שיטה לחישוב אורך הרשימה. נשלים את השיטה length כך שהערך המוחזר יהיה אורך הרשימה. public int length(){ int ans = 0; for (Node<T> p = getfirst(); p!= null; p = p.getnext()){ ans++; return ans;
המחלקה List הכנסת איבר לרשימה public Node<T> insert(node<t> pos, T x) { Node<T> q = new Node<T>(x); // creating new node if( pos == null ) { q.setnext(this.first); this.first = q; // first element in the list else { q.setnext(pos.getnext()); pos.setnext(q); return q; // insert
המחלקה List מחיקת איבר מהרשימה pos public Node<T> remove(node<t> pos) { if( this.first == pos ) { this.first = pos.getnext(); // remove first node return this.first; else { Node<T> prev = this.first; while(prev.getnext()!= pos) // searching pos reference prev = prev.getnext(); prev.setnext(pos.getnext()); return prev.getnext(); // remove
תיאור השיטות במחלקה List מטרה מחזירה את הקודקוד הראשון ברשימה מחזירה true אם הרשימה ריקה ו false אחרת מכניסה קודקוד חדש לרשימה שה data שלו הוא x אחרי הקודקוד pos ומחזירה את הקודקוד החדש שהוכנס מוחק את הקודקוד pos מהרשימה והקודקוד העוקב ל pos מוחזר. שיטה Node<T> getfirst() boolean isempty() Node<T> insert(node<t> pos, T x) public Node<T> remove(node<t> pos)
תרגיל: שרשור רשימות ממשו את הפונקציה append שמקבלת שתי רשימות של מספרים עם ls2 ומחזירה רשימה חדשה שהיא השרשור של ls1 ls1,ls2 public static List<Integer> append(list<integer> ls1, List<Integer> ls2){
נגדיר ראשית פונקציית עזר copy בהינתן רשימה עותק של ls נגדיר צומת עזר שיוכנס לרשימה החדשה עם הערך של המקורית ls מחזירה רשימה חדשה שהיא public static List<Integer> copy(list<integer> ls){ List<Integer> ans = new List<Integer>(); if (ls == null){ return null; Node<Integer> pos = null; for(node<integer> p = ls.getfirst(); p!= null; p = p.getnext()){ pos = ans.insert(pos, p.getdata()); return ans;
תרגיל: שרשור רשימות פתרון public static List<Integer> append(list<integer> ls1, List<Integer> ls2){ if (ls1 == null ls1.isempty()){ return copy(ls2); if (ls2 == null ls2.isempty()){ return copy(ls1); List<Integer> ls3 = copy(ls1); Node<Integer> p = ls3.getfirst(); while (p.getnext()!= null){ p = p.getnext(); p.setnext(copy(ls2).getfirst()); return ls3;
מבחן 2015, סמסטר ב, מועד א. 25 ( שאלה 5 לפניך מחלקה :Point כל נקודה במחלקה Point מוגדרת ע"י שתי קואורדינטות שמוגדרים ע"י המילים 'BLUE','RED ו.'GREEN' ) נק' xו- y ואחד משלושה צבעים - אדום,כחול וירוק public class Point { private double x, y; private String color; // Point points) public static List<Point> colorpointsort(point[ ] כתוב פעולה ומחזירה רשימה של כל הנקודות כך שהן מסודרות ברשימה לפי points אשר מקבלת כפרמטר מערך של נקודות הצבעים. והשלישי.'BLUE' למעט סידור זה על כל הנקודות לשמור על הסדר שהיה GREEN RED, השני הצבע הראשון במערך המקורי. הערה: אפשר להשתמש בכל הפעולות של מחלקות List<T> String,Node<T>, וגם בפעולות של מחלקה Point )פעולה בונה, פעולות SET ו - GET ) בלי לממש אותן. רעיון? נבנה 3 רשימות ונשרשר?...
פתרון public static List<Point> colorpointsort(point[] points) { List<Point> reds = new List<Point>(); List<Point> blues = new List<Point>(); List<Point> greens = new List<Point>(); Node<Point> redpos = reds.getfirst(); Node<Point> bluepos = blues.getfirst(); Node<Point> greenpos = greens.getfirst(); for (int i = 0; i < points.length; i++) { if (points[i].color.equals("red")) { redpos = reds.insert(redpos, points[i]); else if (points[i].color.equals("blue")) { bluepos = blues.insert(bluepos, points[i]); else/*if (points[i].color.equals("green")) */{ greenpos = greens.insert(greenpos, points[i]); redpos.setnext(greens.getfirst()); greenpos.setnext(blues.getfirst()); return reds;