שפת C רשימות מקושרות help - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שפת C רשימות מקושרות help


c5123

Recommended Posts

 student* removes(student *head,char id[9])
{
student *nav,*nav3;
nav=head;
while(nav!=NULL)
{
if(strcmp(nav->id,id)==0)
{
printf("code 22\n");
nav3=nav->next;
free(nav);
return nav3;
}
if(strcmp(nav->next->id,id)==0)
{
printf("code 23\n");
nav3=nav->next;
nav->next=nav->next->next;
free(nav3);
return head;
}
nav=nav->next;
}
 
}

שליחה:

 
head=removes(head,id);

פונציה למחיקה לפי מחרוזת id

זה עובד בסדר כל עוד אני לא משתמש ב free כדי לשחרר את מה שמחקתי

if הראשון בודק אם התא שאני רוצה למחוק שווה למצביע head

תחילת הרשימה

if השני בודק אם התא הבא (next) שווה לתא שאני רוצה למחוק

שני מצבים

ראוש רשימה

וגוף רשימה

אני לא מבין למה free גורם לקריסה של התוכנית ::)

קישור לתוכן
שתף באתרים אחרים

ה-if הראשון לא צריך לשבת בתוך הלולאה - אתה יכול לבדוק אותו באופן נפרד.

חוץ מזה הקוד שלך נראה תקין. קצת קשה לדעת מה הבעיה בדיוק בלי לדעת מה קורה מסביב. איזו שגיאה אתה מקבל?

קישור לתוכן
שתף באתרים אחרים

אם האיבר שצריך למחוק הוא ראשון ברשימה אתה משחרר בעצם את ראש הרשימה ומאבד את כולה. הפיתרון הוא לשלוח כפרמטר student** ולהחליף את תחילת הרשימה אם צריך למחוק את האיבר הראשון.

קישור לתוכן
שתף באתרים אחרים

זה לא קצר ואני בדיוק מוסיף הערות ומוריד בדיקות

כדי שיעבוד צור קובץ data.csv פתח אם notepad וסים בו 0

תא הרשון מיצג כמה יש ברשימה

וגם id כרגע כתוב שצריך 9 ספרות אבל צריך רק 1 יותר קל לבדוק דברים שאני לא צריך לכתוב 9 ספרות כל פעם :)

 

