|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 体弱多病程序权 于 2019-3-22 00:06 编辑 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student *head = NULL;
int count = 1;
struct Student
{
int number;
char *name[4];
float score;
struct Student *next;
};
void create(struct Student **head);
void print(struct Student *head);
void change(struct Student *head);
void releaseStorager(struct Student **head);
int main(void){
char menu[][40] =
{
"\t****************************\n",
"\t\t学生成绩管理系\n",
"\t\t1.录入学生成绩\n",
"\t\t2.打印学生成绩\n",
"\t\t3.修改学生成绩\n",
"\t****************************\n",
};
while(1)
{
system("cls");
for(int i = 0;i<sizeof(menu)/sizeof(menu[0]);i++)
{
printf("%s",menu[i]);
}
char input;
fflush(stdin);
input = getchar();
switch(input)
{
case '1':create(&head);break;
case '2':print(head);break;
case '3':change(head);break;
case '4':exit(1);
}
}
}
void create(struct Student **head){
system("cls");
struct Student *p1,*p2;
p1 = p2 = (struct Student *)malloc(sizeof(struct Student));
if(p1 == NULL)
{
printf("分配内存失败了.....\n");
exit(1);
}
do{
printf("第%d个学生\n",count);
printf("请输入学生的学号:");
scanf("%d",&p1->number);
printf("请输入学生的姓名:");
scanf("%s",&p1->name);
printf("请输入学生的成绩:");
scanf("%f",&p1->score);
system("cls");
if(*head != NULL)
{
p2->next = p1;
p1->next = NULL;
}
else
{
*head = p1;
p1->next = NULL;
}
count++;
p2 = p1;
p1 = (struct Student *)malloc(sizeof(struct Student));
}while(count != 3);
p2->next = NULL;
}
void print(struct Student *head)
{
system("cls");
printf("学生成绩如下:\n");
while(head != NULL)
{
printf("%d %s %f\n",head->number,head->name,head->score);
head = head->next;
}
system("pause");
}
void change(struct Student *head){
system("cls");
int temp = 0;
printf("请输入要修改的学生学号:");
scanf("%d",&temp);
struct Student *p1,*p2;
p1 = p2 = (struct Student *)malloc(sizeof(struct Student));
p1 = head;
while(1){
if( p1 == NULL )
{
printf("This list is null!\n");
system("pause");
break;
}
else if(p1->number == temp )
{
printf("查询该学生信息如下:\n");
printf("%d %s %f",p1->number,p1->name,p1->score);
printf("\n请重新输入该学生的信息:");
scanf("%d %s %f",&p2->number,&p2->name,&p2->score);
p1 = p2;
printf("Change ID:%d succeed!",temp);
system("pause");
break;
}
else if(p1->number != temp && p1->next == NULL)
{
printf("\n您输入的学号有误,请核对后重新输入.");
system("pause");
break;
}
p1 = p1->next;
}
printf("修改后的成绩如下:\n");
print(head);
}
void releaseStorager(struct Student **head){
}
录入和打印功能正常,就是修改功能出问题了,如图,程序直接报错了......
希望能人相助,帮助迷途的羊羔....
本帖最后由 jackz007 于 2019-3-22 09:58 编辑
楼主的代码逻辑太混乱了,实在看不下去,帮你重写了代码,但基本维持原来的框架: #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Student {
int number ;
char name[20] ;
float score ;
struct Student * next ;
} node ;
node * head = NULL ;
int count = 0 ;
bool find(node ** px , node * head , const int number) // 寻找学号为 number 节点的前一个节点
{
node * p1 , * p2 ;
bool ret ;
ret = false ;
if(count > 0) {
p1 = p2 = head ;
while(p2 != NULL) {
if (p2 -> number == number) {
* px = p1 ; // 返回指向目标节点前一个节点的指针
ret = true ;
break ;
} else {
p1 = p2 ;
p2 = p1 -> next ;
}
}
}
return ret ; // 返回布尔变量指示是否找到目标节点
}
void print(node * head)
{
node * p ;
system("cls") ;
if(count > 0) {
printf("学生成绩如下:\n") ;
p = head ;
while(p != NULL) {
printf("%d %s %f\n", p -> number , p -> name , p -> score) ;
p = p -> next ;
}
} else {
printf("链表为空!\n") ;
}
system("pause") ;
}
node * create(node * hd)
{
node * p1 , * p2 , * px , * head ;
int number ;
float score ;
char name[20] ;
system("cls") ;
p1 = head = hd ;
if(p1 != NULL) {
while(p1 -> next != NULL) p1 = p1 -> next ; // p1 指向当前链表的最后一个节点
} else {
p1 = p2 = head = NULL ;
}
for(;;) {
printf("第 %d 个学生\n" , count + 1) ;
printf("请输入学生的学号:") ;
scanf("%d" , & number) ;
if (! number) break ;
if (! find(& px , head , number)) {
printf("请输入学生的姓名:") ;
scanf("%s" , name) ;
printf("请输入学生的成绩:") ;
scanf("%f" , & score) ;
system("cls") ;
if ((p2 = (node *)malloc(sizeof(node))) != NULL) {
p2 -> number = number ;
strcpy(p2 -> name , name) ;
p2 -> score = score ;
p2 -> next = NULL ;
if(! count) head = p2 ;
else p1 -> next = p2 ;
p1 = p2 ;
count ++ ;
} else {
fprintf(stderr , "malloc() 分配内存失败") ;
break ;
}
} else {
printf("抱歉,学号为 %d 的学生已经存在!\n" , number) ;
}
}
return head ;
}
void change(node * head)
{
node * p1 , * p2 , * px ;
int temp ;
system("cls") ;
if(count > 0) {
printf("请输入要修改的学生学号 : ") ;
scanf("%d", & temp) ;
if (find(& p1 , head , temp)) {
if(p1 != head) p2 = p1 -> next ; // 如果找到的节点不是首节点 head
else p2 = p1 ; // 否则,p1、p2 都指向 head
printf("查询该学生信息如下:\n") ;
printf("%d %s %f" , p2 -> number , p2 -> name , p2 -> score) ;
printf("\n请重新输入该学生的信息:") ; // 学号就不可以修改了吧。
scanf("%s %f", p2 -> name , & p2 -> score) ;
printf("Change ID:%d succeed!" , temp) ;
system("pause") ;
} else {
printf("抱歉:没有查询到学号为 %d 的学生\n" , temp) ;
}
printf("修改后的成绩如下:\n") ;
print(head) ;
} else {
printf("链表为空!\n") ;
}
}
int main(void)
{
char menu[][40] = {
"\t****************************\n",
"\t\t学生成绩管理系\n",
"\t\t1.录入学生成绩\n",
"\t\t2.打印学生成绩\n",
"\t\t3.修改学生成绩\n",
"\t****************************\n",
} ;
node * head ;
char input ;
int i ;
bool f ;
f = true ;
count = 0 ;
head = NULL ;
while(f) {
system("cls") ;
for(i = 0 ; i < sizeof(menu) / sizeof(menu[0]) ; i ++) printf("%s" , menu[i]) ;
fflush(stdin) ;
input = getchar() ;
switch(input) {
case '1': head = create(head) ; break ;
case '2': print(head) ; break ;
case '3': change(head) ; break ;
case '4': f = false ; ;
}
}
}
|
-
|