עבור לתוכן

c#|בעיה בהגדרת המחלקה "תור"

Featured Replies

פורסם

אין משמעות למה שאתה אומר.

אתה רוצה לקשר בין "שום דבר" ל"שום דבר".

כשיש לך רשימה ריקה, first ו-last הם null, וזהו.

הקשר בין first ו-last, אם יש כזה, מתחיל כשברשימה יש איברים.

חוץ מזה, לא הבנתי למה החלטת שחייב להיות ביניהם קשר. ברשימה עם 5 איברים, האם יש קשר (ישיר) בין הראשון והאחרון?

  • תגובות 38
  • צפיות 4.6k
  • נוצר
  • תגובה אחרונה
פורסם
  • מחבר

ניקח לדוגמא רשימה עם 3 איברים - האיבר האמצעי מקשר בין FIRST וLAST.

איך ואיפה(בפעולת ההוספה?) אני מגדיר את הקוד הזה שיקשר (בעקיפין) ביניהם??.

פורסם

אחזור ואשאל שנית:

האם יש קשר (ישיר) בין הראשון והאחרון?

עשית מה שאמרתי לך לעשות קודם? (לצייר את הרשימות על דף)

פורסם
  • מחבר

יש בינהים קשר ישיר כישי אבר אחד ברשימה(מצביעים על אותו עצם) וכשיש 2 אברים( העצם שאליו מפנה FIRST, מפנה לעצם ש-LAST מפנה אליו)

כל שאר המקרים אין קשר ישיר.

הנה ציור של מה שביקשת...(ניסיתי לצלם את זה אבל זה יותר מ-1.5MB)

[attachment deleted by admin]

פורסם

סבבה.

עכשיו, בוא דווקא נתחיל מהמקרה הפשוט יותר - כבר יש לך רשימה עם שני איברים, ואתה רוצה להיות מסוגל לבצע את שתי הפעולות הבאות:

להוסיף איבר לקצה אחד של הרשימה,

ולהוריד איבר מהקצה האחר של הרשימה.

(ההחלטה מאיזה קצה להוריד ולאיזה להוסיף - שלך)

איך תעשה את זה? מה הקוד שצריך לכתוב?

פורסם
  • מחבר

אני צריך ליצור חוליה חדשה עם הערך שנקלט לשנות את ערך ה-NEXT שלה לאבר האחרון הנוכחי ולעדכן את התכונה LAST שתפנה לחוליה הזאת.

בדיוק כמו שכתבתי במבנה המחלקה בפעם הראשונה:

 public void Insert(T x)
{
Node<T> temp = new Node<T>(x, this.last);
this.last = temp;
}

שאלה שלא קשורה בכלל: אם עידכנתי את ההודעה שלי אחרי שכבר ראית אותה, אתה תראה אותה ב-"הראה תגובות חדשות להודעות שלי"?

פורסם
  • מחבר

אם אין לך כוח להסביר לי, אז אתה יכול לפחות לומר לי מה אני צריך לשנות בקוד(לא לרמוז)??

פורסם

זה לא ש"אין לי כוח להסביר", זה שזה תרגיל שלך ואני לא אמור לפתור לך אותו.

אני אחזור שוב:

בוא דווקא נתחיל מהמקרה הפשוט יותר - כבר יש לך רשימה עם שני איברים, ואתה רוצה להיות מסוגל לבצע את שתי הפעולות הבאות:

להוסיף איבר לקצה אחד של הרשימה (insert),

ולהוריד איבר מהקצה האחר של הרשימה (remove).

שים לב למשהו חשוב - ההחלטה מאיזה קצה מכניסים איבר ומאיזה קצה מוציאים היא שרירותית, כלומר אתה צריך לבחור. choose wisely.

איך תעשה את זה? מה הקוד שצריך לכתוב?

אחרי שכתבת את הקוד שלך, נסה לצייר איך נראית הרשימה לפני ואחרי כל אחד מהפעולות האלה.

פורסם
  • מחבר

החלטתי שמכניסיםם מצד ימין ומוציאים משמאל.

כבר כתבתי לך את הקוד ולא אמרת עליו כלום, (הוא לא טוב? או שפשוט לא ראית??) בכל מקרה:

public void Insert(T x)
{
Node<T> temp = new Node<T>(x, this.last);
this.last = temp;
}
public T Remove()
{
T temp = this.first.GetInfo();
this.first = this.first.Getnext();
return temp;
}

צרפתי תמונה של הרשימה לאחר כל אחת מהפעולות.

[attachment deleted by admin]

פורסם

נניח שיש לך תור בן Node אחד.אתה מכניס Node חדש לסוף ע"י this.last = temp. (השורה היחידה ב-Insert שמשפיעה על מבנה התור)

עכשיו אתה רוצה להוריד את שני ה-Nodes.

מה יקרה אחרי ה-remove הראשון?

תאר את הרשימה שלך.

פורסם

החלטתי שמכניסיםם מצד ימין ומוציאים משמאל.

אני לא יודע מה זה "ימין" ו"שמאל", אני רק יודע מה זה התחלה (first) וסוף (last).

עשה טובה, תחתוך את התמונות לגודל המתאים לפני שאתה מעלה אותן לפורום.

ה-remove שלך סבבה (חוץ מהבעיה ש-captaincaveman רמז עליה, תחשוב על זה).

אבל שים לב ל-insert. על מי מצביע ה-next של האיבר החדש שיצרת?

פורסם

למעשה אני רמזתי על בעיה ב-insert וכיוונתי אותו לגלות אותה דרך הסרת האיברים מהרשימה אחרי הוספה :)

פורסם

בקיצור - לפני שאתה כותב קוד תבין את התיאוריה שמאחרי המבנה "תור". קרא קצת ברשת, תלמד את הפעולות של הוצאה, הכנסה, הצצה.

עכשיו, תור עובד בשיטת FIFO. כל איבר מכיל ערך ומצביע על האיבר הבא. האיבר האחרון מצביע על כלום = null.

פורסם
  • מחבר

אם הבנתי נכון הבעיה היא כשמנסים להוסיף חוליה בפעם הראשונה.

אם אני מנסה להוסיף חוליה לפי הקוד שרשמתי אז רק LAST מתעדכן ו-FIRST תמיד נשאר ריק ., זה כאילו אין שום קשר בין LAST ו-FIRST (נכון??)

אם זה נכון איך אני אמור לפתור את זה?

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים