【PTA】数据结构与算法,5-4,单链表的查询(复合数据)【可本地编译器调试】成信大,DS课程组

本题目要求完成在学生信息单链表中查找指定姓名的学生成绩,并打印出姓名,成绩。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
    char name[10];    // 姓名
    int score;        // 分数
}DataType;            // 学生信息

typedef struct {
    DataType stu;
    struct LNode* link;
}LNode, * PNode, * LinkList;

// 初始化单链表,head为单链表头指针
int InitLinkList(LinkList* head)
{
    *head = (LinkList)malloc(sizeof(LNode));        // 申请内存空间,生成头结点
    if (!head)
    {
        printf("初始化链表错误!\n");
        return 0;
    }
    (*head)->link = NULL;                            // 头结点的指针域为空
    return 1;
}
// h为指向单链表的指针,pos为插入位置,从1开始,x为待插入数据元素
int LinkListInsert(LinkList h, int pos, DataType x)        // h为指向单链表的指针,pos为插入位置,x为待插入数据元素
{
    PNode q;
    PNode p = h;
    int i = 0;                                        // 计数器
    while (p && i < pos - 1)                            // 指针后移,寻找待插入结点的前驱
    {
        p = p->link;                                // 指针后移
        i++;                                        // 计数器加一
    }
    if (!p || i > pos - 1)                            // 检查插入位置是否在链表中
    {
        printf("插入位置不合法!\n");
        return 0;
    }
    q = (PNode)malloc(sizeof(LNode));                // 生成新的结点
    if (!q)                                            // 检查新结点是否生成
    {
        printf("不能生成新结点\n");
        return 0;
    }
    strcpy(q->stu.name, x.name);                            // 将待插入元素存入q结点的data域
    q->stu.score = x.score;
    q->link = p->link;                                // 使q结点的指针域指向p结点的后继
    p->link = q;                                    // 使p结点的指针指向q结点
    return 1;
}
// 本题要求补充的函数
int Find(LinkList h, char* s, DataType* x)
{
    PNode p = h->link;
    while (p && strcmp(____________ ) != 0) // 查找,注意两个参数填入时的中英文逗号的区别
    {
        p = p->link;
    }
    if (____________)
    {
        memcpy(_________________, sizeof(p->stu.name));// 字符串赋值,注意两个参数填入时的中英文逗号的区别
        x->score =____________;
        return 1;
    }
    else
    {
        return 0;
    }
}

int main()
{
    LinkList L;
    char chName[10];
    int i, pos = 1;
    DataType x;
    DataType a[5] = { {"Tom",90},{"Lily",87},{"May",92},{"Lucy",78},{"Tracy",76} };
    InitLinkList(&L);
    for (i = 0; i < 5; i++)
    {
        LinkListInsert(L, pos++, a[i]);
    }

    ______________________;     // 读取待查姓名
    if (Find(L, chName, &x) ==____________)
    {
        printf("%s,%d\n",____________);  // 注意两个参数填入时的中英文逗号的区别
    }
    else
    {
        printf("No record for %s", chName);
    }
    return 0;
}

———————————————————————————————————————————

解答:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
    char name[10];    // 姓名
    int score;        // 分数
}DataType;            // 学生信息

typedef struct {
    DataType stu;
    struct LNode* link;
}LNode, * PNode, * LinkList;

// 初始化单链表,head为单链表头指针
int InitLinkList(LinkList* head)
{
    *head = (LinkList)malloc(sizeof(LNode));        // 申请内存空间,生成头结点
    if (!head)
    {
        printf("初始化链表错误!\n");
        return 0;
    }
    (*head)->link = NULL;                            // 头结点的指针域为空
    return 1;
}
// h为指向单链表的指针,pos为插入位置,从1开始,x为待插入数据元素
int LinkListInsert(LinkList h, int pos, DataType x)        // h为指向单链表的指针,pos为插入位置,x为待插入数据元素
{
    PNode q;
    PNode p = h;
    int i = 0;                                        // 计数器
    while (p && i < pos - 1)                            // 指针后移,寻找待插入结点的前驱
    {
        p = p->link;                                // 指针后移
        i++;                                        // 计数器加一
    }
    if (!p || i > pos - 1)                            // 检查插入位置是否在链表中
    {
        printf("插入位置不合法!\n");
        return 0;
    }
    q = (PNode)malloc(sizeof(LNode));                // 生成新的结点
    if (!q)                                            // 检查新结点是否生成
    {
        printf("不能生成新结点\n");
        return 0;
    }
    strcpy(q->stu.name, x.name);                            // 将待插入元素存入q结点的data域
    q->stu.score = x.score;
    q->link = p->link;                                // 使q结点的指针域指向p结点的后继
    p->link = q;                                    // 使p结点的指针指向q结点
    return 1;
}
// 本题要求补充的函数
int Find(LinkList h, char* s, DataType* x)
{
    PNode p = h->link;
    while (p && strcmp(p->stu.name,s) != 0) // 查找,注意两个参数填入时的中英文逗号的区别     #1
    {
        p = p->link;
    }
    if (p)           //#2
    {
        memcpy(x->name,p->stu.name, sizeof(p->stu.name));// 字符串赋值,注意两个参数填入时的中英文逗号的区别    #3
        x->score =p->stu.score;                //#4
        return 1;
    }
    else
    {
        return 0;
    }
}

int main()
{
    LinkList L;
    char chName[10];
    int i, pos = 1;
    DataType x;
    DataType a[5] = { {"Tom",90},{"Lily",87},{"May",92},{"Lucy",78},{"Tracy",76} };
    InitLinkList(&L);
    for (i = 0; i < 5; i++)
    {
        LinkListInsert(L, pos++, a[i]);
    }

    _gets(chName);     // 读取待查姓名          #5
    if (Find(L, chName, &x) ==1)               //#6
    {
        printf("%s,%d\n",x.name,x.score);  // 注意两个参数填入时的中英文逗号的区别         #7
    }
    else
    {
        printf("No record for %s", chName);
    }
    return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值