פורסם 2005 באוקטובר 2920 שנים מחבר נראה לי שלא הבנת אותי נכון (או אולי ההפך)זאת התוכנית המתוקנת שכנראה תעבוד......תוכנית זאת הופכת רשימה הבעיה היא למה אני צריך לשלוח שני ערכים לפונקצייה ולא יכול לבצע את זה כמו שאני אראה בדוגמא הבאה.הערך ששהתוכנית מקבלת זה את המצביע לראש ואת המצביע למצביע לראש.turnlist(h,&h)void turnlist(struct item *hdptr,struct item **begin){ if (hdptr!=NULL && hdptr->next!=NULL) turnlist(hdptr->next,begin); if (hdptr!=NULL && hdptr!=*begin && hdptr->next!=*begin) { change(&hdptr->phone,&(*begin)->phone); *begin=*begin->next; }} ככה אני מעוניין לבצע את זה לשלוח רק את המצביע למצביע לראש וזהו.הבעיה היא שאני צריך ליצור מצב ששני השורות הראשונות בפונקצייה יהיו פעילות רק בקריאה הראשונה לפונקצייה כיצד אני מבצע את זה אם אפשר בכלל???turnlist(&h)void turnlist(struct item **hdptr){ struct item **begin; begin=hdptr; if (*hdptr!=NULL && *hdptr->next!=NULL) turnlist(&(*hdptr)->next); if (*hdptr!=NULL && *hdptr!=*begin && *hdptr->next!=*begin) { change(&(*hdptr)->phone,&(*begin)->phone); *begin=*begin->next; }}
פורסם 2005 באוקטובר 3020 שנים לא עדיף להשתמש ברשימה מקושרת דו-כיוונית (כזו שיש לה גם PREV ו NEXT לכל איבר) ? במקרה כזה לא תצטרך להעביר לה יותר מפרמטר אחד, והיא תוכל לדעת מתי הראשון על פי זה שה PREV יהיה NULL.
פורסם 2005 באוקטובר 3020 שנים מחבר אני יודע שעדיף להשתמש ברשימה דו כיוונית אבל הכל בשביל הבנת הרעיון של הבעיה.זה לא פעם אחת נתקלתי עם הבעיה ולכן אני רוצה לדעת סתם אם יש פתרון לבעיה (אם זה אפשרי כמובן).
פורסם 2005 באוקטובר 3120 שנים אתה לא יכול. בכל שלב ברקורסיה אתה מתייחס למשתנים אחרים (טוב, אותם משתנים אבל במצבים שונים) בגלל זה אתה חייב את שני הפרמטרים (שים לב שאתה מתקדם על שני הרשימות).אם בכל זאת אתה ממש רוצה להעביר רק פרמטר אחד אתה יכול לעשות את זה בצורה של אקומולציה, למשל (כותב מהראש, לא נבדק)struct item** trunlist(struct item** hdptr){ if (*hdptr == NULL) return NULL; return concat(hdptr->next,turnlist(hdptr->next));}כאשר די ברור מה הפונקציה concat (רמז, לשרשר) אמורה לעשותמטי.
פורסם 2005 בנובמבר 220 שנים מחבר חוץ מצורת המבנה של התוכנית לא הבנתי בדיוק מה היא עושה .....1 למה אתה שולח מצביע למצביע כאשר אתה לא מצבע שינוי בתוך הפונקצייה????2 איך אתה מחזיר בפונקצייה עם ערך מוחזר מצביע למצביע NULL?.?3 איך אתה שולח לפונקצייה concat ערכים בצורה הזאת hdptr-> כאשר מדובר במצביע למצביע???4 מה הפונקציה concat עושה ??אם אתה יכול בבקשה לכתוב את הפונקציות במלואם זה יכול לעזור לי מאוד מכיון שאני די חדש בנושא.
פורסם 2005 בנובמבר 220 שנים איך אתה שולח לפונקצייה concat ערכים בצורה הזאת hdptr-> כאשר מדובר במצביע למצביע???אתה צודק, את הפונקציה לא קימפלתי או אפילו בדקתי, כי לא המשחק בפוינטרים משנה פה אלה הרעיון - המבנה של הרקורסיה הוא כזה שמאפשר לך לעשות הרבה דברים ואותו רציתי להדגים.אני אשתמש בתכנית יותר פשוטה להדגים את הרעיון - נממש עצרת :int fuct(int n)if (n<=1) return 1; /*A*/return n*fuct(n-1);שים לב שהחזרת 1 (A) היא המקרה בסיס בדיוק כמו החזרת NULL (שוב, בקשר למשחק בפוינטרים, לא יודע - תבדוק)במקרה שלנו, הפונקציה * היא המקבילה לפונקציה . concat לשאלתך, הפונקציה concat משרשרת או מוסיפה איבר לרשימה נתונה.אגב, המלצה שלי, אם אתה רוצה לעבוד עם רשימות כדאי שלפחות תממש רשימה. זה ממש מכוער לעבוד עם כל הפוינטרים לפוינטרים של סראקטים של.... מטי.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.