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

נושא: שאלה נוספת במבנים ורקורסיה

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


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

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

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

הפונקציה מחזירה מצביע אל השרשרת שבנתה. אם ההקצאה הדינאמית נכשלת באיזה שהוא שלב - על הפונקציה להחזיר NULL.

על הפונקציה להיות רקורסיבית.
עולה... כי היא חייבת להתחיל את בניית השרשרת מהמבנה המכיל
num - 1 וגם res - 1.

משהו יכול להסביר מה הכוונה מהפונקציה מחזירה בעצם?

ניסיתי להתחיל אותה:

קוד:

struct rec {
 int num;
 long int res;
 struct rec * next;
};
typedef struct rec Rec;

Rec * build_factorial(int);

int main()
{
 int number;
 
 printf("Please insert a number >=1:");
 scanf("%d",number);

 if (number <= 0)
  printf("Error - number too small!");
 else
        build_factorial(number);

Rec * build_factorial(number)

{
Rec *temp1;
Rec *temp2=first;
int index;
temp=(Rec*) calloc(1,sizeof(Rec));
if(!temp)
return NULL;
temp->res=index++;

...............................

if(first)
    {
     while(tmp->next)
  tmp=tmp->next;
         tmp->next=temp;
    }
    else  first=temp;
         return(first);

..............


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

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

הפונקציה צריכה להחזיר ראש של רשימה מקושרת

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


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

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

קוד:


Rec * build_factorial(int mispar2)
{

    Rec *first; /*define for pointer first type struct*/
    first=(Rec*) calloc(1,sizeof(Rec));/ *allocation with calloc*/
    if(!first) /*if faild the alloc*/
        return NULL;
    first->num=1;/*list start with num=1*/
    first->res=1;/*list start with res=1*/
    first->next=NULL;/*list start with next=null*/
    if(mispar2==1)
         return(first);

    else /*building the list with formula of factor recorsia*/
    {
        first->next=build_factorial(mispar2-1);
        first->res=(mispar2*first->next->res);
        first->num=mispar2;
        return(first);
    }

}

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

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

יש לך באג: אם הקצאת זיכרון נכשלת בדרך - התוכנית שלך תקרוס. צריך לשנות את התוכנית ככה שהיא תדע להגיב אם הוחזר NULL. חוץ מזה הקוד יפה ואין לי הערות


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


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

if(!first) /*if faild the alloc

printf("no memory")

; return NULL

יש אחי...

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

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

ומה עם 4 ההקצאות הראשונות הצליחו, ופתאום החמישית נכשלה? איפה אתה משחרר את 4 ההקצאות הראשונות?


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


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

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

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

כן, אחרת יש לך פה דליפת זיכרון

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

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

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

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