苏嵌实训-嵌入式 linux C 第 8 天

本次实训聚焦于嵌入式Linux环境下的C语言编程,通过深入浅出的讲解和实践,提升学员在该领域的技能。课程内容涵盖基础理论、实践操作及疑难问题解析,旨在帮助学员掌握嵌入式Linux系统下的高效编程技巧。
摘要由CSDN通过智能技术生成

项目名称

【苏嵌实训-嵌入式 linux C 第 8 天】

今日进度以及任务

链表:列表的创建,增删改查

1.题目:创建两个学生链表,含有姓名、年龄的信息,一个链表存放男生,一个链表存放女生。

 

2.题目:将上面两个链表合并,按学生的年龄进行排序,合 成新的链表.

 

3.题目:将上题中建立的链表进行反转,实现按年龄的逆序排列

 

4.题目:在上面的实现的新链表中,给定一个年龄,迅速查找和该学生年龄最接近的学生姓名。

本日任务完成情况

(详细说明本日任务是否按计划完成,开发的代码量)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAX sizeof(char) * 20

enum RESULT

{

    RANK_FAIL,

    RANK_SUCCESS,

    Reverse_fail,

    Reverse_success,

    Search_fail,

    Search_success

};

/****定义结构体******/

struct students

{

    char * name;

    char sex;

    int age;

    struct students *next;

};

typedef struct students Student;

typedef Student * STU;

/*****初始化头指针*******/

void init_head(STU *head)

{

    *head = (STU)malloc(sizeof(Student));

    (*head)->next = NULL;

}

/******链表尾插入函数*******/

void insert_tail(STU newstudent,STU *head)

{

    STU temp = *head;

    while(temp->next != NULL)

    {

        temp = temp->next;

    }

    temp->next = newstudent;

    newstudent->next = NULL;

}

/******年龄排序函数********/

int rank_age(STU *head)

{

    int i;

    int j;

    int n;

    int count = 0;

    STU p = *head;

    STU s = p->next;

    STU t = s->next;

#if 1

    if(((*head)->next == NULL) || ((*head)->next->next == NULL))

    {

        return RANK_FAIL;

    }

    else

    {

#endif

        STU temp = (*head)->next;

        while(temp != NULL)

        {

            count++;

    temp = temp->next;

        }

n = count - 1;

for(i = 0;i < n;i++)

{

    for(j = 0;j < (n - i);j++)

    {

        if(s->age > t->age)

{

    p->next = t;

    s->next = t->next;

    t->next = s;

    s = t;

    t = p->next->next;

}

t = t->next;

s = s->next;

p = p->next;

    }

    p = *head;

    s = p->next;

    t = s->next;

}

return RANK_SUCCESS;

    }

}

/***逆序链表***/

#if 1

int reverse(STU *head)

{

    if(((*head)->next == NULL) || ((*head)->next->next == NULL))

    {

        return Reverse_fail;

    }

    else

    {

        STU p = (*head)->next;

        STU s = p->next;

        STU t = s->next;

while(t != NULL)

{

    s->next = p;

    p = s;

    s = t;

    t = t->next;

}

s->next = p;

(*head)->next->next = NULL;

(*head)->next = s;

return Reverse_success;

    }

}

#endif

/*****寻找最近年龄*******/

int search_age(STU *head,STU *head1,int age)

{

    int min;

    int MIN = 100;

    

    STU temp = (*head)->next;

    STU t = (*head)->next;

 

    if((*head)->next == NULL)

    {

        return Search_fail;

    }

    else

    {

        while(temp != NULL)

{

            if(((temp->age) - age) >= 0)

    {

        min = (temp->age) - age;

    }

    else

    {

        min = age - (temp->age);

    }

    if(min <= MIN)

    {

        MIN = min;

    }

    temp = temp->next;

}

        printf("与所查年龄相差 %d 岁\n",MIN);

while(t != NULL)

{

            if(((t->age) - age) >= 0)

    {

        min = (t->age) - age;

    }

    else

    {

        min = age - (t->age);

    }

    if(min == MIN)

    {

        STU find_stu = (STU)malloc(sizeof(Student));

find_stu->name = t->name;

find_stu->sex = t->sex;

find_stu->age = t->age;

insert_tail(find_stu,&(*head1));

    }

    t = t->next;

}

return Search_success;

    }

}

/******显示函数*******/

void display(STU head,char sex)

{

    STU temp = head->next;

    printf("      姓名       性别      年龄 \n");

    if(sex == 'a')

    {

        while(temp != NULL)

        {

            printf("%10s",temp->name);

    printf("%10c",temp->sex);

    printf("%10d\n",temp->age);

    temp = temp->next;

}

    }

    else

    {

        while(temp != NULL)

        {

    if(temp->sex == sex)

    {

                printf("%10s",temp->name);

        printf("%10c",temp->sex);

        printf("%10d\n",temp->age);

    }

    temp = temp->next;

        }

    }

}

int main()

