2 djylsy DJYLSY 于 2016.03.30 21:55 提问

像这样没有错误却莫名的死程序该咋办啊?求教大神们

#include
#include
#define N 4
struct binode{
char num;
char name;
int score;
struct binode llink,*rlink;
};
struct binode binode;
struct binode *list=0;
struct binode *p=0;
struct binode *r=0;
struct binode *q=0;
struct binode *u=0;
void build()
{
int i;
for(i=0;i<N;i++)
{
p=(struct binode
)malloc(sizeof(struct binode));
printf("input the information of %d",i+1);
printf("\n");
printf("请输入学生学号:");
scanf("%s",p->num);
printf("请输入学生姓名:");
scanf("%s",p->name);
printf("请输入学生计算机成绩:");
scanf("%d",&p->score);
if(list==NULL)
{
p=list->rlink;
list=p->llink;
}
else
{
p->llink=r;
r->rlink=p;

        }
        r=p;
        }

}
int delete()
{
int ch;
printf("请输入所删除学生的学号:");
q=list;
scanf("%s",ch);
while(strcmp(ch,q->num)!=0)
{
if(q->rlink==NULL)
{
printf("cannot find the node");
return -1;
}
q=q->rlink;
}
(q->rlink)->llink=q->llink;
(q->llink)->rlink=q->rlink;
free(q);
return 1;
}
void grade()
{
int excellent=0;
int good=0;
int ordinary=0;
int pass=0;
int fail=0;
int ah;
int i;
u=list->rlink;
ah=u->score/10;
while(u->rlink!=NULL)
{
switch(ah)
{
case 10:
case 9:excellent++;break;
case 8:good++;break;
case 7:ordinary++;break;
case 6:pass++;break;
default:fail++;break;
}

q=list->llink;
i=1;
while(q->rlink!=NULL)
{
printf("the score of %d",i);
printf("%d",q->score);
}
printf("计算机基础成绩分数段统计");
printf("优秀(>90):%d\n良好(80-90):%d\n一般(70-80):%d\n及格(60-70):%d\n不及格(<60):%d\n",excellent,good,ordinary,pass,fail);
}
}
int main()
{
void build();
int delete();
void grade();
int l;
while(1)
{
printf("************************欢迎光临!");
printf("\n");
printf("1.输入数据\n2.删除数据\n3.分数段统计\n");
printf("请选择:");
scanf("%d",&l);
switch(l)
{
case 1:build();break;
case 2:delete();break;
case 3:grade();break;
default:printf("wrong!");
}

}
}

4个回答

YXTS122
YXTS122   2016.03.30 22:16

把char num; char name;改为char num[3]; char name[10];

DJYLSY
DJYLSY 改过了,对的却是这样,但是后面也运行不了
2 年多之前 回复
DJYLSY
DJYLSY 改过了,对的却是这样,但是后面也运行不了
2 年多之前 回复
YXTS122
YXTS122   2016.03.30 22:21

main()里也要改一下,build(); delete();grade();要这样写

YXTS122
YXTS122 搞错了,我是说void build(); int delete(); void grade();这个可以省略不写
2 年多之前 回复
bealing
bealing   Rxr 2016.03.30 21:59

解决运行时错误,最好的办法就是debug!

DJYLSY
DJYLSY 大哥,DEV-C一调试 就程序错误怎么办
2 年多之前 回复
qq423399099
qq423399099   Ds   Rxr 2016.03.31 09:19

楼主各种问题啊。。。我已经是尽力小改动了。。。
这里我默认的是双向链表(非循环链表,如果要改成循环的楼主自己将最后一个结点的rlink指向头结点,头结点的link指向尾)

using namespace std;
#define N 4
void print();
struct binode{
    char num[16];
    char name[16];
    int score;
    struct binode *llink,*rlink;//这里的link少了*
};
struct binode binode;
struct binode *list=NULL;
struct binode *p=0;
struct binode *r=0;
struct binode *q=0;
struct binode *u=0;
void build()
{
    int i;
    for(i=0;i<N;i++)
    {
        p=(struct binode *)malloc(sizeof(struct binode));//这里也少了*
        printf("input the information of %d",i+1);
        printf("\n");
        printf("请输入学生学号:");
        scanf("%s",p->num);
        printf("请输入学生姓名:");
        scanf("%s",p->name);
        printf("请输入学生计算机成绩:");
        scanf("%d",&p->score);
        if(list==NULL)
        {
            list=(struct binode *)malloc(sizeof(struct binode));//这里要为list开辟一个空间
            list->llink=NULL;//左指针置NULL
            list->rlink=p;//楼主这里的左值和右值也反了
            p->llink=list;

        }
        else
        {
            p->llink=r;
            r->rlink=p;
        }
        r=p;
    }
    r->rlink=NULL;//将最后一个结点的rlink置NULL
}
int my_delete()
{
    char ch[16] = {0};
    printf("请输入所删除学生的学号:");
    q=list->rlink;
    scanf("%s",ch);
    while(strcmp(ch,q->num)!=0)
    {
        if(q->rlink==NULL)
        {
            printf("cannot find the node");
            return -1;
        }
        q=q->rlink;
    }
    if(q->rlink != NULL)//需要判断找到的要删除的结点是不是最后一个结点
    {
        (q->rlink)->llink=q->llink;//不是最后一个结点才能用  (q->rlink)->llink,不然q->rlink是NULL,你对NULL操作会报异常
        (q->llink)->rlink=q->rlink;
    }
    else
        (q->llink)->rlink=NULL;

    free(q);
    return 1;
}

