学生信息管理系统用链表存储

想把学生信息存储到链表里,再把链表里的信息再存放到文件里
想问一下这么写函数有什么问题嘛?

void add_lessonmessage()
{
    FILE *fp;
    fp=fopen("file4.txt","r");
    if(fp==NULL)
    {
        printf("打开文件失败");
        exit(1);
    }
    int n=0;
    LES *p,*q;
    LES *head=NULL;
    head=malloc(sizeof(LES));
    head->next=NULL;
    q=head;
    int i;
    for(i=0;i<100;i++)
    {
        p=malloc(sizeof(LES));
        p->next=NULL;
        q->next=p;
        q=p;
    }
    LES *p1;
    int num=0;
    p1=head->next;
    fread(p1,sizeof(LES),1,fp);
    num++;
    while(!feof(fp))
    {
        num++;
        p1=p1->next;
        fread(p1,sizeof(CHO),1,fp);
    }
    fclose(fp);
    p1=p1->next;
    printf("请输入录入课程信息数量\n");
    scanf("%d",&n);
    for(i=num;i<num+n;i++)
    {
        printf("请输入课程号\n");
        scanf("%d",&p1->number);
        printf("请输入课程名\n");
        scanf("%s",p1->name);
        printf("请输入课程学分\n");
        scanf("%d",&p1->score);
        printf("请输入课程学时\n");
        scanf("%d",&p1->time);
        p1=p1->next;
    }
    fp=fopen("file4.txt","r+");
    p1=head->next;
    for(i=0;i<num+n;i++)
    {
        fwrite(p1,sizeof(LES),1,fp);
        p1=p1->next;
    }
    fclose(fp);

写入文件的数据类型未来有变化嘛?链表也有问题,末尾没有指向

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

这段代码中有几个问题:

1.在创建链表时,你创建了 100 个节点,这样浪费了空间。链表应该是动态增长的,只创建需要的节点即可。

2.在读取文件时,你使用了 fread 函数,但是该函数只能读取二进制文件,而不能读取文本文件。如果你的文件是文本文件,应该使用 fgets 等函数进行读取。

3.在读取文件时,你只读取了第一个节点的信息,而没有读取后面的节点信息。正确的做法是使用循环读取每个节点的信息。

4.在写入文件时,你使用了 fopen("file4.txt", "r+"),这样会打开文件并将文件指针指向文件开头,但是这样会将文件中原有的内容覆盖掉。如果你想在文件末尾添加内容,应该使用 fopen("file4.txt", "a")

下面是修改后的代码:

typedef struct lesson LES;

struct lesson {
    int number;
    char name[20];
    int score;
    int time;
    LES *next;
};

void add_lessonmessage()
{
    FILE *fp;
    fp=fopen("file4.txt","a");
    if(fp==NULL)
    {
        printf("打开文件失败");
        exit(1);
    }
    int n=0;
    LES *p,*q;
    LES *head=NULL;
    head=malloc(sizeof(LES));
    head->next=NULL;
    q=head;

    printf("请输入录入课程信息数量\n");
    scanf("%d",&n);

    for(int i=0;i<n;i++)
    {
        p=malloc(sizeof(LES));
        printf("请输入课程号\n");
        scanf("%d",&p->number);
        printf("请输入课程名\n");
        scanf("%s",p->name);
        printf("请输入课程学分\n");
        scanf("%d",&p->score);
        printf("请输入课程学时\n");
        scanf("%d",&p->time);
        p->next=NULL;
        q->next=p;
        q=p;
    }

    p=head->next;
    while(p != NULL)
    {
        fwrite(p,sizeof(LES),1,fp);
        p=p->next;
    }
    fclose(fp);
}

在这个修改后的代码中,先创建一个头结点,然后依次输入每个节点的信息,将新节点插入到链表的末尾。最后将链表中的所有节点信息写入文件中,并在写入文件时使用了 "a" 模式打开文件,这样可以将新的信息添加到文件末尾,而不会覆盖掉文件中原有的内容。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7435207
  • 你也可以参考下这篇文章:尝试用数组写一个学生信息管理系统
  • 除此之外, 这篇博客: ❤️C语言指针学了那么久还没学会?看这一篇就够了❤️中的 2.6函数指针数组 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    ①定义:首先是一个数组,其次这个数组中存放的是函数指针
    ②格式:在这里插入图片描述在这里插入图片描述

    通过计算器程序来进一步理解:在这里插入图片描述

    #include<stdio.h>
    #include<stdlib.h>
    
    int Add(int x, int y)
    {
    	return x + y;
    }
    
    int Sub(int x, int y)
    {
    	return x - y;
    }
    
    int Mul(int x, int y)
    {
    	return x * y;
    }
    
    int Div(int x, int y)
    {
    	return x / y;
    }
    
    void menu()
    {
    	printf("*************************\n");
    	printf("**** 1.加法  2.减法  ****\n");
    	printf("**** 3.乘法  2.除法  ****\n");
    	printf("****      0.退出     ****\n");
    
    }
    
    int main()
    {
    	int input = 0;
    	do{
    		menu();
    		int x = 0;
    		int y = 0;
    		int ret = 0;
    		printf("请输入你的选择:");
    		scanf("%d", &input);
    		switch (input)
    		{
    		case 1:
    			printf("请输入要处理的两个数字:");
    			scanf("%d %d", &x, &y);
    			ret = Add(x, y);
    			printf("ret = %d\n", ret);
    			break;
    		case 2:
    			printf("请输入要处理的两个数字:");
    			scanf("%d %d", &x, &y);
    			ret = Sub(x, y);
    			printf("ret = %d\n", ret);
    			break;
    		case 3:
    			printf("请输入要处理的两个数字:");
    			scanf("%d %d", &x, &y);
    			ret = Mul(x, y);
    			printf("ret = %d\n", ret);
    			break;
    		case 4:
    			printf("请输入要处理的两个数字:");
    			scanf("%d %d", &x, &y);
    			ret = Div(x, y);
    			printf("ret = %d\n", ret);
    			break;
    		case 0:
    			printf("退出\n");
    			break;
    		default:
    			printf("输入错误,请重新选择\n");
    			break;
    		}
    		/*printf("ret = %d\n", ret);*/
    
    	} while (input);
    	
    	return 0;
    }
    
    

    在这里插入图片描述图解:
    在这里插入图片描述通过简化函数指针数组优化:

    #include<stdio.h>
    #include<stdlib.h>
    
    int Add(int x, int y)
    {
    	return x + y;
    }
    
    int Sub(int x, int y)
    {
    	return x - y;
    }
    
    int Mul(int x, int y)
    {
    	return x * y;
    }
    
    int Div(int x, int y)
    {
    	return x / y;
    }
    
    void menu()
    {
    	printf("*************************\n");
    	printf("**** 1.加法  2.减法  ****\n");
    	printf("**** 3.乘法  2.除法  ****\n");
    	printf("****      0.退出     ****\n");
    
    }
    
    int main()
    {
    	int input = 0;
    	do{
    		int x = 0;
    		int y = 0;
    		int ret = 0;
    		menu();
    		int(*pArr[5])(int, int) = { NULL, Add, Sub, Mul, Div };
    		printf("请输入你的选择:\n");
    		scanf("%d", &input);
    		if (input > 0 && input <= 4)
    		{
    			printf("请输入处理的两个数字:\n");
    			scanf("%d %d", &x, &y);
    			ret = (pArr[input])(x, y);
    			printf("ret = %d\n", ret);
    		}
    		else if (input == 0)
    		{
    			printf("退出程序\n");
    			break;
    		}
    		else
    		{
    			printf("选择错误,请重新输入\n");
    		}
    
    	} while (input);
    
    	return 0;
    }
    

    图解:
    在这里插入图片描述


  • 您还可以看一下 CSDN讲师老师的 深度学习与强化学习技术沙龙 暨《深度学习模型及应用详解》新书发布会课程中的 深度学习在大规模在线广告系统中的应用小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    首先,需要明确使用的编程语言是什么,这样可以更具体地提供解决方案。假设我们使用的是Python语言。

    如果要存储学生信息到链表,可以先定义一个Student类,包含学生的各种信息,比如姓名、年龄、性别、学号等等。然后,可以定义一个Node类来表示链表的节点,每个节点包含一个Student类的实例和一个指向下一个节点的指针。

    下面是一个示例代码:

    class Student:
        def __init__(self, name, age, gender, student_id):
            self.name = name
            self.age = age
            self.gender = gender
            self.student_id = student_id
    
    class Node:
        def __init__(self, data):
            self.data = data
            self.next = None
    

    接下来,可以定义一个LinkedList类来操作链表。比如,可以定义add_node方法来向链表中添加一个节点,定义search_node方法来查找一个节点,定义delete_node方法来删除一个节点,等等。

    下面是一个示例代码:

    class LinkedList:
        def __init__(self):
            self.head = None
    
        def add_node(self, data):
            new_node = Node(data)
            if self.head is None:
                self.head = new_node
            else:
                curr_node = self.head
                while curr_node.next is not None:
                    curr_node = curr_node.next
                curr_node.next = new_node
    
        def search_node(self, student_id):
            curr_node = self.head
            while curr_node is not None:
                if curr_node.data.student_id == student_id:
                    return curr_node.data
                curr_node = curr_node.next
            return None
    
        def delete_node(self, student_id):
            if self.head is None:
                return
            if self.head.data.student_id == student_id:
                self.head = self.head.next
                return
            curr_node = self.head
            while curr_node.next is not None:
                if curr_node.next.data.student_id == student_id:
                    curr_node.next = curr_node.next.next
                    return
                curr_node = curr_node.next
    
        def display(self):
            curr_node = self.head
            while curr_node is not None:
                print(curr_node.data.name, curr_node.data.age, curr_node.data.gender, curr_node.data.student_id)
                curr_node = curr_node.next
    

    最后,可以将链表中的信息存储到文件里。可以使用Python内置的open函数来打开文件,使用write方法来将链表中的信息写入文件。需要注意的是,需要将信息转换成字符串格式才能写入文件。

    下面是一个示例代码:

    def save_to_file(linked_list, file_name):
        with open(file_name, 'w') as f:
            curr_node = linked_list.head
            while curr_node is not None:
                data_str = ','.join([curr_node.data.name, str(curr_node.data.age), curr_node.data.gender, str(curr_node.data.student_id)])
                f.write(data_str)
                f.write('\n')
                curr_node = curr_node.next
    

    这样,就可以实现将学生信息存储到链表里,再将链表里的信息存放到文件里的功能了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^