עבור לתוכן

רשימות מקושרות בc

Featured Replies

פורסם

שלום,

נניח ואני צריך לעשות רשימה של מכוניות, זה המבנה שלהן:


typedef struct
{
int num;
char name[50];
list owner
}CAR

אז עפ"י מה שלמדנו, אני ניגש לקובץ של ה list.h ופשוט מגדיר שם איזשהו elementType שיוכל לטפל במבנה הזה (של המכונית)

עכשיו מה קורה עם הרשימה של הבעלים (list owner) שצריכה להיות בתוך כל איבר כזה, ומן הסתם צריכה לטפל במבנה אחר? אני אמור להגדיר 2 קבצי list.h ? או להפוך עכשיו כל פונקציה בlist להיות גנרית?

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

פורסם

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

הדרך לעשות דברים "גנריים" ב-C היא פשוט באמצעות מצביעים ו-*void.

להזכירך, ברשימה מקושרת משתמשים במבנה בסיסי שנקרא Node, המכיל שני שדות - data (המידע שמכיל ה-Node, שהוא מהטיפוס שאתה רוצה שהרשימה תכיל, כמו "מכונית" או "איש") ו-next (המצביע ל-Node הבא). על מנת לעשות את הרשימה גנרית, אתה יכול לעשות שה-data יהיה מטיפוס *void, דהיינו "מצביע כללי", ללא טיפוס ספציפי. ככה אתה יכול ליצור שתי רשימות (ויותר), כשלאחת אתה תמיד דואג להכניס איברים מסוג "מכונית" ולאחרת אתה תמיד דואג להכניס איברים מסוג "איש". כמובן, כשאתה ניגש לשלוף איברים מתוך הרשימות הללו, הקומפיילר לא יודע מה הטיפוסים המקוריים שהכנסת פנימה - הוא רואה רק מצביעים. אתה צריך להמיר את המצביעים הללו חזרה לטיפוסים שהכנסת במקור. זוהי בעצם אחריותך להיות עקבי ולזכור בדיוק מה הטיפוסים שישבו בתוך הרשימה (כלומר, שלא תנסה בטעות לגשת לרשימה של האנשים ולהתייחס לאיברה כאל מכוניות).

ארכיון

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

דיונים חדשים