您现在的位置是:首页 >技术杂谈 >PTA:C课程设计(7)网站首页技术杂谈

PTA:C课程设计(7)

徐徐同学 2023-05-23 00:00:02
简介PTA:C课程设计(7)

函数题

7-6-1 递增的整数序列链表的插入

接口:

List Insert( List L, ElementType X );

要求实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。
其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

L是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Insert要将X插入L,并保持该序列的有序性,返回插入后的链表头指针。

List Insert( List L, ElementType X )
{
    List cur = L;
    List tmp = (List)malloc(sizeof(struct Node));
    tmp->Data = X;
    while(cur->Next&& cur->Next->Data < X)
    {
        cur = cur->Next;
    }
    tmp->Next = cur->Next;
    cur->Next = tmp;
    return L;
}

7-6-2 查找学生链表

学生信息链表结点定义如下:

typedef struct List{
  int sno;    
  char sname[10];
  List *next;
}; 

需要创建的函数包括:
创建学生信息链表函数:CreateList;
查找学生信息链表函数:Find。

接口:

List * CreateList();  //键盘输入若干学生学号和姓名,学号与姓名以空格符间隔,当输入的学号为-1时,输入结束,创建学生信息链表函数,返回学生链表的头指针。
List * Find(List *head, int no)  //在学生信息链表(头指针为head)中查询学号为no的学生,返回该学生结点的指针。

实现:

//键盘输入若干学生学号和姓名,学号与姓名以空格符间隔,当输入的学号为-1时,输入结束,
//创建学生信息链表函数,返回学生链表的头指针。
List* BuyList(int sno)
{
    List* newnode = (List*)malloc(sizeof(struct List));
    newnode->sno = sno;
    newnode->next = NULL;
    return newnode;
}

List * CreateList()
{
    List *head, *tail;
    int id;
    char sname[10] = {0};
    tail = head = (List*)malloc(sizeof(List));
    head->next = NULL;
    
    scanf("%d", &id);
    while(id != -1)
    {
        List* t = BuyList(id);
        scanf("%s",t->sname);
        scanf("%d",&id);
        tail->next = t;
        tail = t;
    }
    scanf("%s",sname);
    return head;
}

//在学生信息链表(头指针为head)中查询学号为no的学生,返回该学生结点的指针。
List * Find(List *head, int no)
{
    List* cur = head->next;
    while(cur)
    {
        if(cur->sno == no)
            return cur;
        
        cur = cur->next;
    }
    return cur;
}

7-6-3 统计专业人数

实现一个函数,统计学生学号链表中专业为计算机的学生人数。链表结点定义如下:

struct ListNode {
    char code[8];
    struct ListNode *next;
};

这里学生的学号共7位数字,其中第2、3位是专业编号。计算机专业的编号为02

接口:

int countcs( struct ListNode *head );

其中head是用户传入的学生学号链表的头指针;函数countcs统计并返回head链表中专业为计算机的学生人数。

实现:

int countcs( struct ListNode *head )
{
    if(head == NULL)
        return 0;
    struct ListNode *cur = head;
    int cnt = 0;
    while(cur)
    {
        
        if(cur->code[1] == '0' && cur->code[2] == '2')
            cnt++;
        cur = cur->next;
    }
    return cnt;
}

7-6-4 建立学生信息链表

实现一个将输入的学生成绩组织成单向链表的简单函数。

接口:

void input();

该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:

struct stud_node {
    int              num;      /*学号*/
    char             name[20]; /*姓名*/
    int              score;    /*成绩*/
    struct stud_node *next;    /*指向下个结点的指针*/
};

单向链表的头尾指针保存在全局变量headtail中。
输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

实现:

struct stud_node* Buynode()
{
    struct stud_node*node = (struct stud_node*)malloc(sizeof(struct stud_node));
    node->next = NULL;
    return node;
}

void input()
{
    struct stud_node* cur = Buynode();
    scanf("%d", &cur->num);
    while (cur->num != 0)
    {
        if (head == NULL)
        {
            scanf("%s", cur->name);
            scanf("%d", &cur->score);
            head = tail = cur;
        }
        else
        {
            scanf("%s", cur->name);
            scanf("%d", &cur->score);
            tail->next = cur;
            tail = tail->next;
        }
        cur = Buynode();
        scanf("%d", &cur->num);
    }
}

编程题

7-7-1 查找书籍

在这里插入图片描述

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

typedef struct book {
    double price;
    char name[40];
    struct book* next;
}book;

book* Buynode()
{
    book* node = (book*)malloc(sizeof(book));
    node->next = NULL;
    return node;
}

int main()
{
    //输入第一行给出正整数n(<10)
    int n = 0;
    scanf("%d", &n);
    getchar();
    book* head, * cur;
    head = cur = Buynode();
    gets(cur->name);
    scanf("%lf", &cur->price);
    while (--n)//n本书
    {
        getchar();
        book* node = Buynode();
        
        gets(node->name);
        scanf("%lf", &node->price);
        cur->next = node;
        cur = cur->next;
    }

    cur = head;
    double max,min;
    max = min = cur->price;
//选出价格最高、最低
    while (cur)
    {
        if (cur->price > max)
            max = cur->price;
        if (cur->price < min)
            min = cur->price;
        cur = cur->next;
    }

    cur = head;
    while (cur->price != max)
    {
        cur = cur->next;
    }
    printf("%.2lf, %s
", cur->price, cur->name);

    cur = head;
    while (cur->price != min)
    {
        cur = cur->next;
    }
    printf("%.2lf, %s
", cur->price, cur->name);
    
    return 0;
}

7-7-2 找出总分最高的学生

在这里插入图片描述


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

typedef struct stu {
    char num[9];
    char name[15];
    int s1;
    int s2;
    int s3;
    struct stu* next;
}stu;

stu* Buynode()
{
    stu* node = (stu*)malloc(sizeof(stu));
    node->next = NULL;
    return node;
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    getchar();
    stu* cur,* head;
    cur = head = Buynode();
    scanf("%s",head->num);
    scanf("%s",head->name);
    
    scanf("%d%d%d", &head->s1, &head->s2, &head->s3);
    while (--n)
    {
        getchar();
        stu* node = Buynode();
        scanf("%s",node->num);
        scanf("%s",node->name);

        scanf("%d%d%d", &node->s1, &node->s2, &node->s3);
        cur->next = node;
        cur = cur->next;
    }

    cur = head;
    int max = cur->s1 + cur->s2 + cur->s3;

    while (cur)
    {
        if ((cur->s1 + cur->s2 + cur->s3) > max)
            max = cur->s1 + cur->s2 + cur->s3;

        cur = cur->next;
    }

    cur = head;
    while ((cur->s1 + cur->s2 + cur->s3) != max)
    {
        cur = cur->next;
    }
    printf("%s %s %d", cur->name, cur->num, cur->s1 + cur->s2 + cur->s3);
    return 0;
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。