实验五 结构体程序设计(三)

一、实验目的及要求

  1. 进一步理解结构体的概念;
  2. 掌握结构体的定义和结构体变量的定义和使用方法;
  3. 能正确使用结构体数组;
  4. 掌握链表的基本概念,能够编写简单的应用程序
  5. 进一步提高编程能力。

1.一个班有10名同学,每名同学都有如下信息:学号,姓名,三门课程的成绩。请编写程序输入全班同学的信息,并且按第一门课程的成绩从小到大排序后输出。

5.按照输入的顺序建立一个链表,每个节点包括:学号、姓名、性别、年龄。直到输入的学号为-1结束。然后输出此链表。然后从键盘上输入一个学生的学号,把此学生的节点删除后再输出链表。(要求建立链表、删除用函数)

//5.	按照输入的顺序建立一个链表,每个节点包括:学号、姓名、性别、年龄。直到输入的学号为-1结束。
//然后输出此链表。然后从键盘上输入一个学生的学号,把此学生的节点删除后再输出链表。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct students {
    int num;
    char names[30];
    char sex[10]; 
    int age;
    struct students* next;
}data;

data* setList()
{
    data* head = (data*)malloc(sizeof(data));
    head->next = NULL;
    data* cur = NULL;
    data* pt = head;
    data students;

    int i = 1;
    printf("第%d个学生信息:学号 姓名 性别 年龄", i++);
    scanf_s("%d %s %s %d", &students.num, students.names,10, students.sex,10, &students.age); //输入数据

    while (students.num != 0)
    {
        cur = (data*)malloc(sizeof(data));
        cur->num = students.num;
        strcpy_s(cur->names, students.names);
        strcpy_s(cur->sex, students.sex);
        cur->age = students.age;
        cur->next = NULL;
        pt->next = cur;
        pt = cur;
        printf("第%d个学生信息:学号 姓名 性别 年龄", i++);
        scanf_s("%d %s %s %d", &students.num, students.names,10, students.sex,10, &students.age); //输入数据   
    }

    return head;
}
void show_List(data* headp)
{
    data* headpp = headp->next;

    while (headpp != NULL)
    {
        printf("学号 %d 名字 %s 性别 %s 年龄 %d\n", headpp->num, headpp->names, headpp->sex, headpp->age);
        headpp = headpp->next;
    }
}

void deleteList(data* head, int age)
{
    data* posNode = head->next;
    data* posNodeFront = head;

    if (posNode == NULL)
    {
        printf("链表为空");
    }
    else
    {
        while (posNode->age != age)
        {
            posNodeFront = posNode;
            posNode = posNodeFront->next;
                if (posNode == NULL)
                {
                    printf("没有找到相关信息,无法删除\n");
                    return;
                }

        }
        posNodeFront->next = posNode->next;
        free(posNode);
    }
}
void reverse(data* head)
{
    data* p = head->next;
    data* q = head->next->next;
    data* t = NULL;
    while (q != NULL)
    {
        t = q->next;
        q->next = p;
        p = q;
        q = t;
    }
    q = NULL;
    head->next->next = NULL;
    head->next = p;
}

int main(int argc, char const* argv[]) {

    //头节点    
    data* headnode = (data*)malloc(sizeof(data));

    //创建链表            
    headnode = setList();
    show_List(headnode);

    //删除链表            
    int age;
    printf("请输入一个年龄:");
    scanf_s("%d", &age);
    deleteList(headnode, age);
    printf("进行了删除链表数据的操作之后的数据:\n");
    show_List(headnode);

    //链表逆序
    printf("以下是逆序后的数据:");
    reverse(headnode);
    show_List(headnode);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值