#include 
"stdafx.h"
#include 
"malloc.h"
#include 
"stdlib.h"
#include 
"stdio.h"
#define NULL 0
#define LEN sizeof(struct student)

struct student
{
    
long num;
    
float score;
    
struct student *next;
}
;

int n;//n为全局变量,指结点数

struct student *creat(void)
{
    
struct student *head;
    
struct student *p1,*p2;
    n
=0;
    p1
=p2=(struct student *)malloc(LEN);//开辟结点,使p1、p2指向它
    scanf("%ld%f",&p1->num,&p1->score);
    head
=NULL;//此时链表中无结点
    while(p1->num!=0)//约定学生学号不为0,如果学号为0,代表链表创建结束
    {
        n
=n+1;
        
if(n==1)//判断是否是第一个结点
            head=p1;//head指向首结点
        else
            p2
->next=p1;//将新结点的地址赋给p2结点的next成员
        p2=p1;//p2指向新结点
        p1=(struct student *)malloc(LEN);
        scanf(
"%ld%f",&p1->num,&p1->score);
    }

    p2
->next=NULL;//链表创建过程结束
    return(head);
}


void print(struct student *head)
{
    
struct student *p;
    printf(
"\nNow,these %d records are:\n",n);
    p
=head;//p指向第一个结点
    if(head!=NULL)
        
do
        
{
            printf(
"%ld%5.1f\n",p->num,p->score);
            p
=p->next;
        }
while(p!=NULL);
}


struct student *del(struct student *head,long num)
{
    
struct student *p1,*p2;
    
if(head==NULL)//判断链表是否为空
    {
        printf(
"\nlist null!\n");
    }

    
else
    
{
        p1
=head;
        
while(num!=p1->num&&p1->next!=NULL)
        
{
            p1
=p2;
            p1
=p1->next;//p1后移一个结点
        }

        
if(num==p1->num)
        
{
            
if(p1==head)
                head
=p1->next;
            
else
                p2
->next=p1->next;//让p1的前一个结点指向其后一个结点
            printf("delete:%ld\n",num);
            n
=n-1;
        }

        
else
            printf(
"%ld not been found!",num);//找不到该结点
    }

    
return(head);
}


struct student *insert(struct student *head,struct student *stud)
{
    
struct student *p0,*p1,*p2;
    p1
=head;//p1指向第一个结点
    p0=stud;//p0指向要插入的节点
    if(head==NULL)//判断链表是否为空
    {
        head
=p0;
        p0
->next=NULL;//p0指向的结点作为头结点
    }

    
else
    
{
        
while((p0->num>p1->num)&&(p1->next!=NULL))
        
{
            p2
=p1;
            p1
=p1->next;//p1后移一个结点
        }

        
if(p0->num<=p1->num)
        
{
            
if(head==p1)//p0是头结点
                head=p0;
            
else
                p2
->next=p0;
            p0
->next=p1;
        }

        
else//p0是尾结点
        {
            p1
->next=p0;
            p0
->next=NULL;
        }

    }

    n
=n+1;//结点数加1
    return(head);
}


void main()
{
    
struct student *head,*stu;
    
long del_num;
    printf(
"input records:\n");
    head
=creat();
    print(head);
    printf(
"\ninput the deleted number:");
    scanf(
"%ld",&del_num);
    
while(del_num!=0)
    
{
        head
=del(head,del_num);
        print(head);
        printf(
"\ninput the deleted number:");
        scanf(
"%ld",&del_num);
    }

    printf(
"\ninput the inserted record:");
    stu
=(struct student *)malloc(LEN);
    scanf(
"%ld%f",&stu->num,&stu->score);
    
while(stu->num!=0)
    
{
        head
=insert(head,stu);
        print(head);
        printf(
"\ninput the inserted record:");
        stu
=(struct student *)malloc(LEN);
        scanf(
"%ld%f",&stu->num,&stu->score);
    }

    free(head);
    system(
"Pause");
}