学生成绩系统三代目-《C语言程序设计教程(第三版)》课后习题

人看的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
struct Node {
  char studentID[20];
  int score;
  struct Node* next;
};

// 插入节点到链表中,按学号升序排列
struct Node* insertNode(struct Node* head, char studentID[], int score) {
  struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
  if (newNode == NULL) {
    printf("内存分配失败\n");
    exit(1);
  }
  strcpy(newNode->studentID, studentID);
  newNode->score = score;
  newNode->next = NULL;

  if (head == NULL || strcmp(studentID, head->studentID) < 0) {
    newNode->next = head;
    return newNode;
  }

  struct Node* current = head;
  while (current->next != NULL && strcmp(studentID, current->next->studentID) >= 0) {
    current = current->next;
  }
  newNode->next = current->next;
  current->next = newNode;
  return head;
}

// 打印链表
void printList(struct Node* head) {
  struct Node* current = head;
  while (current != NULL) {
    printf("%s %d\n", current->studentID, current->score);
    current = current->next;
  }
}

int main() {
  int N, M; // a、b链表元素数量
  printf("请输入a、b链表元素的数量 N 和 M: ");
  scanf("%d %d", &N, &M);

  struct Node* aHead = NULL;
  struct Node* bHead = NULL;

  // 输入a链表数据
  printf("请输入a链表的数据(学号 成绩):\n");
  for (int i = 0; i < N; i++) {
    char studentID[20];
    int score;
    scanf("%s %d", studentID, &score);
    aHead = insertNode(aHead, studentID, score);
  }

  // 输入b链表数据
  printf("请输入b链表的数据(学号 成绩):\n");
  for (int i = 0; i < M; i++) {
    char studentID[20];
    int score;
    scanf("%s %d", studentID, &score);
    bHead = insertNode(bHead, studentID, score);
  }

  // 合并两个链表
  struct Node* mergedHead = NULL;
  while (aHead != NULL || bHead != NULL) {
    if (aHead == NULL || (bHead != NULL && strcmp(bHead->studentID, aHead->studentID) < 0)) {
      mergedHead = insertNode(mergedHead, bHead->studentID, bHead->score);
      bHead = bHead->next;
    }
    else {
      mergedHead = insertNode(mergedHead, aHead->studentID, aHead->score);
      aHead = aHead->next;
    }
  }

  // 打印合并后的链表
  printf("按学号升序排列的数据:\n");
  printList(mergedHead);

  // 释放内存
  while (mergedHead != NULL) {
    struct Node* temp = mergedHead;
    mergedHead = mergedHead->next;
    free(temp);
  }

  return 0;
}




给网站通过的代码:

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
struct Node {
  char studentID[20];
  int score;
  struct Node* next;
};

// 插入节点到链表中,按学号升序排列
struct Node* insertNode(struct Node* head, char studentID[], int score) {
  struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
  if (newNode == NULL) {
    printf("内存分配失败\n");
    exit(1);
  }
  strcpy(newNode->studentID, studentID);
  newNode->score = score;
  newNode->next = NULL;

  if (head == NULL || strcmp(studentID, head->studentID) < 0) {
    newNode->next = head;
    return newNode;
  }

  struct Node* current = head;
  while (current->next != NULL && strcmp(studentID, current->next->studentID) >= 0) {
    current = current->next;
  }
  newNode->next = current->next;
  current->next = newNode;
  return head;
}

// 打印链表
void printList(struct Node* head) {
  struct Node* current = head;
  while (current != NULL) {
    printf("%s %d\n", current->studentID, current->score);
    current = current->next;
  }
}

int main() {
  int N, M; // a、b链表元素数量
  //printf("请输入a、b链表元素的数量 N 和 M: ");
  scanf("%d %d", &N, &M);

  struct Node* aHead = NULL;
  struct Node* bHead = NULL;

  // 输入a链表数据
 /* printf("请输入a链表的数据(学号 成绩):\n");*/
  for (int i = 0; i < N; i++) {
    char studentID[20];
    int score;
    scanf("%s %d", studentID, &score);
    aHead = insertNode(aHead, studentID, score);
  }

  // 输入b链表数据
  //printf("请输入b链表的数据(学号 成绩):\n");
  for (int i = 0; i < M; i++) {
    char studentID[20];
    int score;
    scanf("%s %d", studentID, &score);
    bHead = insertNode(bHead, studentID, score);
  }

  // 合并两个链表
  struct Node* mergedHead = NULL;
  while (aHead != NULL || bHead != NULL) {
    if (aHead == NULL || (bHead != NULL && strcmp(bHead->studentID, aHead->studentID) < 0)) {
      mergedHead = insertNode(mergedHead, bHead->studentID, bHead->score);
      bHead = bHead->next;
    }
    else {
      mergedHead = insertNode(mergedHead, aHead->studentID, aHead->score);
      aHead = aHead->next;
    }
  }

  // 打印合并后的链表
  //printf("按学号升序排列的数据:\n");
  printList(mergedHead);

  // 释放内存
  while (mergedHead != NULL) {
    struct Node* temp = mergedHead;
    mergedHead = mergedHead->next;
    free(temp);
  }

  return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值