本题目要求完成在学生信息单链表中查找指定姓名的学生成绩,并打印出姓名,成绩。
#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;
}