课外天地 李树青学习天地清心茶舍 → 关于结构体的第三次课件


  共有16469人关注过本帖树形打印复制链接

主题:关于结构体的第三次课件

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1940 积分:26616 威望:0 精华:34 注册:2003/12/30 16:34:32
关于结构体的第三次课件  发帖心情 Post By:2008/12/10 20:45:35 [只看该作者]

1 静态链表
# include <stdio.h>

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

void main()
{
        struct student stus[]={{1001,90.5,NULL},{1002,89,NULL},{1003,79,NULL}};
        struct student * header=stus;
        struct student * pointer=header;
        stus[0].next=&stus[1];
        stus[1].next=&stus[2];
        while(pointer!=NULL)
        {
                printf("学号是%d,成绩是%f\n",pointer->num,pointer->score);
                pointer=pointer->next;
        }
}

2 动态链表
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header;
        p1 =(struct student *)malloc(sizeof(struct student));


        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        p2=p1;//1
        header=p1;//3
        p1 =(struct student *)malloc(sizeof(struct student));  
        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        p2->next=p1;//2
        p2=p1;
        p1 =(struct student *)malloc(sizeof(struct student));
        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        p2->next=p1;
        p1->next=NULL;//4

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

}

改进的循环方法:
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header;
        int n=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(n<2)
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        p2->next=p1;
        p1->next=NULL;

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

}

增加更为灵活的处理方法——一旦输入0,则退出循环
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header;
        int n=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(p1->num!=0)//1
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        //p2->next=p1;
        //p1->next=NULL;
        p2->next=NULL;//2

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

}

3 删除节点
先考虑删除中间的节点情况
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header;
        int n=0;
        int number=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(p1->num!=0)
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        p2->next=NULL;

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

        printf("请输入需要删除的学号:");
        scanf("%d",&number);
        
        p1=header;
        p2=header;
        while(1)
        {
                if(p1->num==number)
                {
                        p2->next=p1->next;
                        break;
                }
                else
                {
                        p2=p1;
                        p1=p1->next;
                }
        }

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }
}

增加对第一个节点的删除情况
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header;
        int n=0;
        int number=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(p1->num!=0)
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        p2->next=NULL;

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

        printf("请输入需要删除的学号:");
        scanf("%d",&number);
        
        p1=header;
        p2=header;
        while(1)
        {
                if(p1->num==number)
                {
                        if(p1==header)
                        {
                                header=p1->next;
                                break;
                        }
                        else
                                p2->next=p1->next;
                        break;
                }
                else
                {
                        p2=p1;
                        p1=p1->next;
                }
        }

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }
}

考虑删除最后一个节点的情况(不用改)

考虑没有命中的情况
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header;
        int n=0;
        int number=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(p1->num!=0)
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        p2->next=NULL;

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

        printf("请输入需要删除的学号:");
        scanf("%d",&number);
        
        p1=header;
        p2=header;
        while(1)
        {
                if(p1->num==number)
                {
                        if(p1==header)
                        {
                                header=p1->next;
                                break;//去除
                        }
                        else
                                p2->next=p1->next;
                        break;
                }
                else
                {
                        p2=p1;
                        p1=p1->next;
                        if(p1==NULL)
                                break;
                }
        }

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }
}

再次整理:
1)去除标注处代码break
2)思考循环的功能,提炼条件
3)整理代码
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header;
        int n=0;
        int number=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(p1->num!=0)
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        p2->next=NULL;

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

        printf("请输入需要删除的学号:");
        scanf("%d",&number);
        
        p1=header;
        p2=header;
        while(p1->num!=number && p1->next!=NULL)
        {
                p2=p1;
                p1=p1->next;
        }

        if(p1->num==number)
                if(p1==header)
                        header=p1->next;
                else
                        p2->next=p1->next;
        
        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }
}

4 插入节点
首先考虑在中间插入的情况
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header,*p0;
        int n=0;
        int number=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(p1->num!=0)
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        p2->next=NULL;

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

        //需要链表元素的学号升序排列
        p0=(struct student *)malloc(sizeof(struct student));    
        printf("请输入要插入的学号:");
        scanf("%d",&p0->num);
        printf("请输入要插入的成绩:");
        scanf("%f",&p0->score);

        p1=header;
        p2=header;
        while(1)
        {
                if(p1->num<p0->num)
                {
                        p2=p1;
                        p1=p1->next;
                }
                else if(p1->num>p0->num)
                {
                        p2->next=p0;
                        p0->next=p1;
                        break;
                }
        }

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }
}

