שפת C - עבודה עם רשימות מקושרת שמכילות גם מצביעים לרשימות אחרות (יום ראשון)
עבודה מורכבת עם רשימות מקושרות
נוכל להגדיר שאיברי רשימה מקושרת מכילים גם מצביע ל head של רשימה מקושרת אחרת.
כך למעשה ניצור דבר הדומה למערכים דו ממדיים, רק בצורה דינאמית ומקושרת (לא רציפה בזיכרון).
התרגיל היום זה ליצור פונקציה שיוצרת רשימה מקושרת של סטודנטים ( ) CreateStudentList
ופונקציה שיוצרת רשימה מקושרת של קורסים ( ) CreateCourseList
כל סטודנט מכיל את השדות הבאים:
שם סטודנט
גיל
תעודת זהות (ID)
מערך של ציונים בקורס הנוכחי (עדיף מערך דינאמי אבל אפשר להסתפק במצב קבוע של בדיוק 4 מבחנים במערך)
כל קורס מכיל את השדות הבאים:
שם הקורס
ממוצע ציונים (של כל הסטודנטים שלומדים בקורס)
מצביע לראש (= head) רשימה מקושרת של כל הסטודנטים שלומדים בקורס (sh)
next לקורס הבא
הפונקציה ( ) CreateCourseList יוצרת מערך של קורסים וגם משתמשת בפונקציה ( ) CreateStudentList
כדי ליצור רשימה מקושרת של סטודנטים עבור כל קורס וקורס.
#include<stdio.h>#include<stdlib.h>#include<conio.h>structcourse {
char CN [20];
double avg;
structstudent *sh;
structcourse *next;
};
structstudent {
char SN[20];
int age;
int ID;
double score[4];
structstudent *next;
};
structstudent* CreateStudentList (){ // יצירת רשימה מקושרת של סטודנטיםstructstudent *p, *head=NULL, *tail;
int i;
while(1){
printf("Any key to add student, esc to finish: \n");
flushall();
if (getch() == 27) break;
p= (structstudent *)malloc (sizeof(structstudent));
printf(" Enter student name: ");
gets (p->SN);
printf(" Enter student age: ");
scanf("%d",&p->age);
printf(" Enter student ID: ");
scanf("%d",&p->ID);
for(i=0;i<4;i++){
printf(" %d Enter score: ",i+1);
scanf("%lf",&p->score[i]);
}
if (head ==NULL){
head = tail = p;
p->next = NULL;
}
else {
tail -> next = p;
p-> next = NULL;
tail = p;
}
}
return head;
}
///structcourse* CreateCourseList (){ // רשימה מקושרת של קורסים שמקשרים אל רשימות סטודנטיםstructcourse *p, *head=NULL, *tail;
structstudent *q;
int i,h;
double avg=0.0;
while(1){
printf("Press esc to exit, any key to continue and create a new course: \n");
flushall();
if (getch() == 27) break;
p = (structcourse *)malloc (sizeof(structcourse));
printf("Enter course name: ");
gets (p->CN);
p-> sh = CreateStudentList ();
if (!p->sh) returnNULL; // == if (p-> sh==NULL) return NULL;
p->avg = 0.0;
for(q=p->sh,h=0; q ;q=q->next,avg=0.0,h++){
for(i=0;i<4;i++)
avg += (q->score[i]);
avg = avg/4.0;
p->avg +=avg;
}
p->avg = (p->avg)/h;
printf("There are: %d students in %s course \n",h,p->CN);
printf("The avg score of all the students in the %s course is: %.3lf \n\n\n",p->CN,p->avg);
if (head == NULL){
head = tail = p;
p->next = NULL;
}
else {
tail -> next = p;
p-> next = NULL;
tail = p;
}
}
return head;
}
void main(){
structcourse *p;
p = CreateCourseList ();
}
..........
עכשיו נמשיך:
1. כתבו פונקציה שמדפיסה את כל הנתונים. (קורסים ו סטודנטים).
2. כתבו פונקציה שתמצא ותדפיס את הפרטים של הסטודנט הכי טוב בכל קורס בנפרד.
3. פונקציה שמקבלת שם של קורס, ומדפיסה שמות התלמידים שנכשלו (ממוצע פחות מ 55) באותו קורס.
אין תגובות:
הוסף רשומת תגובה