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 改过了,对的却是这样,但是后面也运行不了
一年多之前 回复
DJYLSY
DJYLSY 改过了,对的却是这样,但是后面也运行不了
一年多之前 回复
YXTS122
YXTS122   2016.03.30 22:21

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

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

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

DJYLSY
DJYLSY 大哥,DEV-C一调试 就程序错误怎么办
一年多之前 回复
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 感谢大神。。。谢谢太谢谢你了
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片