//帮楼主加了一个打印的函数
void print()
{
    q=list->rlink;
    while(q!=NULL)
    {
        printf("学号:%s,姓名:%s,成绩:%d\n", q->num, q->name, q->score);
        q=q->rlink;
    }
}

void grade()
{
    int excellent=0;
    int good=0;
    int ordinary=0;
    int pass=0;
    int fail=0;
    int ah;
    int i;
    u=list->rlink;

    while(u!=NULL)//这里判断u就行了
    {
        ah=u->score/10;//这个要放在循环里
        switch(ah)
        {
        case 10:
        case 9:excellent++;break;
        case 8:good++;break;
        case 7:ordinary++;break;
        case 6:pass++;break;
        default:fail++;break;
        }
        /*
        q=list->llink;
        i=1;
        while(q->rlink!=NULL)
        {
            printf("the score of %d",i);
            printf("%d",q->score);
        }*/
        u=u->rlink;//指向下一个结点
    }
    printf("计算机基础成绩分数段统计");
    printf("优秀(>90):%d\n良好(80-90):%d\n一般(70-80):%d\n及格(60-70):%d\n不及格(<60):%d\n",excellent,good,ordinary,pass,fail);
}
int main()
{
    void build();
    int my_delete();
    void grade();

    int l;
    while(1) 
    {
        printf("************************欢迎光临!"); 
        printf("\n");
        printf("1.输入数据\n2.删除数据\n3.分数段统计\n4.打印数据\n");
        printf("请选择:");
        scanf("%d",&l);
        switch(l)
        {
        case 1:build();break;
        case 2:my_delete();break;
        case 3:grade();break;
        case 4:print();break;
        default:printf("wrong!");
        }
    }
}

图片说明
图片说明

DJYLSY
DJYLSY 感谢大神。。。谢谢太谢谢你了
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
博客园里的大神们
做IT码农的这段时间里,我就像一个拾荒者,在网络上寻找着各种技术的踪迹。发现它们,揣测它们,理解它们,最终驾驭它们。在这期间,总会碰见这样几个人,你总能在各个地方看到他们的文章,他们的影子。 他们被菜鸟称之为大神,其实单论技术,他们或许并不是最强的,但是他们已经能够把技术描述的非常通俗易懂。像我之前做eclipse插件开发的时候,菜鸟期基本上是看着八进制的博客度过的,直到自己开始看eclipse
苹果手机为什么Apple ID会被停用
原因如下:1、你的Apple ID号在不同的设备上登录次数过多,登录苹果官网,进入管理Apple ID,删除一些设备可能是因为你把自己的帐户告诉过其他朋友,或者是分享了自己的Apple ID给别人以及各大论坛上。密码多次输入错误。如果你的Apple ID被停用或者是禁用的时候,当在itunes登录帐号时,它会提示你的账户已禁用,然后点击重设,选择验证方式(回答密保问题或者是邮箱验证),验证完点输入...
假币问题 oj41
假币问题 发布时间: 2017年5月25日 19:57   最后更新: 2017年5月26日 00:14   时间限制: 1000ms   内存限制: 128M 描述 居然有假币!!!  事情是这样的,现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊。老王这就去买猪肉,结果找来的零钱中有假币!!!可惜老王一不小心把它混进了一堆真币里面去了。现在知道假币的重量比真币的
yii2初探-程序启动流程
1.入口脚本 web/index.php2.index.php文件分析&amp;lt;?php //定义是否开启debug模式 展示调试信息 defined('YII_DEBUG') or define('YII_DEBUG', true); //定义开发模式 prod | dev | test defined('YII_ENV') or define('YII_ENV', 'dev'); //导入co...
第六章答案 c primer plus
 6.1 编写一个程序,创建一个具有26个元素的数组,并在其中存储26个小写字母,并让该程序显示该数组的内容.#include int main(void){ char a[26] = {a, b, c, d, e, f,      g, h, i, j, k, l,      m, n, o, p, q, r,   
大神们 求解啊
银号卡以前绑定的那个手机号丢了     然后现在人在外地   不知道
如何在大学里成为IT技术大神
总是有同学问我怎么学很多技术,好奇如何成为所谓的大神。 事实上,这篇文章是结合我的一些经历,讲述应该怎么学习技术,并不是要讲怎么成为大神。没有所谓的成功学,只有充满智慧的思考,脚踏实地的实干,和越来越近的理想,还有机遇和运气。之所以用这个标题,无非是吸引更多人、尤其是很多对成为大神抱有不切实际的幻想的人来看。希望读者能从中得到一些东西,没有浪费看这篇文的时间。这篇文章也只是我的看法,并不是什
pywin32-218.win32-py2.7
python的pywin32-218.win32-py2.7.exe程序,因为这个出现了莫名的错误
为什么中国不能出现像TI这样的公司
SHENZHEN, China – Will China ever create an enterprise comparable in size, creativity and impact to Texas Instruments? So far, it hasn't come close. For now, there’s not much chance it will. Wit
Java程序突然退出,没有任何提示!
经过了很长时间的分析,发现是因为Java程序中使用了System.exit(1); 强制退出! 故而一般写程序的时候,建议在system.exit(1)等命令前加入适当的信息提示,如:system.out.println, logger,JOptionPane.showMessageDialog()等方法! PS:system.exit() 来自:http://www.cnblogs