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

נושא: רשימה מעגלית של סדרת פיבונאצ’י - תרגיל.

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 29 June 2009 בשעה 15:40 | IP רשוּם
ציטוט Leif

אני מבהיר ראשית, שאלה אינם שעורי-בית.
אני מתקשה בפתרון, אשמח לעזרה. השאלה מוגדרת בשפת C.
הנה השאלה:

נתון מבנה-הנתונים הבא:

קוד:
typedef struct E {
    int val;
    struct E *next;
} node, *pnode;

א. כתוב פונקציה בשם new המשתמשת ב-malloc כדי להזמין node חדש ומאתחלת את שדותיו בעזרת הארגומנטים של new.

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

ב. כתוב פונקציה רקורסיבית

קוד:
pnode newcircle(int n)

המייצרת רשימה מעגלית כזאת:

כזאת

 

ומחזירה מצביע לאיבר המחזיק את ערכו של מספר פיבונאצ'י ה-n-י. מומלץ להשתמש בפונקציה new מסעיף ב'.

לתזכורת, סדרת פיבונאצ'י מוגדרת כך:

fib(0) = fib(1) = 1

fib(n) = fib(n-1) + fib(n-2) לכל n>1.

הבהרות:

א. עבור newcircle(0) יוחזר  

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

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 01 July 2009 בשעה 13:41 | IP רשוּם
ציטוט Leif

כמעט הצלחי.

התכנית עושה כל מה שדרוש חוץ מזה שהיא לא מחברת את החוליה האחרונה לראשונה. כלומר היא יוצרת רשימה רגילה ולא מעגלית כמו שנדרש.

למישהו יש מושג איך לעשות את זה?

קוד:
#include <stdio.h>
#include <stdlib.h>
 

typedef struct E {
 int val;
 struct E *next;
} node, *pnode;


pnode newcircle(int n);
pnode new(void);


int main(void)
{
  
 pnode head = newcircle(6);

 for (; head; head=head->next)
  printf("%d ", head->val); 

 return 0;
}

pnode new() 
{
 return (node *)malloc(sizeof (node));

}

pnode newcircle(int n) 
{
 
 pnode p = new();

 /* private cases; not a part of the recursion */
 if (n < 0)
  return NULL; 
 if (n == 0) {
  p->val = 1;
  p->next = p;
  return p;
 }
 
 if (n == 1) {
  p->val = 1;
  p->next = new();
  p->next->val = 1;
  p->next->next = NULL;
 } else {
  p->next = newcircle(n-1);
  p->val = p->next->val + p->next->next->val;
 }
 return p;
}

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 04 July 2009 בשעה 11:08 | IP רשוּם
ציטוט Leif

תודה על שיתוף הפעולה לאורך כל הדרך.
חזרה לתחילת העמוד הצג את כרטיס החבר של Leif חפש הודעות אחרות של Leif בקר בדף הבית של Leif
 
גד
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 26 July 2009 בשעה 00:33 | IP רשוּם
ציטוט גד

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

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

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

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