鱼C论坛

 找回密码
 立即注册
查看: 3678|回复: 8

链表嵌套问题

[复制链接]
发表于 2015-12-20 23:13:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
struct student
{
        int stu_number;
        char stu_name[10];
        int select_number;
        struct student *stu_next;
}stu;//学生信息录入
struct link
{
        int number;//课程编号
        char name[10];
        char nature[10];//课程性质
        int time;//总学时
        int time_class;//授课时间
        int score;
        int time_start;//开课时间
        struct student *pstu;
        struct link *next;//节点
};//课程录入

把学生信息录进去之后,大概这样录入
scanf("%d",&stu->stu_number);
scanf("%s",&stu->stu_name);
如何通过struct link 这个调用出学生信息,大概这样子
printf("%d   ",p->pstu->stu_number);
printf("%s   \n",p->pstu->stu_name);
录入没问题的,但是p->pstu->stu_name,语法不会报错,运行时会出错0xc0000005:Access Violation
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-21 07:35:32 | 显示全部楼层
你的头节点都没有指定。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-21 13:22:24 | 显示全部楼层
ravenhu13 发表于 2015-12-21 07:35
你的头节点都没有指定。

头结点没有指定??可以详细说一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-21 13:32:20 | 显示全部楼层
本帖最后由 DarkSE 于 2015-12-21 14:01 编辑
ravenhu13 发表于 2015-12-21 07:35
你的头节点都没有指定。


整个代码是这样的
243和244行的输出错误
#include <stdio.h>
#include <stdlib.h>
struct link *course_enroll();//课程录入//完成
struct link *student_enroll();//学生录入//未完成
void course_skim();//课程信息浏览//完成
int check();//学分查询
void event();//课程选修情况//完成
void check_number();//学号查询
void deletememory();
struct student
{
        int stu_number;
        char stu_name[10];
        int select_number;
        struct student *stu_next;
}stu;
struct link
{
        int number;//课程编号
        char name[10];
        char nature[10];//课程性质
        int time;//总学时
        int time_class;//授课时间
        int score;
        int time_start;//开课时间
        struct student *stu;
        struct link *next;//节点
};

