נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: בעיה בפונקציה עם רשימה מקושרת

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
lirany
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 15 March 2005
משתמש: מנותק/ת
הודעות: 49
נשלח בתאריך: 04 July 2005 בשעה 11:06 | IP רשוּם
ציטוט lirany

יש לי בעיה בפונקציה שניסיתי לרשום

האלגוריתם: הוספת רשימה למערכת

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

הפונקציה תבצע הקצאה דינאמית באמצעות פקודת malloc()  או calloc() למבנה Rec.
אם ההקצאה נכשלת - הפונקציה תחזיר ערך
NULL.
אחרת - הפונקציה תקצה לרשימה מספר זהות שיוצב בשדה
id. המספרים יוקצו החל מהמספר 1000 - כאשר הערך האחרון שהוקצה יישמר בפונקציה.

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

הפונקציה תבקש ותקלוט מהמשתמש שם שיוצב בשדה name.

ערך השדה next יאותחל ל NULL.

על הפונצקציה להוסיף מבנה זה אל סוף הרשימה.

הפונקציה תחזיר מצביע אל המבנה הראשון ברשימה.

הגדרתי מבנה כך

קוד:

#define NAME_LEN 30

typedef struct rec Rec;

struct rec {

    int  id;

    char name[NAME_LEN];

    struct rec * next;

};

typedef struct rec Rec;

והקריאה לפונקציה

f=add_rec(f);

הפונקציה :

Rec *add_rec(f)


{
    Rec *temp;
    Rec *first=f;
    temp=(Rec*) calloc(1,sizeof(Rec));
    printf("id:");
    scanf("%d",temp->id);
    printf("insert name:");
    gets(temp->name);
    temp-next=NULL;
    while(first)

    first=first->next;
    first=temp;
    return(f);
}


מדוע אני מקבל שגיאה לגבי הקריאה לפונקציה שימוש לא נכון במצביע

suspicios pointer conversation

וגם type mistmach in parameter f

undifende symble next

למרות שהוא מוגדר במבנה


חזרה לתחילת העמוד הצג את כרטיס החבר של lirany חפש הודעות אחרות של lirany
 
ניר
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 12 January 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 3296
נשלח בתאריך: 04 July 2005 בשעה 12:14 | IP רשוּם
ציטוט ניר

הפרמטר - לא הגדרת את הסוג שלו - כתבת סתם f. אתה צריך להגדיר מה הטיפוס שלו.

בנוסף:
קוד:
temp-next=NULL;
צריך לשנות ל:
קוד:
temp->next=NULL;


__________________
מספר האייסיקיו שלי ו/או כתובת ה-MSN שלי אינם מהווים מוקד תמיכה
חזרה לתחילת העמוד הצג את כרטיס החבר של ניר חפש הודעות אחרות של ניר בקר בדף הבית של ניר
 
lirany
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 15 March 2005
משתמש: מנותק/ת
הודעות: 49
נשלח בתאריך: 04 July 2005 בשעה 13:48 | IP רשוּם
ציטוט lirany

int *f

הגדרתי אותו ב main כי בקריאה אני משתמש בו

או שצריך להגדיר אותו בפונקציה??

בפונק add_rec יש לנו מצביע אל ראש השרשרת שמאתחלים אותו ל

NULL

עכשיו, כשמפעילים את add_rec - שולחים לה מצביע למבנה.

ואת מה שהיא מחזירה ... מציבים באותו משתנה המצביע אל ראש השרשרת!

כלומר, אם יש לנו משתנה בשם F, המצביע אל המבנה הראשון -
אז ההפעלה נראית: ;(F= add_rec(F

זה בעצם מה שהיא צריכה לעשות:

מהלך add_rec    
ראשית - ניתן לקרוא לה ללא כל תנאי.
שנית מהלך הפונקציה
    א. ביצוע הקצאה דינאמית
    ב. אם א' נכשל הפונקציה תחזיר ערך null - וביצועה מסתיים
    ג. מוקצה ערך ID לשדה ID (בכל הקצאה הוא צריך לגדול ב1 - כלומר זהו משתנה...)
    ד. מבקשים מהמשתמש להכניס מחרוזת - יש לקלוט אותו לתוך מערך תווים (משתנה לוקלי בפונקציה)
    ה. יש להעתיק את המחרוזת אל המבנה.
     ו. בשדה next יש להציב NULL
     ז. עכשיו יש לחבר את המבנה אל סוף השרשרת. איך עושים זאת?
        יש כאן מקום למעט חשיבה...
        מה קורה אם השרשרת שקיבלנו בעצם ריקה? (מזכיר לכם - הפונקציה צריכה להחזיר מצביע אל ראש השרשרת)
        ואם אינה ריקה... אז אנחנו צריכים לגרום לכך שהמבנה האחרון בשרשרת - יצביע אל זה שעכשיו יצרנו.


האם בתוכנית עכשיו זה מה שמתבצע אני כבר מבולבל...?תיקנתי לפי מה שרשמת..אך עדיין זה נותן

suspicios pointer conversation

וגם type mistmach in parameter f

חזרה לתחילת העמוד הצג את כרטיס החבר של lirany חפש הודעות אחרות של lirany
 

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

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