c语言 数据结构 单链条 完成函数

完成 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*/
}



您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

【以下回答由 GPT 生成】

问题较为复杂,需要实现多个函数来完成。我会尝试给出解决方案。

首先,我来解释一下每个函数的功能,然后逐个给出具体的实现。

  1. countLinkListByHeight(LinkNode* head, float height_female, float height_male):
  2. 功能: 统计头指针为head的学生链表中身高达标人数并返回。
  3. 输入参数:
    • head: 学生链表的头指针。
    • height_female: 女性学生的身高标准。
    • height_male: 男性学生的身高标准。
  4. 返回值: 达标人数。

  5. insertLinkList(LinkNode* head, STUDENT x):

  6. 功能: 在学号从小到大排序的学生链表中插入值为x的学生仍保持学号的有序性。
  7. 输入参数:
    • head: 学生链表的头指针。
    • x: 要插入的学生信息。
  8. 返回值: 无。

  9. deleteLinkList(LinkNode* head, float height):

  10. 功能: 删除头指针为head的学生链表中身高低于指定身高的所有学生结点,删除成功返回1,否则返回0。
  11. 输入参数:
    • head: 学生链表的头指针。
    • height: 身高标准。
  12. 返回值: 删除成功返回1,否则返回0。

接下来,我将给出每个函数的具体实现。

首先是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;
}

以上是主函数的调用和输出结果的代码。

希望以上解决方案能够满足您的需求。如果还有其他问题,请随时告诉我。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^