#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct Student{
char name[10];
float grade;
struct Student *next;
} ;
struct Student *create()
{
struct Student *head, *current, *next;
char str[10];
float a;
char flag;
printf("请输入学生姓名:\n");
scanf("%s", str);
getchar();
printf("请输入学生成绩:\n");
scanf("%f", &a);
getchar();
head = (struct Student *)malloc( sizeof(struct Student) );
strcpy( head->name, str );
head->grade=a;
current = head;
printf("是否继续输入:(y/n)");
scanf("%c", &flag);
while( flag != 'n' )
{
printf("请输入学生姓名\n");
scanf("%s", str);
getchar();
printf("请输入学生成绩:\n");
scanf("%f",&a);
getchar();
next = (struct Student *)malloc( sizeof(struct Student) );
strcpy( next->name, str );
next->grade=a;
current->next = next;
current = next;
printf("是否继续输入:(y/n)");
scanf("%c", &flag);
}
current->next = NULL;
return head;
}
void list(struct Student *p)
{ printf("姓名 成绩\n");
while(1)
{
printf("%s %d \n", p->name,p->grade);
if( p->next != NULL )
{
p = p->next;
}else
{
break;
}
}
}
void insert(struct Student *p)
{
struct Student *insert, *current;
char str[10];
float a;
int position;
current = p;
printf("\n请输入要补充的学生姓名\n");
scanf("%s", str);
getchar();
printf("\n请输入要补充的学生成绩\n");
scanf("%f", &a);
insert = (struct Student *)malloc( sizeof(struct Student) );
strcpy( insert->name, str );
insert->grade=a;
printf("需要插入的位置为:\n");
scanf("%d", &position);
if( position > 0 )
{
while(position > 1)
{
current = current->next;
position--;
}
insert->next = current->next;
current->next = insert;
}else if ( position == 0 )
{
p = insert;
insert->next = current;
}
printf("插入元素后最新的成员列表为:\n");
list(p);
}
void cancel(struct Student *p)
{
printf("请输入你要删除的学生姓名和成绩的位置:");
}
void main()
{ printf(" 欢迎来到学生成绩管理系统!\n");
printf("首先你需要依次录入学生姓名和成绩\n");
struct Student *p;
p = create();
printf("\n你输入的学生姓名和成绩表格如下为:\n");
list(p);
printf("你是否需要补充或删除学生姓名和成绩?\n");
int n;
while (1)
{ Xunhuan:
printf("1.如果你需要补充学生姓名成绩的话请按1\n");
printf("2.如果你需要删除学生姓名成绩的话请按2\n");
printf("3.如果你不需要进行任何操作请按3\n");
scanf("%d", &n);
switch (n)
{
case 1:insert(p); break;
case 2:cancel(p); break;
case 3:break ;
default:printf("您输入错误,请按格式重新输入!");
goto Xunhuan;
break;
}
printf("\n");
char m;
while(1)
{
printf("请你确认是否有误(正确请按y进行其他操作,错误请按n返回修改)\n");
scanf("%c", &m);
if(m==n)
{goto Xunhuan;
}
else { printf("如果");
}
}
}
}
C语言:谁能告诉我为什么输出成绩为零(是struct Student *create()里的问题),部分代码未编写完(后续操作和删除一个学生成绩代码没有编写)顺便带我把删除一个学生成绩的代码编了有奖
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- qzjhjxj 2021-10-07 14:18关注
修改完善如下,供参考:
#include<stdio.h> #include<string.h> #include<malloc.h> struct Student{ char name[10]; float grade; struct Student *next; } ; struct Student *create() { struct Student *head, *current, *next; char str[10]; float a; char flag; printf("请输入学生姓名:\n"); scanf("%s", str); getchar(); printf("请输入学生成绩:\n"); scanf("%f", &a); getchar(); head = (struct Student *)malloc( sizeof(struct Student) ); strcpy( head->name, str ); head->grade=a; current = head; printf("是否继续输入:(y/n)"); scanf("%c", &flag); while( flag != 'n' ) { printf("请输入学生姓名\n"); scanf("%s", str); getchar(); printf("请输入学生成绩:\n"); scanf("%f",&a); getchar(); next = (struct Student *)malloc( sizeof(struct Student) ); strcpy( next->name, str ); next->grade=a; current->next = next; current = next; printf("是否继续输入:(y/n)"); scanf("%c", &flag); } current->next = NULL; return head; } void list(struct Student *p) { if(p == NULL) return; printf("姓名 成绩\n"); while(1) { printf("%s %f \n", p->name,p->grade);//printf("%s %d \n", p->name,p->grade); if( p->next != NULL ) //修改 { p = p->next; }else { break; } } } struct Student * insert(struct Student *p) { struct Student *insert, *current,*pre=NULL; char str[10]; float a; int position,i=0; if(p == NULL) { printf("表为空,无法插入!\n"); return NULL; } printf("需要插入的位置为:\n"); scanf("%d", &position); if(position < 1 ) { printf("插入位置非法!\n"); return p; } current = p; while(current && i < position-1) { pre = current; current = current->next; i++; } if (!current) { printf("插入位置非法!\n"); return p; } insert = (struct Student *)malloc( sizeof(struct Student)); printf("\n请输入要补充的学生姓名\n"); scanf("%s",insert->name); getchar(); printf("\n请输入要补充的学生成绩\n"); scanf("%f", &insert->grade); if(current ==p) { p = insert; insert->next = current; } else{ insert->next = pre->next; pre->next = insert; } return p; } struct Student * cancel(struct Student *L) { char str[10]; struct Student *s=NULL,*q=NULL,*p=L; if(L == NULL) { printf("表为空,无记录!\n"); return NULL; } printf("请输入你要删除的学生姓名:"); scanf("%s",str); while(p!=NULL) { if(strcmp(p->name,str)==0) { q=p;//q即为被删除的节点; if(p == L){ if(L->next != NULL){ L = L->next; p = L; } else{ L = NULL; p = NULL; free(q); return L; } } else{ s->next = p->next; p = s; } free(q);//释放被删除节点的空间; } s = p; p=p->next; } if(p == NULL) printf("未找到要删除的学生记录!\n"); return L; } int main() { printf(" 欢迎来到学生成绩管理系统!\n"); printf("首先你需要依次录入学生姓名和成绩\n"); struct Student *p; p = create(); printf("\n你输入的学生姓名和成绩表格如下为:\n"); list(p); printf("\n你是否需要补充或删除学生姓名和成绩?\n"); int n; while (1) { printf("1.如果你需要补充学生姓名成绩的话请按1\n"); printf("2.如果你需要删除学生姓名成绩的话请按2\n"); printf("3.如果你不需要进行任何操作请按3\n"); scanf("%d", &n); switch (n) { case 1:p=insert(p);list(p);break; case 2:p=cancel(p);list(p);break; case 3:break ; default:printf("您输入错误,请按格式重新输入!"); break; } printf("\n"); char m; printf("请你确认是否还需其他操作('是 '请按y进行其他操作,'否'请按n退出系统)\n"); getchar(); scanf("%c", &m); if(m == 'n') break; } return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 outlook无法配置成功
- ¥15 Pwm双极模式H桥驱动控制电机
- ¥30 这是哪个作者做的宝宝起名网站
- ¥60 版本过低apk如何修改可以兼容新的安卓系统
- ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
- ¥50 有数据,怎么建立模型求影响全要素生产率的因素
- ¥50 有数据,怎么用matlab求全要素生产率
- ¥15 TI的insta-spin例程
- ¥15 完成下列问题完成下列问题
- ¥15 C#算法问题, 不知道怎么处理这个数据的转换