{

    int i;

    int age;

    int num;

    int function;

    int count;

    int rank_result;

    int reverse_result;

    int search_result;

    STU head;

    init_head(&head);

    STU head1;

    init_head(&head1);

#if 1

    STU stu1 = (STU)malloc(sizeof(Student));

    stu1->name = "Curley G";

    stu1->sex = 'g';

    stu1->age = 22;

    insert_tail(stu1,&head);

    STU stu2 = (STU)malloc(sizeof(Student));

    stu2->name = "Akira";

    stu2->sex = 'b';

    stu2->age = 25;

    insert_tail(stu2,&head);

    STU stu3 = (STU)malloc(sizeof(Student));

    stu3->name = "WangYiJin";

    stu3->sex = 'g';

    stu3->age = 25;

    insert_tail(stu3,&head);

    STU stu4 = (STU)malloc(sizeof(Student));

    stu4->name = "ChenZhuoXuan";

    stu4->sex = 'g';

    stu4->age = 23;

    insert_tail(stu4,&head);

    STU stu5 = (STU)malloc(sizeof(Student));

    stu5->name = "Nene";

    stu5->sex = 'b';

    stu5->age = 23;

    insert_tail(stu5,&head);

    STU stu6 = (STU)malloc(sizeof(Student));

    stu6->name = "Sally";

    stu6->sex = 'b';

    stu6->age = 24;

    insert_tail(stu6,&head);

#endif

    printf("\0");

    while(1)

    {

        printf("*********学生管理系统**********\n");

        printf("**     创建男生链表(1)     **\n");

        printf("**     创建女生链表(2)     **\n");

        printf("**      按年龄排序(3)      **\n");

        printf("**      按年龄逆序(4)      **\n");

        printf("**     查找年龄学生(5)     **\n");

printf("**         退出(0)         **\n");

        printf("*******************************\n");

printf("\n");

        printf("请输入你想要的操作\n");

scanf("%d",&function);

switch(function)

{

    case 1:

    {   

printf("\0");

        printf("您需要输入几个男学生的信息?\n");

scanf("%d",&num);

for(i = 0;i < num;i++)

{

    STU newstudent = (STU)malloc(sizeof(Student));

    newstudent->sex = 'b';

    printf("请输入学生 %d 姓名\n",i + 1);

    newstudent->name = (char *)malloc(MAX);

    scanf("%s",(newstudent->name));

    printf("请输入学生 %d 年龄\n",i + 1);

    scanf("%d",&(newstudent->age));

    insert_tail(newstudent,&head);

}

printf("\0");

        printf("/**********男生信息**********/\n");

printf("\n");

        display(head,'b');

printf("\n");

printf("\n");

printf("\n");

break;

    }

 

    case 2:

    {

printf("\0");

        printf("您需要输入几个女学生的信息?\n");

scanf("%d",&num);

for(i = 0;i < num;i++)

{

    STU newstudent = (STU)malloc(sizeof(Student));

    newstudent->sex = 'g';

    printf("请输入学生 %d 姓名\n",i + 1);

    newstudent->name = (char *)malloc(sizeof(char) * 20);

    scanf("%s",newstudent->name);

    printf("请输入学生 %d 年龄\n",i + 1);

    scanf("%d",&(newstudent->age));

    insert_tail(newstudent,&head);

}

printf("\0");

        printf("/**********女生信息**********/\n");

printf("\n");

        display(head,'g');

printf("\n");

printf("\n");

printf("\n");

break;

    }

    case 3:

    {

printf("\0");

printf("/*******排序结果为(由大到小)*******/\n");

printf("\n");

        rank_result = rank_age(&head);

if(rank_result == RANK_FAIL)

{

    printf("只有一个学生或者没有学生;故无法排序!\n");

}

if(rank_result == RANK_SUCCESS)

{

    display(head,'a');

}

printf("\n");

printf("\n");

printf("\n");

break;

    }

 

    case 4:

    {

printf("\0");

printf("/**********逆序结果**********/\n");

printf("\n");

        reverse_result = reverse(&head);

if(reverse_result == Reverse_fail)

{

    printf("只有一个学生或者没有学生数据;无法逆序!\n");

}

if(reverse_result == Reverse_success)

{

    display(head,'a');

}

printf("\n");

printf("\n");

printf("\n");

break;

    }

    case 5:

    {

printf("\0");

        printf("请输入要找的年龄:\n");

scanf("%d",&age);

printf("/**********查找结果**********/\n");

printf("\n");

search_result = search_age(&head,&head1,age);

if(search_result == Search_fail)

{

    printf("没有学生数据,无法查找!\n");

}

printf("\n");

if(search_result == Search_success)

{

    display(head1,'a');

}

head1->next = NULL;

printf("\n");

printf("\n");

printf("\n");

        break;

    }

    case 0:

    {

printf("\0");

                printf("已成功退出!使用愉快!\n");

return 0;

            }

    default:

    {

printf("\0");

        printf("输入错误,清重新输入!\n");

printf("\n");

printf("\n");

printf("\n");

break;

    }

}

    }

    return 0;

}

 

本日开发中出现的问题汇总

本日未解决问题

本日开发收获

加强了链表的相关知识。

其他

今后也要认真学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值