完成 countLinkListByHeight,insertLinkList,delelteLinkList,并在主函数中对以上函数进行调用,并输出结果;
要求实现部份
/统计head为头指针的学生链表中身高达标人数并返回/
int countLinkListByHeight(LinkNode* head,float height_female,float height_male);
/在学号从小到大排序的学生链表中插入值为x的学生仍保持学号的有序性/
void insertLinkList(LinkNode* head, STUDENT x);
/删除head为头指针的学生链表中身高低于指定身高的所有学生结点,删除成功返回1,否则返回0/
int deleteLinkList(LinkNode* head, float height);
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int student_NO; /* NO. */
float student_height; /* height */
int student_sex; /* 0:male,1:female */
} STUDENT;
typedef struct LinkNode{
STUDENT data; /*数据域*/
struct LinkNode *next; /*指针域*/
} LinkNode;
/*带表头的单链表的基本运算函数*/
LinkNode* initLinkList();/*置一个空表(带头结点)*/
void createLinkList_1(LinkNode* head);/*创建单链表*/
void createLinkList_2(LinkNode* head);/*创建单链表*/
void sortLinkListBYNO(LinkNode* head);/*单链表排序*/
void reverseLinkList(LinkNode* head);/*单链表倒置*/
void printLinkList(LinkNode* head);/*打印单链表*/
void saveLinkList(LinkNode* head,char strname[]);/*保存单链表到文件*/
/*置一个空表*/
LinkNode* initLinkList()
{
LinkNode* p;
p=( LinkNode*)malloc(sizeof(LinkNode));
p->next=NULL;
return p;
}
/*创建单链表方法1*/
void createLinkList_1(LinkNode* head)
{
FILE *fp;
STUDENT stu;
LinkNode* p;
if((fp=fopen("records.txt","r"))==NULL)
{ printf("can not open read file !");
exit(1) ;
}
while(!feof(fp))
{ fscanf(fp,"%d%f%d",&stu.student_NO,&stu.student_height,&stu.student_sex);
p=( LinkNode*)malloc(sizeof(LinkNode));
p->data=stu;
p->next=head->next;
head->next=p;
}
fclose(fp);
}
/*创建单链表方法2*/
void createLinkList_2(LinkNode* head)
{ FILE *fp;
STUDENT stu;
LinkNode* p, *rear;
if((fp=fopen("records.txt","r"))==NULL)
{ printf("can not open read file !");
exit(1) ;
}
rear=head;
while(!feof(fp))
{ fscanf(fp,"%d%f%d",&stu.student_NO, &stu.student_height, &stu.student_sex);
p=( LinkNode*)malloc(sizeof(LinkNode));
p->data = stu;
p->next=NULL;
rear->next=p;
rear=p;
}
fclose(fp);
}
/*单链表排序*/
void sortLinkListBYNO(LinkNode* head)
{
LinkNode* q, *p, *u;
p=head->next;
head->next=NULL;/*利用原表头结点建新的空表*/
while(p)
{ q=p; /*q为被插入的结点*/
p=p->next;/*用p记录后继结点*/
/*遍历新链表查找插入位置*/
u=head;
while(u->next!=NULL)/*查找插入位置*/
{ if(u->next->data.student_NO > q->data.student_NO)
break;
u=u->next;
}
/*插入在u结点的后面*/
q->next=u->next;
u->next=q;
}
}
/*单链表倒置*/
void reverseLinkList(LinkNode* head)
{
LinkNode* p, *r;
p=head->next;
head->next=NULL;
while(p)
{ r=p;
p=p->next;
/*r指向结点头插到链表*/
r->next=head->next;
head->next=r;
}
}
/*输出单链表*/
void printLinkList(LinkNode* head)
{ LinkNode* p;
p=head->next;
while (p!=NULL)
{printf("%2d: %.2f %d\n",p->data.student_NO,p->data.student_height,p->data.student_sex);
p=p->next;
}
}
/*保存单链表到文件*/
void saveLinkList(LinkNode* head, char strname[])
{ FILE *fp;
LinkNode* p;
if((fp=fopen(strname,"w"))==NULL)
{ printf("can not open write file !");
exit(1) ;
}
p=head->next;
while(p!=NULL)
{ fprintf(fp,"%2d %5.2f %2d\n",p->data.student_NO,p->data.student_height,p->data.student_sex);
p=p->next;
}
fclose(fp);
}
int main()
{
LinkNode* head;
int count,flag;
float height,height_felmale,height_male;
STUDENT x;
/*建立与源数据文件同序的学生链表并输出;*/
head=initLinkList(); /*建空链表*/
createLinkList_2(head); /*调用建链表函数建立所需链表*/
printf("\n与数据文件同序的学生链表:\n");
printLinkList(head); /*调用函数打印输出链表中信息*/
getchar();
#if 1
/*统计学生链表中身高达标人数(男女生的身高达标值由键盘输入)并打印结果;*/
printf("\n输入达标的女生、男生身高值:");
scanf("%f%f",&height_felmale,&height_male);
count =countLinkListByHeight(head, height_felmale, height_male);
printf("\n达标学生人数为:%d",count);
getchar();
#endif
/*对学生链表按学号进行排序*/
sortLinkListBYNO(head);
printf("\nlist after sort by NO:\n");
printLinkList(head);
getchar();
#if 1
/*在学生链表中插入指定的学生元素后使链表仍按学号有序*/
x.student_NO=3;
x.student_height=1.67;
x.student_sex=0;
insertLinkList(head, x);
printf("\n new list after insert:\n");
printLinkList(head);
getchar();
#endif
/*对学生链表进行倒置,结果输出到文件result.txt中;*/
reverseLinkList(head);
printf("\n new list after reverse:\n");
printLinkList(head);
saveLinkList(head,"result.txt");
getchar();
#if 1
/*删除链表中身高低于指定值的所有学生结点;*/
height=1.67;
flag=deleteLinkList(head, height);
if(flag)
printf("\ndelete height < %f succeed!\n", height);
else
printf("\ndelete failed\n");
printf("\n new list after delete:\n");
printLinkList(head);
getchar();
#endif
return 0;
}
int countLinkListByHeight(LinkNode* head,float height_female,float height_male)
{
int count = 0;
// TODO:
return count;
}
void insertLinkList(LinkNode* head, STUDENT x)
{
// TODO:
}
int deleteLinkList(LinkNode* head, float height)
{
int flag=0;
// TODO:
return flag; /*删除成功返回1,否则返回0*/
}
链表的基础应用,3个函数代码如下:
int countLinkListByHeight(LinkNode* head, float height_female, float height_male)
{
int count = 0;
LinkNode* p = head->next;
while (p)
{
if (p->data.student_sex == 0 && p->data.student_height >= height_male)
count++;
else if (p->data.student_sex == 1 && p->data.student_height >= height_female)
count++;
p = p->next;
}
return count;
}
void insertLinkList(LinkNode* head, STUDENT x)
{
LinkNode* q = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* pre = head;
q->data = x;
while (pre->next)
{
if (pre->next->data.student_NO > x.student_NO)
{
q->next = pre->next->next;
pre->next = q;
return;
}
else
pre = pre->next;
}
//比最后学生的学号一个都大
q->next = NULL;
pre->next = q;
}
int deleteLinkList(LinkNode* head, float height)
{
int flag = 0;
LinkNode* pre = head;
LinkNode* t;
while (pre->next)
{
if (pre->next->data.student_height < height)
{
t = pre->next;
pre->next = t->next;
free(t);
}
else
pre = pre->next;
}
return flag; /*删除成功返回1,否则返回0*/
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!【以下回答由 GPT 生成】
问题较为复杂,需要实现多个函数来完成。我会尝试给出解决方案。
首先,我来解释一下每个函数的功能,然后逐个给出具体的实现。
返回值: 达标人数。
insertLinkList(LinkNode* head, STUDENT x):
返回值: 无。
deleteLinkList(LinkNode* head, float height):
接下来,我将给出每个函数的具体实现。
首先是countLinkListByHeight函数的实现:
int countLinkListByHeight(LinkNode* head, float height_female, float height_male) {
int count = 0;
LinkNode* p = head->next;
while (p != NULL) {
if (p->data.student_sex == 0 && p->data.student_height >= height_male) {
count++;
}
else if (p->data.student_sex == 1 && p->data.student_height >= height_female) {
count++;
}
p = p->next;
}
return count;
}
然后是insertLinkList函数的实现:
void insertLinkList(LinkNode* head, STUDENT x) {
LinkNode* p = head;
while (p->next != NULL && p->next->data.student_NO < x.student_NO) {
p = p->next;
}
LinkNode* new_node = (LinkNode*)malloc(sizeof(LinkNode));
new_node->data = x;
new_node->next = p->next;
p->next = new_node;
}
最后是deleteLinkList函数的实现:
int deleteLinkList(LinkNode* head, float height) {
int deleted = 0;
LinkNode* p = head;
while (p->next != NULL) {
if (p->next->data.student_height < height) {
LinkNode* temp = p->next;
p->next = temp->next;
free(temp);
deleted = 1;
}
else {
p = p->next;
}
}
return deleted;
}
至此,以上是问题中需要完成的函数的具体实现。
下面是主函数的调用和输出结果的代码:
int main() {
LinkNode* head = initLinkList();
createLinkList_1(head);
printLinkList(head); // 打印原始链表
float height_female = 160.0;
float height_male = 170.0;
int count = countLinkListByHeight(head, height_female, height_male);
printf("达标人数:%d\n", count);
STUDENT x;
x.student_NO = 10;
x.student_height = 175.0;
x.student_sex = 0;
insertLinkList(head, x);
printLinkList(head); // 打印插入后的链表
float height = 160.0;
int deleted = deleteLinkList(head, height);
if (deleted) {
printf("删除成功\n");
}
else {
printf("删除失败\n");
}
printLinkList(head); // 打印删除后的链表
return 0;
}
以上是主函数的调用和输出结果的代码。
希望以上解决方案能够满足您的需求。如果还有其他问题,请随时告诉我。