考虑在尾部增加的情况
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header,*p0;
        int n=0;
        int number=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(p1->num!=0)
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        p2->next=NULL;

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

        //需要链表元素的学号升序排列
        p0=(struct student *)malloc(sizeof(struct student));    
        printf("请输入要插入的学号:");
        scanf("%d",&p0->num);
        printf("请输入要插入的成绩:");
        scanf("%f",&p0->score);

        p1=header;
        p2=header;
        while(1)
        {
                if(p1->num<p0->num)
                {
                        p2=p1;
                        p1=p1->next;
                        if(p1==NULL)
                        {
                                p2->next=p0;
                                p0->next=NULL;
                                break;
                        }
                }
                else if(p1->num>p0->num)
                {
                        p2->next=p0;
                        p0->next=p1;
                        break;
                }
        }

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }
}

考虑在第一个节点前插入
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header,*p0;
        int n=0;
        int number=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(p1->num!=0)
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        p2->next=NULL;

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

        //需要链表元素的学号升序排列
        p0=(struct student *)malloc(sizeof(struct student));    
        printf("请输入要插入的学号:");
        scanf("%d",&p0->num);
        printf("请输入要插入的成绩:");
        scanf("%f",&p0->score);

        p1=header;
        p2=header;
        while(1)
        {
                if(p1->num<p0->num)
                {
                        p2=p1;
                        p1=p1->next;
                        if(p1==NULL)
                        {
                                p2->next=p0;
                                p0->next=NULL;
                                break;
                        }
                }
                else if(p1->num>p0->num)
                {
                        if(header==p1)
                        {
                                header=p0;
                                p0->next=p1;
                                break;
                        }
                        else
                        {
                                p2->next=p0;
                                p0->next=p1;
                                break;
                        }
                }
        }

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }
}

考虑等于的情况
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header,*p0;
        int n=0;
        int number=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(p1->num!=0)
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        p2->next=NULL;

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

        //需要链表元素的学号升序排列
        p0=(struct student *)malloc(sizeof(struct student));    
        printf("请输入要插入的学号:");
        scanf("%d",&p0->num);
        printf("请输入要插入的成绩:");
        scanf("%f",&p0->score);

        p1=header;
        p2=header;
        while(1)
        {
                if(p1->num<p0->num)
                {
                        p2=p1;
                        p1=p1->next;
                        if(p1==NULL)
                        {
                                p2->next=p0;
                                p0->next=NULL;
                                break;
                        }
                }
                else if(p1->num>p0->num)
                {
                        if(header==p1)
                        {
                                header=p0;
                                p0->next=p1;
                        }
                        else
                        {
                                p2->next=p0;
                                p0->next=p1;
                        }
                        break;
                }              
                else
                {
                        break;
                }
        }

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }
}

完善整理
# include <stdio.h>
# include <malloc.h>

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

void main()
{
        struct student *p1,*p2,*header,*p0;
        int n=0;
        int number=0;

        p1 =(struct student *)malloc(sizeof(struct student));

        printf("请输入学号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);

        while(p1->num!=0)
        {
                n++;
                if(n==1)
                        header=p1;
                else
                        p2->next=p1;
                p2=p1;
                p1 =(struct student *)malloc(sizeof(struct student));  
                printf("请输入学号:");
                scanf("%d",&p1->num);
                printf("请输入成绩:");
                scanf("%f",&p1->score);
        }

        p2->next=NULL;

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }

        //需要链表元素的学号升序排列
        p0=(struct student *)malloc(sizeof(struct student));    
        printf("请输入要插入的学号:");
        scanf("%d",&p0->num);
        printf("请输入要插入的成绩:");
        scanf("%f",&p0->score);

        p1=header;
        p2=header;
        while(p1->num<p0->num && p1->next!=NULL)
        {
                p2=p1;
                p1=p1->next;
        }
        
        if(p1->num>p0->num)
        {
                if(header==p1)
                        header=p0;
                else
                        p2->next=p0;
                p0->next=p1;
        }
        else if(p1->next==NULL)
        {
                p1->next=p0;
                p0->next=NULL;                          
        }

        p1=header;
        while(p1!=NULL)
        {
                printf("学号是%d,成绩是%f\n",p1->num,p1->score);
                p1=p1->next;
        }
}

[此贴子已经被作者于2010-12-13 20:07:38编辑过]

 回到顶部