רשימה מקושרת

alex11m

New member
רשימה מקושרת

יש לי מבנה כזה:
struct list { int num; struct list *next; };​
וראיתי שכדי להוסיף איבר לראש הרשימה יש להשתמש בפרוצדורה הזאת:
void add (struct list** head, int num) { struct list* second = *head; *head = (struct list*)malloc(sizeof(struct list)); (*head)->num = num; (*head)->next = second; }​
אני לא מבין את הפרמטר struct list** head על מה הוא מצביע ולמה אני צריך אותו. הנה התוכנית המלאה:
#include <stdio.h> #include <conio.h> #include <stdlib.h> const int MAX = 3; struct list { int num; struct list *next; }; void add (struct list** head, int num) { struct list* second = *head; *head = (struct list*)malloc(sizeof(struct list)); (*head)->num = num; (*head)->next = second; } void build_list (struct list** head) { int i, num; for (i = 0; i < MAX; i++) { num = random(10); add(head, num); } } void display_list (struct list* head) { struct list* temp = head; printf ("\nThe members of the list are: \n\n"); while (temp != NULL) { printf (" %d ", temp->num); temp = temp->next; } temp = head; printf("\n"); while (temp != NULL) { printf ("%p ", temp); temp = temp->next; } } void del_member (struct list** head) { struct list *temp = *head; *head = (*head)->next; printf ("%p\t", temp); free(temp); } void delete_list (struct list** head) { printf("\n\nDeleting the list\n"); while (*head) del_member (head); } void main() { struct list* head = NULL; randomize(); build_list (&head); display_list (head); delete_list (&head); }​
 

neko

New member
HEAD, כמה מפתיע, מצביע לראש

הרשימה. לכן, אם למשל האיבר הראשון ברשימה שלך הוא X ואתה רוצה להוסיף את האיבר Y, עליך פשוט לשנות את הHEAD שיצביע על Y, ולשנות את Y כך שיצביע על X.
 

alex11m

New member
HEAD לא מצביע לראש (כנס רגע...)

HEAD לא מצביע לראש **HEAD מצביע לראש...
 

alex11m

New member
תסבירו לי בבקשה :

על מה מצביע **HEAD על מה מצביע *HEAD ומה זה HEAD (בתוך הפונקציה!)
 

neko

New member
לאט יותר...

HEAD הוא פשוט STUCT כמו שהגדרת, וHEAD* מצביע אליו (כלומר מכיל את הכתובת בזכרון של HEAD). SO FAR SO GOOD? עכשיו ככה - ADD צריך לשנות את האיבר שבראש הרשימה (לאיבר החדש), ולכן צריך לתת לו POINTER לHEAD*, כדי שישנה את הכתובת ב-HEAD* לכתובת של האיבר החדש שהוכנס. סיידר?
 

GPhoenixX

New member
מצטרף לשאלה

לא הבנתי למה 2 מצביעים ? אם המצביע הראשון הוא לרשימה, למה צריך מצביע למצביע לרשימה ? האם אפשר להחליף את הקוד לזה :
void add (struct list* head, int num) { struct list* second = head; head = (struct list*)malloc(sizeof(struct list)); head->num = num; head->next = second; }​
?
 

GLev

New member
לא אי אפשר...

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

alex11m

New member
אבל למה?

אני צריך לשנות את המצביע? ולשאלה הקודמת שלי: על מה מצביע **HEAD על מה מצביע *HEAD ומה זה HEAD (בתוך הפונקציה!)
 

GPhoenixX

New member
אופס O:

לא שמתי לב שהמצביע צריך שינוי, זה כמו שמעבירים מצביע by var פסקל :)
 
למעלה