#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!");
}
}
}
解决运行时错误,最好的办法就是debug!
把char num; char name;改为char num[3]; char name[10];
main()里也要改一下,build(); delete();grade();要这样写
楼主各种问题啊。。。我已经是尽力小改动了。。。
这里我默认的是双向链表(非循环链表,如果要改成循环的楼主自己将最后一个结点的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!");
}
}
}