嵌入式之LINUX--C学生管理系统

http://blog.csdn.net/liuzongming1988

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define LEN sizeof(struct student)

int n;


/*  printf("/**AUTHOR: Lzm  ** 2013-10-28 ****/\n");
//	printf("/**Student score record system****/\n");
//	printf("/**Select what you want to do:****/\n");
//	printf("/***0 : create a document!  ******/\n");
//	printf("/***1 : insert a new record!******/\n");
//	printf("/***2 : delete a record!    ******/\n");
//	printf("/***3 : save the records!  *******/\n");
//	printf("/***4 : Open a exited file! ******/\n");
//	printf("/***5 : quit the system!    ******/\n");
*/

struct student{
  long num;
  float score;
  struct student *next;
};// Don't forget the ";"!!!!!!!!

//1.Create a new chain table list
struct student * creat(void){
  struct student *head;
  struct student *p1,*p2;
  char temp;
  n=0;
  p1=p2=(struct student *)malloc(LEN);/*CREAT A NEW UNIT*/
  printf("Enter school_number and score:\n");
  printf("Enter 0  0 to quit!\n");
  scanf("%ld %f",&p1->num,&p1->score);
  head=NULL;
  while(p1->num !=0)                // if the num is 0,it is the end of the input
  {
    n=n+1;                          //calculate the number of the member in list
    if(n==1)
	head=p1;                    //if it is the first one,give the address to the head
    else 
	p2->next=p1;               //give the new UNIT address to the last UNIT'S next

    p2=p1;                         //p2 is to save the address of the last.
    p1=(struct student *)malloc(LEN);// malloc() a new mem
    printf("Enter school_number and score:\n");
    scanf("%ld %f",&p1->num,&p1->score);
  }

    p2->next=NULL;
    return (head);
}

//2.show a chain table list
void print(struct student *head){
    struct student* p;
    printf("Now ,These %d records are:\n",n);
    p=head;
    if(head!=NULL){
      do{
	printf("num:%-8ld score:%5.1f\n",p->num,p->score);
    	p=p->next;                            //point to the next UNIT
	}while(p!=NULL);
    }
}


//3.delet the member in a chain table list
struct student * del(struct student *head,long num){
    struct student *p1,*p2,*p3;
    if(head==NULL){
	printf("\n list is null\n");
    	goto end;
    };
    p1=head;
    while(num!=p1->num&&p1->next!=NULL){
        p2=p1;
        p1=p1->next;
    }
    if(num==p1->num){
        if(p1==head)
		{
		p3=head;//to free
		head=p1->next;
		}
        else 
		{
		p3=p1;//to free
		p2->next=p1->next;
		}

	free(p3);//free the malloc, free has no return value,it is a void func.

        printf("delete:%ld successful\n",num);
        n=n-1;
    }
    else 
	printf("can't find the student: %ld\n",num);

  end:
    return (head);
}


//4.save the traintable into a file
void save_train(struct student *head){
    struct student *p;
    char address[40];
    FILE *fp;

    if(head==NULL){
	printf("\n list is null\n");
    	goto end;
    };

    printf("Enter the path!\n");
    scanf("%s",&address[0]);
    
    puts(address);//////////////////

    fp = fopen(address,"wb+");// create a new file
    fputs("school_number",fp);
    fputs("      score   ",fp);

     p=head;
    if(head!=NULL){
      do{
	fputc('\n',fp);                    // enter a Enter 
	fprintf(fp,"   %-10ld",p->num);	   //read the num to num
	fprintf(fp,"    %-3.2f",p->score); //read the score to score
    	p=p->next;                            //point to the next UNIT
	}while(p!=NULL);
    }
    printf("save success to %s \n",address);
    fclose(fp);//you should close the file 
  end:
    ;
}

//5.insert a chain table list  from little to big
struct student *insert(struct student *head,struct student *stu){
    struct student *p0,*p1,*p2;
    p1=head;
    p0=stu;

