八义士 发表于 2024-9-15 21:17:48

建立动态链表,程序有问题

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Student)

struct Student
{
        long num;
        float score;
        struct Student *next;
};
int n;
struct Student*creat()
{
        struct Student*head, *p1, *p2;
        n = 0;
        p2 = p1 = (struct Student*)malloc(LEN);
       
        printf("输入学号和成绩\n");
        scanf_s("%ld,%f",&p1->num,&p1->score);
        head = NULL;
        while (p1->num)
        {
                n++;
                if (n == 1) head = p1;
                else        p2->next = p1;
                p2 = p1;
                p1 = (struct Student*)malloc(LEN);
                scanf_s("%ld,%f", &p1->num, &p1->score);
        }
        p2->next = NULL;
        return head;
}

int main()
{
        struct Student*p;
        p = creat();
        printf("\nnumber:%ld\nscore:%5.1f\n",p->num,p->score);
        while (1);
        return 0;
}

FishC 发表于 2024-9-15 21:17:59

你好,看了一下你给的代码,有一些地方需要注意和修改:

1. **`#include`部分**:需要包含具体的头文件。
2. **`scanf_s`用法问题**:`scanf_s`是微软特有的安全版本,使用时需要特别小心。
3. **输出问题**:最后输出只打印了第一个学生的信息。

下面是修改后的代码,保证更好的规范性和运行效果:

#include <stdio.h>
#include <stdlib.h>// 包含 malloc、free 等函数
#define LEN sizeof(struct Student)

struct Student {
    long num;
    float score;
    struct Student *next;
};

int n;

struct Student* creat() {
    struct Student *head, *p1, *p2;
    n = 0;
   
    p2 = p1 = (struct Student*)malloc(LEN);
   
    printf("输入学号和成绩 (以0结束输入):\n");
    scanf("%ld %f", &p1->num, &p1->score);// 这里直接用scanf,简单处理
   
    head = NULL;
    while (p1->num) {
      n++;
      if (n == 1)
            head = p1;
      else
            p2->next = p1;
      p2 = p1;
      
      p1 = (struct Student*)malloc(LEN);
      scanf("%ld %f", &p1->num, &p1->score);
    }
    p2->next = NULL;// 链表尾部指向NULL
    free(p1);// 释放最后多分配的一个节点内存
    return head;
}

void print_list(struct Student *head) {
    struct Student *p = head;
    while (p != NULL) {
      printf("number: %ld\nscore: %.1f\n", p->num, p->score);
      p = p->next;
    }
}

int main() {
    struct Student *p;
    p = creat();
    if (p == NULL) {
      printf("没有输入有效数据。\n");
    } else {
      print_list(p);
    }
   
    // 这里可以加入代码释放链表内存
    while (1);// 暂停程序查看输出
    return 0;
}

**关键修改点**:
1. `#include <stdio.h>` 和 `#include <stdlib.h>` 是包含标准输入输出和内存管理的头文件。
2. 将 `scanf_s` 改为 `scanf`。
3. 添加了 `print_list` 函数,以遍历并打印整个链表。
4. 在 `creat` 函数中释放了最后多分配的一个节点内存。
5. 如果链表为空打印提示信息。

这段改良后的代码结构清晰,也照顾到内存管理的基本问题。希望对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 建立动态链表,程序有问题