#include<stdio.h> #include<string.h> #include<stdlib.h> struct student // הגדרת מבנה {
char name[15];
char lname[15];
char id[9];
char lerning[26];
int year;
char fstats[20];
struct student *next;
}; typedef struct student student;
student* check(char a[9],student *head); // פונקציה שבודקת+מציאה אם ת.ז נמצאת כבר בבסיס הנתונים אם כן מחזירה את מיקומו למצביע אם לא מחזירה נאול(0). פ student* update(student *id,int num); // פונקציה מהדכנת/משנה נתונים לאחד המיבנים מקבל מצביע למיבנה ומספר המיצג איזה תא לשנות student* adds(student *head,char name[15],char lname[15],char id[9],char lerning[26],int year,char fstats[20]); // הוספה לרשימה student* removes(student *head,char id[9]); // מחיקה מהרשימה int save(student *head,int counter); // שמירה של הנתונים לקובץ מתבצעת אחרי כל שינוי student* load(int *counter,student *head); // טעינה של קובץ לזיכרון int printlist(student *head,char lerning[26],char fstats[20],int year); // פונקציה אשר מדפיסה למסך וגם לקובץ לפי אחד המשתנים במיבנה student* sort(student *head,int count); // מיון הרשימה לפי שם משפחה int main()
{
student *head=NULL,*nav;
char id[15],name[15],lname[15],lern[26],fstat[20];
int i,select,selb,year,fstats,num,counter=0;
//head=NULL; //head=adds(head,"asaf","david","1","superman",1,"single"); //head=adds(head,"erone","xwar","2","xman",2,"rockon"); //save(head,counter); head=load(&counter,head); // טעינה לזיכרון מחזיר מצביע ראשי //if(head!=NULL) head=sort(head,counter); // מיון //nav=head; //printf("counter=%d\n",counter); do {
select=0;
printf("type:\n1.to update data\n2.to view data\n3.to output report\n4.to exit\n"); // תפריט ראשי scanf("%d",&select);
if(select==22)
head=sort(head,counter);
if(select==1)
{
printf("type:\n1.to add a student\n2.to remove a student\n3.to update student info\n"); // תפריט עדכון מאגר scanf("%d",&selb);
if(selb==1) // קבלת הנתונים של הסטודנט להוספה {
printf("type in student frist name;\n");
scanf("%s",&name);
printf("type in student last name:\n");
scanf("%s",&lname);
printf("type in student id(most have 9 digits):\n");
scanf("%s",&id);
if(strlen(id)!=1) // בדיקה של ת.ז צריך להיות 9 ספרות {printf("id size was worng most have 9 digits\n");continue;} //checking if the id as 9 digits //chang back to 9 this 1 for testing if(head!=NULL) // אם יש נתונים ברשימה {
//printf("code 55\n\n"); if(nav=check(id,head)){ // בדיקה אם ת.ז כבר קיימת בבסיס הנתונים printf("id is allry regiesterd\n");continue;} // אם שונה הודעה וחזרה לראשי }
printf("type in student trend(one of the following lerning trend)\ntype:\n1.for programming\n2.for Electricity\n3.for Electronics\n4.for Industry and management\n"); // תפריט לבחירה מגמת לימוד scanf("%d",&num);
if(num!=1&&num!=2&&num!=3&&num!=4)// בדיקה שניבחר 1-4 אם שונה הודעה וחזרה לראשי {printf("you have type in the worng input most be 1-4\n");continue;}
if(num==1)strcpy(lern,"programming");if(num==2)strcpy(lern,"Electricity");if(num==3)strcpy(lern,"electronics");if(num==4)strcpy(lern,"Industry and management");// העתקת המחרוזת לפי בחירת המשתמש //printf("test for lerning:%s\n",lern); printf("type in student year(1,2,3)\n"); // בחירה של שנת לימוד scanf("%d",&year);
if(year!=1&&year!=2&&year!=3){printf("worng input of year\n");continue;} // בדיקה 1-3 אם שונה הודעה וחזרה לראשי printf("type in student famile status\n1.for silgne\n2.for marriage\n3.for widower\n4.divorced man\n");// תפריט לבחירה מצב משפחתי scanf("%d",&fstats);
if(fstats!=1&&fstats!=2&&fstats!=3&&fstats!=4){printf("you have type in the worng input most be 1-4\n");continue;} // בדיקה 1-4 אם שונה הודעה וחזרה לראשי if(fstats==1)strcpy(fstat,"silgne");if(fstats==2)strcpy(fstat,"marriage");if(fstats==3)strcpy(fstat,"widower");if(fstats==4)strcpy(fstat,"divorced man");
head=adds(head,name,lname,id,lern,year,fstat);
counter++;
head=sort(head,counter);
save(head,counter);
printf("counter=%d\n",counter);
//printf("test for head \nname:%s\nlname:%s\n",head->name,head->lname); }
if(selb==2)
{
printf("type in student id you like to remove\n");
scanf("%s",id);
if(nav=check(id,head))
{
//printf("code 321\n"); printf("head points to:%s\n",head);
head=removes(head,id);
counter--;
printf("aa head points to:%s\n",head);
//head=sort(head,counter); save(head,counter);
}
else {
printf("id was not found\n");continue;
 
}
}
if(selb==3)
{
printf("type in student id you like to update\n");
scanf("%s",id);
if(nav=check(id,head))
{
printf("type:\n1.to chang student frist name\n2.to chang student last name\n3.to chang student id\n4.to chang student trend\n5.to chang student year\n6.to chang student family status\n");
//printf("test for nav loc=\nnav name:%s\n",nav->name); scanf("%d",&num);
nav=update(nav,num);
head=sort(head,counter);
save(head,counter);
}
else {
printf("id was not found\n");continue;
}
}
}
if(select==2)
{
nav=head;
printf("type student id:\n");
scanf("%s",&id);
nav=check(id,nav);
if(nav==NULL)
{
printf("id was not found\n");
continue;
}
printf("nav points to:%s\n",nav);
printf("student info:\nfrist name:%s\nlast name:%s\nstudent id:%s\nlerning:%s\nfamile stats:%s\nyear:%d\n",nav->name,nav->lname,nav->id,nav->lerning,nav->fstats,nav->year);
}
if(select==3)
{
printf("type:\n1.to view report by Trend of student\n2.to view report by famile stats report\n3.to view report by year report\n");
scanf("%d",&selb);
if(selb==1)
{
printf("type in student trend(one of the following lerning trend)\ntype:\n1.for programming\n2.for Electricity\n3.for Electronics\n4.for Industry and management\n");
scanf("%d",&num);
if(num!=1&&num!=2&&num!=3&&num!=4)
{printf("you have type in the worng input most be 1-4\n");continue;}
if(num==1)printlist(head,"programming","0",0);if(num==2)printlist(head,"Electricity","0",0);if(num==3)printlist(head,"electronics","0",0);if(num==4)printlist(head,"Industry and management","0",0);
}
if(selb==2)
{
printf("type in student famile status\n1.for silgne\n2.for marriage\n3.for widower\n4.divorced man\n");
scanf("%d",&fstats);
if(fstats!=1&&fstats!=2&&fstats!=3&&fstats!=4){printf("you have type in the worng input most be 1-4\n");continue;}
if(fstats==1)printlist(head,"0","silgne",0);if(fstats==2)printlist(head,"0","marriage",0);if(fstats==3)printlist(head,"0","widower",0);if(fstats==4)printlist(head,"0","divorced man",0);
}
if(selb==3)
{
printf("type in student year(1,2,3)\n");
scanf("%d",&year);
if(year!=1&&year!=2&&year!=3){printf("worng input of year most be 1-3\n");continue;}
printlist(head,"0","0",year);
}
}
if(select==999)
{
nav=head;
while(nav!=NULL)
{
printf("\nstudent info:\n\nname:%s\nlname:%s\nid:%s\nlerning:%s\nfamile stats:%s\nyear:%d\nnext point to:%s\n",nav->name,nav->lname,nav->id,nav->lerning,nav->fstats,nav->year,nav->next);
nav=nav->next;
}
 
}
}while(select!=4);
 
 
return 0;
}
student* check(char a[],student *head)
{
student *nav;
nav=head;
while(nav!=NULL)
{
if(strcmp(nav->id,a)==0)
return nav;
nav=nav->next;
}
return NULL;
}
student* adds(student *head,char name[15],char lname[15],char id[9],char lerning[26],int year,char fstats[20])
{
student *adds;
adds=(student*)malloc(sizeof(student));
if(adds==NULL){printf("error cant find room in for adds\n");return NULL;}
strcpy(adds->name,name);
strcpy(adds->lname,lname);
strcpy(adds->id,id);
strcpy(adds->lerning,lerning);
adds->year=year;
strcpy(adds->fstats,fstats);
adds->next=head;
return adds;
}
student* update(student *id,int num)
{
char update[26];
int num2,num3,fstats;
if(num==1||num==2||num==3||num==4||num==5||num==6)
printf("input update:\n");
if(num==1){
printf("enter new first name:\n");
scanf("%s",id->name);
//strcpy(id->lname,update); return id;
}
if(num==2){
printf("enter new last name:\n");
scanf("%s",id->lname);
//strcpy(,update); return id;
}
if(num==3){
printf("type in new id\n");
scanf("%s",update);
if(strlen(update)!=1) //chang to 9 befor sending {printf("id size was worng most have 9 digits\n");return id;}
if(!check(update,id))
strcpy(id->id,update);
else printf("id allrdy in data bais u get the boot\n");return id;
}
if(num==4){
//enter new student trend printf("type in student trend(one of the following lerning trend)\ntype:\n1.for programming\n2.for Electricity\n3.for Electronics\n4.for Industry and management\n");
scanf("%d",&num2);
if(num2!=1&&num2!=2&&num2!=3&&num2!=4){printf("you have type in the worng input most be 1-4\n");return id;}
if(num2==1)strcpy(id->lerning,"programming");if(num2==2)strcpy(id->lerning,"Electricity");if(num2==3)strcpy(id->lerning,"electronics");if(num2==4)strcpy(id->lerning,"Industry and management");
return id;
}
if(num==5){
printf("update year (1,2,3):\n");
scanf("%d",&num3);
if(num3!=1&&num3!=2&&num3!=3){printf("worng input of year\n");return id;}
id->year=num3;
return id;
}
if(num==6){
printf("type in student famile status\n1.for silgne\n2.for marriage\n3.for widower\n4.divorced man\n");
scanf("%d",&fstats);
if(fstats!=1&&fstats!=2&&fstats!=3&&fstats!=4){printf("you have type in the worng input most be 1-4\n");return id;}
if(fstats==1)strcpy(id->fstats,"silgne");if(fstats==2)strcpy(id->fstats,"marriage");if(fstats==3)strcpy(id->fstats,"widower");if(fstats==4)strcpy(id->fstats,"divorced man");
return id;
}
printf("worng in put most be 1-6\n");
return id;
}
student* removes(student *head,char id[9])
{
student *nav,*nav3;
nav=head;
while(nav!=NULL)
{
if(strcmp(nav->id,id)==0)
{
printf("code 22\n");
nav3=nav->next;
//free(nav); return nav3;
}
if(strcmp(nav->next->id,id)==0)
{
printf("code 23\n");
nav3=nav->next;
nav->next=nav->next->next;
//free(nav3); return head;
}
nav=nav->next;
}
 
} int save(student *head,int counter)
{
FILE *saves;
student *nav;
int test;
nav=head;
saves=fopen("data.csv","wb");
if(save==NULL)
{
printf("\nfile cant be saved error 22\n");
return;
}
fprintf(saves,"%d",counter);
while(nav!=NULL)
{
test=fwrite(nav,sizeof(student),1,saves);
//printf("test=%d\n",test); nav=nav->next;
}
fclose(saves);
return;
}
student* load(int *counter,student *head)
{
FILE *load;
student *nav;
int count,test,i;
load=fopen("data.csv","rb");
fscanf(load,"%d",&count);
//printf("test count=%d\n",count); if(count==0)
return NULL;
nav=(student*)malloc(sizeof(student)*count);
head=nav;
for(i=0;i<count;i++)
{
printf("i=%d\n",i);
test=fread(nav,sizeof(student),1,load);
printf("test name:%s\n",nav->name);
nav->next=nav+1;
nav=nav+1;
}
nav--;
nav->next=NULL;
*counter=count;
fclose(load);
return head;
} int printlist(student *head,char lerning[26],char fstats[20],int year)
{
student *nav;
FILE *text;
char filename[20];
nav=head;
if(strcmp(lerning,"0")!=0)
{
printf("type in file name:\n");
scanf("%s",filename);
text=fopen(filename,"wt");
if(text==NULL){printf("faild to open file %s\n",filename);return;}
while(nav!=NULL)
{
if(strcmp(nav->lerning,lerning)==0)
{
printf("student info:\nfrist name:%s\nlast name:%s\nstudent id:%s\nlerning:%s\nfamile stats:%s\nyear:%d\n",nav->name,nav->lname,nav->id,nav->lerning,nav->fstats,nav->year);
fprintf(text,"\nstudent info:\nfrist name:%s\nlast name:%s\nstudent id:%s\nlerning:%s\nfamile stats:%s\nyear:%d\n",nav->name,nav->lname,nav->id,nav->lerning,nav->fstats,nav->year);
}
nav=nav->next;
}
fclose(text);
}
if(strcmp(fstats,"0")!=0)
{
printf("type in file name:\n");
scanf("%s",filename);
text=fopen(filename,"wt");
if(text==NULL){printf("faild to open file %s\n",filename);return;}
while(nav!=NULL)
{
if(strcmp(nav->fstats,fstats)==0)
{
printf("student info:\nfrist name:%s\nlast name:%s\nstudent id:%s\nlerning:%s\nfamile stats:%s\nyear:%d\n",nav->name,nav->lname,nav->id,nav->lerning,nav->fstats,nav->year);
fprintf(text,"\nstudent info:\nfrist name:%s\nlast name:%s\nstudent id:%s\nlerning:%s\nfamile stats:%s\nyear:%d\n",nav->name,nav->lname,nav->id,nav->lerning,nav->fstats,nav->year);
}
nav=nav->next;
}
fclose(text);
}
if(year!=0)
{
printf("type in file name:\n");
scanf("%s",filename);
text=fopen(filename,"wt");
if(text==NULL){printf("faild to open file %s\n",filename);return;}
while(nav!=NULL)
{
if(nav->year==year)
{
printf("student info:\nfrist name:%s\nlast name:%s\nstudent id:%s\nlerning:%s\nfamile stats:%s\nyear:%d\n",nav->name,nav->lname,nav->id,nav->lerning,nav->fstats,nav->year);
fprintf(text,"\nstudent info:\nfrist name:%s\nlast name:%s\nstudent id:%s\nlerning:%s\nfamile stats:%s\nyear:%d\n",nav->name,nav->lname,nav->id,nav->lerning,nav->fstats,nav->year);
}
nav=nav->next;
}
fclose(text);
}
return;
}
student* sort(student *head,int count)
{
student *nav,*temp,*nav2,*nav3;
int i;
nav=head;
if(head!=NULL)
{
//for(i=0;i<count;i++) //{ nav=head;
while(nav->next!=NULL)
{

//printf("CODE A\n"); //printf("CODE b\nnav last name:%s\nnext nav last name:%s\n",nav->lname,nav->next->lname); //printf("CODE c\nstrncmp=%d\n",strncmp(nav->lname,nav->next->lname,15)); //printf("c=%c\n",nav->lname[i]); if(strncmp(nav->lname,nav->next->lname,15)>0)
{
// printf("CODE c\nstrncmp=%d\n",strncmp(nav->lname,nav->next->lname,15)); //nav2=head; /*printf("befor\n");
while(nav2!=NULL)
{
printf("\nstudent info:\n\nname:%s\nlname:%s\nid:%s\nlerning:%s\nfamile stats:%s\nyear:%d\nnext point to:%s\n",nav2->name,nav2->lname,nav2->id,nav2->lerning,nav2->fstats,nav2->year,nav2->next); nav2=nav2->next;
}*/ if(nav==head)
{
//printf("CODE 55\nswich:%s with :%s\n",nav->lname,nav->next->lname); temp=nav->next->next;
nav->next->next=nav;
head=nav->next;
nav->next=temp;
nav=head;
continue;
//nav2=head; /*printf("after 55\n");
while(nav2!=NULL)
{
printf("\nstudent info:\n\nname:%s\nlname:%s\nid:%s\nlerning:%s\nfamile stats:%s\nyear:%d\nnext point to:%s\n",nav2->name,nav2->lname,nav2->id,nav2->lerning,nav2->fstats,nav2->year,nav2->next); nav2=nav2->next;
}*/ }
else {
// printf("CODE 66\nswich :%s with :%s\n",nav->lname,nav->next->lname); printf("\n1.nav=%s\n",nav->lname);
temp=nav->next;
nav->next=nav->next->next;
//printf("\n2.nav=%s\n",nav->lname); //printf("\n3.nav3=%s\n",nav3->lname); temp->next=nav3->next;
nav3->next=temp;
nav=head;
continue;
//nav2=head; /*printf("after 66\n");
while(nav2!=NULL)
{
printf("\nstudent info:\n\nname:%s\nlname:%s\nid:%s\nlerning:%s\nfamile stats:%s\nyear:%d\nnext point to:%s\n",nav2->name,nav2->lname,nav2->id,nav2->lerning,nav2->fstats,nav2->year,nav2->next); nav2=nav2->next;
}*/ }

}
nav3=nav;
nav=nav->next;
}
//} }
printf("head=%s\n",head);
return head;
}

קישור לתוכן
שתף באתרים אחרים

אם האיבר שצריך למחוק הוא ראשון ברשימה אתה משחרר בעצם את ראש הרשימה ומאבד את כולה. הפיתרון הוא לשלוח כפרמטר student** ולהחליף את תחילת הרשימה אם צריך למחוק את האיבר הראשון.

זה לא נכון אני שומר את ה next של האיבר הראשון

משחרר את הרשון

ומחזיר את ה next

עכשיו ה next היה הראשי שלי ב main

ושחרור ראש לא משחרר את כל הרשימה?

עד כמה שאני יודע

זה רק משחרר את התא הראשון

ואם לא שמרתה את ה next שלו אז אין דרך להגיע לשאר הרשימה

אבל הם לא שוחררו

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...