#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("如果");
}
}
}
}
修改完善如下,供参考:
#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;
}
你为啥老是struct Student连用呢,struct定义一个结构体,后面直接用结构体名就行了。
能先说说问题解决的话的“有奖”的具体内容么?别光口花花