鱼C论坛

 找回密码
 立即注册
查看: 1230|回复: 3

[已解决]关于修改链表里面某个元素的内容

[复制链接]
发表于 2019-3-21 23:55:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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){


}
 

录入和打印功能正常,就是修改功能出问题了,如图,程序直接报错了......
希望能人相助,帮助迷途的羊羔....
最佳答案
2019-3-22 02:44:15
本帖最后由 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           ;                                       ;
                }
        }
}
QQ图片20190321235441.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-22 00:09:45 From FishC Mobile | 显示全部楼层
因为刚刚学习,如果大家有什么C方面的建议可以告诉我,如格式是否规范,函数内容因该如何如何,指针使用是否正确等等,望大家不吝啬,尽情的吐槽,记得留下样板让我模仿....别吐槽就溜........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-22 00:10:17 From FishC Mobile | 显示全部楼层
我爱编程、爱fishc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-22 02:44:15 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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           ;                                       ;
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 12:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表