main()
{
        int n,i,a=0;
        struct link *head=NULL;
        struct student *stu_head=NULL;
        do
        {
                system("cls");
                printf("请选择一下功能:\n");
                printf("0->课程信息录入系统\n1->学生选课信息录入系统\n");
                printf("2->课程信息浏览\n3->学分查询\n");
                printf("4->课程选修情况\n5->学号查询功能\n");
                do
                {
                        scanf("%d",&n);
                        if(n<0 || n>6)
                        {
                                printf("输入错误,请重新输入:");
                        }
                }while(n<0 || n>6);
                switch(n)
                {
                        case 0:
                        {
                                printf("欢迎进入课程信息录入系统:\n");
                                printf("请输入录入的课程的门数:\n");
                                scanf("%d",&i);
                                head=(course_enroll(head,i));
                                break;
                        }
                        case 1:
                        {
                                printf("欢迎进入学生选课信息录入功能:\n");
                                stu_head=student_enroll(head,stu_head);
                                break;
                        }
                        case 2:
                        {
                                printf("课程信息浏览:\n");
                                course_skim(head);
                                break;
                        }
                        case 3:
                        {
                                printf("学分查询功能:\n");
                                check();
                                break;
                        }
                        case 4:
                        {
                                printf("课程选修情况:\n");
                                event(head,stu_head);
                                break;
                        }
                        case 5:
                        {
                                printf("学号查询功能:\n");
                                check_number(head,stu_head);
                                break;
                        }
                }
                printf("是否退出选课系统?是输入1,否输入0\n");
                scanf("%d",&a);
                if(1==a)
                {
                        deletememory(head,stu_head);
                        exit(0);
                }
        }while(0==a);
}
struct link *course_enroll(struct link *head,int i)//课程录入
{
        int j=1;
        struct link *p=NULL;
        struct link *pr=head;//指针指向head
        system("cls");//清屏
        printf("请按照以下格式输入课程信息:\n");
        printf("----编号---名称---性质---学时---授课时间---学分---开课学期----\n");
        for(j;j<=i;j++)//输入的课程的数目
        {
                p=(struct link *)malloc(sizeof(struct link));//为struct link申请内存
                if(p==NULL)//检查申请内存是否为空
                {
                        printf("系统错误!!");
                        exit(0);
                }
                if(head==NULL)//检查head是否为空
                {
                        head=p;//head为空,把第一个当做第一个链表
                }
                else//head 不为空
                {
                        while (pr->next != NULL)//指向下一个,直到链尾为止
                        {
                                pr=pr->next;
                        }
                        pr->next=p;//把申请的内存接在链尾后面
                }
                pr=p;//把空链表指向head
                scanf("%d",&pr->number);
                scanf("%s",&pr->name);
                scanf("%s",&pr->nature);
                scanf("%d",&pr->time);
                scanf("%d",&pr->time_class);
                scanf("%d",&pr->score);
                scanf("%d",&pr->time_start);
                pr->next=NULL;//最后一个的指针域定义为NULL
        }
        return head;
}
struct link *student_enroll(struct link *head,struct student *stu_head)//学生录入//学生选择课程的编号进而录入
{
        int number;
        struct student *pstu=NULL;
        struct student *pstur=stu_head;
        struct link *p=head;
        if(p==NULL)//head是否为空
        {
                printf("NO ANY DATA !!\n");//没有数据可供选课
        }
        else
        {
                printf("请输入选择的课程编号:");
                scanf("%d",&number);
                while(p!=NULL)//
                {
                        if( number == p->number )//寻找存在的课程编号
                        {
                                printf("请输入学生学号及姓名:");
                                 pstu=(struct student *)malloc(sizeof(struct student));
                                if(pstu==NULL)//申请内存为空
                                {
                                        printf("系统错误!!");
                                        exit(0);
                                }
                                if(stu_head==NULL)//stu_head为空
                                {
                                        stu_head=pstu;
                                }
                                else
                                {
                                        while(pstur->stu_next != NULL)//stu_head不为空,寻找到链尾为止
                                        {
                                                pstur=pstur->stu_next ;
                                        }
                                        pstur->stu_next =pstu;//申请的内存加入链尾
                                }
                                pstur=pstu;
                                scanf("%d",&pstu->stu_number);
                                scanf("%s",&pstu->stu_name);
                                pstu->stu_next=NULL;//新节点指针域定义为NULL
                                break;
                        }
                        p=p->next ;//当寻找不到符合的课程编号,则指向下一个继续寻找,直到链尾
                }
        }
        return stu_head;
}
void course_skim(struct link *head)//课程信息浏览
{
        struct link *p=head;
        system("cls");
        if(p==NULL)
        {
                printf("NO ANY DATA !!\n");
        }
        else
        {
        printf("----编号---名称---性质---学时---授课时间---学分---开课学期----\n");
        while(p != NULL)
        {
                printf("%d   ",p->number);
                printf("%s   ",p->name);
                printf("%s   ",p->nature);
                printf("%d   ",p->time);
                printf("%d   ",p->time_class);
                printf("%d   ",p->score);
                printf("%d   \n",p->time_start);
                p = p->next;
        }
        }
}
int check()//学分查询
{
        printf("stupid  3\n");
}
void event(struct link *head,struct student *stu_head)//课程选修情况
{
        struct link *p=head;
        struct student *pr=stu_head;
        system("cls");
        if(p==NULL)
        {
                printf("NO ANY DATA !!\n");
        }
        else if(pr == NULL)
        {
                printf("学生未进行选课\n");
        }
        else
        {
                //输出课程信息
                printf("----编号---名称---性质---学时---授课时间---学分---开课学期---学生学号---学生姓名----\n");
                while(p != NULL )
                {
                        printf("%d   ",p->number);
                        printf("%s   ",p->name);
                        printf("%s   ",p->nature);
                        printf("%d   ",p->time);
                        printf("%d   ",p->time_class);
                        printf("%d   ",p->score);
                        printf("%d   ",p->time_start);
                        //输出课程里面的学生信息
                        printf("%d   ",p->stu->stu_number);//通过head来输出学生信息
                        printf("%s   \n",p->stu->stu_name);
                        p = p->next;
                }
        }
}
void check_number(struct link *head,struct student *stu_head)//5
{
        int number;
        struct link *p=head;
        struct student *pr=stu_head;
        system("cls");
        if(p==NULL)
        {
                printf("NO ANY DATA !!\n");
        }
        else if(pr->stu_number == NULL)
        {
                printf("未有选课记录!!\n");
        }
        else
        {
                printf("请输入查询的学生学号:");
                scanf("%d",&number);
                do
                {
                        if(number == (pr->stu_number))
                        {
                                printf("%d   ",p->number);
                                printf("%s   \n",p->name);
                        }
                        pr=pr->stu_next ;
                }while( pr->stu_next != NULL);
        }
//        printf("foolish  5\n");
}
//清除分配的内存
void deletememory(struct link *head,struct student *stu_head)
{
        struct link *p=head;
        struct student *pstu=stu_head;
        struct link *pr=NULL;
        while(p != NULL)
        {
                pr=p;
                p=p->next ;
                free(pr);
        }
        while(pstu!=NULL)
        {
                pr=pstu;
                pstu=pstu->stu_next ;
                free(pr);
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-21 14:41:23 | 显示全部楼层
明显是非法访问 你把测试案例 发给我 我帮你看看就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-21 14:57:17 | 显示全部楼层
已经知道了
struct link
{
        int number;//课程编号
        char name[10];
        char nature[10];//课程性质
        int time;//总学时
        int time_class;//授课时间
        int score;
        int time_start;//开课时间
        struct student *stu;                          //问题在这里  
        struct link *next;//节点
};

这里只是一个指针  他并没有内存空间  而你 从头到尾也没有把学生信息的内存块 挂载到上面  这里是一个存放着未知的内存地址而且是不可访问的  导致你一运行到这里  就被win强制关闭了  解决办法是  把学生内存块挂载上  就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-12-21 18:35:22 | 显示全部楼层
我刚学动态链表。。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-21 18:59:07 | 显示全部楼层
好多好多鱼 发表于 2015-12-21 14:57
已经知道了   

这里只是一个指针  他并没有内存空间  而你 从头到尾也没有把学生信息的内存块 挂载到上 ...

谢谢~~,解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-21 18:59:50 | 显示全部楼层
tzzyw 发表于 2015-12-21 18:35
我刚学动态链表。。。。。。。。。。

我也是刚学,老师比较坑而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 16:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表