   if(head==NULL){
      head = p0; p0->next=NULL;
   }
   else{
      while((p0->num > p1->num)&&(p1->next!=NULL))
		{
		   p2=p1;
		   p1=p1->next;
		}
	if(p0->num  <=  p1->num){
            if(head == p1) head = p0;
            else p2->next=p0;
           p0->next = p1;
        }
        else{//That is p1->next == NULL
	   p1->next=p0;
	   p0->next=NULL;	
	}
	n=n+1;
   }
   return head;
}

//6.print the head messages!!!
void print_message(){
	printf("/**AUTHOR: Lzm  ** 2013-10-28 ****/\n");
	printf("/**Student score record system****/\n");
	printf("/**Select what you want to do:****/\n");
	printf("/***0 : create a document!  ******/\n");
	printf("/***1 : insert a new record!******/\n");
	printf("/***2 : delete a record!    ******/\n");
	printf("/***3 : save the records!  *******/\n");
	printf("/***4 : Open a exited file! ******/\n");
	printf("/***5 : quit the system!    ******/\n");
}


//7.import a file as chaintable list
struct student * open_chain(void){

  struct student *head;
  struct student *p1,*p2;
  FILE *fp;

  char address[40],a[20];

   printf("Enter the path!\n");
   scanf("%s",&address[0]);

   fp = fopen(address,"rb");// read a file
   if(fp == NULL) return 0;
   if(!feof(fp)){
	fscanf(fp,"%s",&a[0]);
        fscanf(fp,"%s",&a[0]);
	}
   n=0;  
   p1=p2=(struct student *)malloc(LEN);/*CREAT A NEW UNIT*/
   head=NULL;

  while(!feof(fp)){
        fscanf(fp,"%ld",&p1->num);
        fscanf(fp,"%f",&p1->score);
    n=n+1;                          //calculate the number of the member in list
    if(n==1)
	head=p1;                    //if it is the first one,give the address to the head
    else 
	p2->next=p1;               //give the new UNIT address to the last UNIT'S next

    p2=p1;                         //p2 is to save the address of the last.
    p1=(struct student *)malloc(LEN);// malloc() a new mem
  }

    p2->next=NULL;
    printf("read ok!");
    close(fp);
    return (head);
}
//the main
int main(){ 
  struct student *p,*stu;
  long int num;

  char select = -1;
  char insert_quit=0;
  char delete_quit= 0;

  print_message();
  scanf("%d",&select);
  putchar('\n');

  while(1)
  {// main while
  	switch (select)
  	{
  	  case 0 :  p=creat();   //create
                    break;
	
  	  case 1 :  {            //insert
			 stu = (struct student *)malloc(LEN);
 			 printf("Enter the num and score:\n");
			  printf("Enter 0  0 to quit!\n");
 			 scanf("%ld%f",&stu->num,&stu->score);
 			 while(stu->num !=0){
 			 	 p=insert(p,stu);////////////////
 				 stu = (struct student *)malloc(LEN);
 				 printf("Input the num and score:\n");
  				 scanf("%ld%f",&stu->num,&stu->score);
 			  };
			break;
			}
	
  	  case 2 :  printf("Enter the num:\n");    //delete  
		    printf("Enter 0 to quit\n");        
		      scanf("%ld",&num);
  	            while(num !=0){
  		      		p=del(p,num);
  		      		print(p);
				printf("Put into the num:\n");
				scanf("%ld",&num);
			}
		      break;
	
  	  case 3 :  save_train(p);
			goto step1;
			break;    //save

  	  case 4 :  p=open_chain();
			break;


	  case 5 :
          default: goto endm;
	
  	}
	
  	select = -1;
	system("clear");
	print_message();
	print(p);

    step1:
	printf("/**Select what you want to do!****/\n");
  	scanf("%d",&select);
  	putchar('\n');

  }// end of main while
  endm:
//
  return 0;
}



猜你喜欢

转载自liuzongming.iteye.com/blog/2280492