שפת C/ניהול זיכרון דינאמי: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
שורה 469:
 
==מעט על מבנים והנדסת תוכנה==
 
 
===הבעיה===
 
ב[[שפת C/ניהול זיכרון דינאמי#שימוש לקליטת והפיכת מספרים|שימוש ברשימה מקושרת לקליטת והפיכת מספרים]] ראינו כיצד להשתמש ברשימה מקושרת כדי לקלוט מספרים ולהדפיסם בסדר הפוך. הפתרון שראינו, למרות נכונותו - בעייתי. קשה לכתוב ולתחזק קוד כזה (ראה גם [[שפת C/פונקציות#מעט על פונקציות והנדסת תוכנה|מעט על פונקציות והנדסת תוכנה]]). בפרט, הקוד שמטפל בקלט ופלט מעורבב בקוד שמנהל את הרשימה המקושרת. לכן:
*קשה לעשות שימוש חוזר (כלומר בתוכנית אחרת) בקוד הרשימה המקושרת
*הקוד מסובך להבנה יחסית למה שהוא עושה
*אם תתגלה שגיאה בקוד, יהיה קשה יותר להבין איזה חלק גרם לה
 
 
 
===כימוס מחסנית===
<source lang = "c">
struct list_
{
link *head;
unsigned long size;
};
 
 
typedef struct list_ list;
 
 
void list_ctor(list *list);
void list_dtor(list *list);
unsigned long list_size(const list *list);
int list_push(list *list, int data);
int list_pop(list *list);
int list_head(const list *list);
</source>
 
 
<source lang = "c">
void list_ctor(list *list)
{
list->head = NULL;
list->size = 0;
}
</source>
 
 
<source lang = "c">
void list_dtor(list *list)
{
link *l = list->head;
while(l != NULL)
{
link *const old = l;
l = old->next;
free(old);
}
list_ctor(list);
}
</source>
 
 
<source lang = "c">
unsigned long list_size(const list *list)
{
return list->size;
}
</source>
 
 
<source lang = "c">
int list_push(list *list, int data)
{
link *const l = (link *)malloc(sizeof(link));
if(l == NULL)
return -1;
l->data = data;
l->next = list->head;
list->head = l;
++list->size;
return 0;
}
</source>
 
<source lang = "c">
int list_pop(list *list)
{
link *const l = list->head;
const int data = l->data;
list->head = l->next;
--list->size;
free(l);
return data;
}
</source>
 
 
<source lang = "c">
int list_head(const list *list)
{
const link *const l = list->head;
return l->data;
}
</source>
 
==מעט על מבנים והנדסת תוכנה==