2019.08.01

本文详细介绍如何使用C语言创建并操作学生信息链表,包括按性别分别存储、合并链表并按年龄排序,以及链表的反转和查找最接近指定年龄的学生。通过具体代码示例,展示了链表的基本操作和排序算法的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作业有点难
1.创建两个学生链表,含有姓名、年龄的信息,一个链表存放男生,一个链表存放女生

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct node
{
    char name[20];
    int age;
    int num;
    struct node *next;
};

typedef struct node Node;
typedef struct node *Link;

void create_link(Link *head)
{
    *head = NULL;
}

create_node(Link *new_node)
{
    *new_node = (Link)malloc(sizeof(Node));
    if(*new_node == NULL)
    {
        printf("malloc error!\n");
        return;
    }
}

void insert_node_tail(Link *head,Link new_node)
{
    Link p;
    p = *head;

    if(*head == NULL)
    {
        *head = new_node;
        new_node->next = NULL;
    }
    else
    {
        while(p->next != NULL)
        {
            p = p->next;
        }
        p->next = new_node;
        new_node->next = NULL;
    }
}

void display_link(Link head)
{
    Link p;
    p = head;
    int i;

    if(head == NULL)
    {
        printf("Link is empty!\n");
        return;
    }
    else
    {
        while(p != NULL)
        {
            printf("%d  Name:%s  Age:%d\n",p->num,p->name,p->age);
            printf("********************************************\n");
            p = p->next;
        }
    }
}

void release_link(Link *head)
{
    Link p;
    p = *head;

    while(*head != NULL)
    {
        *head = (*head)->next;
        free(p);
        p = *head;
    }
}

int main()
{
    Link head1 = NULL;
    Link head2 = NULL;
    Link new_node = NULL;

    create_link(&head1);
    create_link(&head2);

    int i;
    int boy_num;
    int girl_num;
    Link p;

    printf("Please input boy number:");
    scanf("%d",&boy_num);

    for(i = 0;i < boy_num;i++)
    {
        create_node(&new_node);
        insert_node_tail(&head1,new_node);
        new_node->num = i+1;
    }

    printf("Please input girl number:");
    scanf("%d",&girl_num);

    for(i = 0;i < girl_num;i++)
    {
        create_node(&new_node);
        insert_node_tail(&head2,new_node);
        new_node->num = i+1;
    }

    p = head1;

    for(i = 0;i < boy_num;i++)
    {
        printf("Input boy's name:");
        scanf("%s",&p->name);
        printf("Input boy's age:");
        scanf("%d",&p->age);

        p = p->next;
    }

    p = head2;

    for(i = 0;i < girl_num;i++)
    {
        printf("Input girl's name:");
        scanf("%s",&p->name);
        printf("Input girl's age:");
        scanf("%d",&p->age);

        p = p->next;
    }

    printf("Boy's and Girl's information:\n");
    printf("********************************************\n");
    display_link(head1);
    display_link(head2);

    release_link(&head1);
    release_link(&head2);

    display_link(head1);
    display_link(head2);

    return 0;
}

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct students
{
    char name[20];
    int age;
   // int num;
    struct students *next;
}Stu;

Stu *ass(Stu *t,char name[],int age)
{
    Stu *p = (Stu *)malloc(sizeof(Stu));
    strcpy(p->name,name);
    p->age = age;
    p->next = t;
    t = p;
    return t;
}

Stu *connect(Stu *q,Stu *p)
{
    Stu *t = q;
    if(NULL == t)
    {
        return p;
    }
    while(t->next != NULL)
    {
        t = t->next;
    }
    t->next = p;
    return q;
}

Stu *rank(Stu *p)
{
    Stu *t;
    Stu *q;
    t = p;
    q = p;

    int m = 0;
    char s[20] = {0};

    while(t->next)
    {
        while(q->next)
        {
            if((q->age)>(q->next->age))
            {
                m = q->age;
                q->age = q->next->age;
                q->next->age = m;
                strcpy(s,q->name);
                strcpy(q->name,q->next->name);
                strcpy(q->next->name,s);
            }
            q = q->next;
        }
        t = t->next;
        q = p;
    }
    return p;
}


void display(Stu *p)
{
    while(p)
    {
        printf("Name:%s  Age:%d\n",p->name,p->age);
        p = p->next;
    }
}


int main()
{
    Stu *student = NULL;

    Stu *man = NULL;
    Stu *woman = NULL;

    man = ass(man,"qq",10);
    man = ass(man,"ww",13);
    man = ass(man,"ee",15);
    woman = ass(woman,"rr",11);
    woman = ass(woman,"tt",14);
    woman = ass(woman,"yy",9);

    student = connect(man,woman);

    display(student);

    printf("Boy's and Girl's information:\n");
    printf("********************************************\n");
    
    student = rank(student);

    display(student);

    return 0;
}

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct students
{
    char name[20];
    int age;
   // int num;
    struct students *next;
}Stu;

Stu *ass(Stu *t,char name[],int age)//赋值
{
    Stu *p = (Stu *)malloc(sizeof(Stu));
    strcpy(p->name,name);
    p->age = age;
    p->next = t;
    t = p;
    return t;
}

Stu *connect(Stu *q,Stu *p)
{
    Stu *t = q;
    if(NULL == t)
    {
        return p;
    }
    while(t->next != NULL)//找尾部
    {
        t = t->next;
    }
    t->next = p;
    return q;
}

Stu *rank(Stu *p)
{
    Stu *t;
    Stu *q;
    t = p;
    q = p;

    int m = 0;
    char s[20] = {0};

    while(t->next)//t相当于循环次数
    {
        while(q->next)//q用于相邻比较
        {
            if((q->age)>(q->next->age))
            {
                m = q->age;
                q->age = q->next->age;//交换年龄
                q->next->age = m;
                strcpy(s,q->name);//交换姓名
                strcpy(q->name,q->next->name);
                strcpy(q->next->name,s);
            }
            q = q->next;
        }
        t = t->next;
        q = p;
    }
    return p;
}


void display(Stu *p)
{
    while(p)
    {
        printf("Name:%s  Age:%d\n",p->name,p->age);
        p = p->next;
    }
}

Stu *revese(Stu *p)
{
    Stu *t = p;
    Stu *q = p;
    int m = 0;
    char s[10] = {0};
    while(t->next)
    {
        while(q->next)
        {

            if((q->age)<(q->next->age))
            {
                m = q->age;
                q->age = q->next->age;//交换年龄
                q->next->age = m;
                strcpy(s,q->name);//交换姓名
                strcpy(q->name,q->next->name);
                strcpy(q->next->name,s);
            }
            q = q->next;
        }
        t = t->next;
        q = p;
    }
    return p;
}


int main()
{
    Stu *student = NULL;

    Stu *man = NULL;
    Stu *woman = NULL;

    man = ass(man,"qq",10);
    man = ass(man,"ww",13);
    man = ass(man,"ee",15);
    woman = ass(woman,"rr",11);
    woman = ass(woman,"tt",14);
    woman = ass(woman,"yy",9);

    student = connect(man,woman);

    display(student);

    printf("********************************************\n");
    
    student = rank(student);

    display(student);

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

    student = revese(student);
    display(student);

    return 0;
}

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

#include <stdio.h>      
#include <stdlib.h>
#include <string.h>

typedef struct node
{
    int age;
    char name[20];
    struct node *next;
    struct node *prior;
}Stu;

Stu *ass(Stu *p,char name[],int age)
{
    Stu *t = (Stu*)malloc(sizeof(Stu));
    strcpy(t->name,name);
    t->age = age;
    if(NULL == p)
    {
        t->next = NULL;
        t->prior = NULL;
        p = t;
        return p;
    }
    t->prior = NULL;
    t->next = p;
    p->prior = t;
    p = t;
    return p;
}

void find(Stu *p)
{
    int a[100] = {0};
    Stu *t = p;
    int age;
    int i = 0;
    int j = 0;
    int m = 100;
    int flag = -1;
    int num;

    printf("Input the age to find:");
    scanf("%d",&age);

    while(t)
    {
        a[i] = (t->age)-age;
        t = t->next;
        while(a[i] != 0)
        {
            if(a[i] < 0)
            {
                a[i] = a[i] * flag;
            }
            i++;
        }
    }
    for(j = 0;j < i;j++)
    {
        if(a[j] < m)
        {
            m = a[j];
            num = j;
        }
    }
    t = p;
    for(j = 0;j < num;j++)
    {
        t = t->next;
    }
    printf("the best match student is:%s Age:%d\n",t->name,t->age);
    printf("年龄相差:%d\n",m);
}

void display(Stu *p)
{
    while(p)
    {
        printf("Name:%s Age:%d\n",p->name,p->age);
        p = p->next;
    }
}

int main()
{
    Stu *student = NULL;

    student = ass(student,"qq",12);
    student = ass(student,"ww",14);
    student = ass(student,"ee",16);
    student = ass(student,"rr",10);
    student = ass(student,"tt",9);
    student = ass(student,"yy",20);

    display(student);

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

    find(student);

    return 0;
}

### 查找或下载特定日期的 Visual C++ 版本 对于查找或下载指定日期如 2021年1月8日 的 Visual C++ 发行版,官方微软渠道通常不会提供基于具体日期的旧版本直接链接。然而,可以采取一些策略来获取接近该时间点发布的 Visual C++ Redistributable。 #### 方法一:通过 Microsoft 官方存档页面 访问 [Microsoft Visual C++ 可再发行包](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)[^1] 页面,在这里虽然无法精确到某一天的具体版本,但是可以选择不同年份对应的 Visual Studio 年度版本所附带的最新可再发行包。由于 Visual C++ 2015, 2017 和 2019 共享相同的可再发行文件,因此可以从这些版本中寻找最接近所需日期的更新。 #### 方法二:利用互联网档案馆 (Wayback Machine) 如果确实需要某个确切日期前后的版本,可以尝试使用 Internet Archive's Wayback Machine 工具回溯历史网页快照。输入目标网站URL(例如上述支持页面),选择靠近 2021年1月8日前后的时间戳查看当时可用的下载选项。 #### 方法三:社区资源与论坛求助 有时开发者社区和专业技术论坛上会有其他用户分享过类似的请求帮助帖或是个人备份资料。可以在 Stack Overflow 或 Reddit 等平台搜索相关话题,询问是否有人保存有那个时期的确切版本。 ```bash # 假设找到了合适的VC++红帽包下载地址,则可以直接wget命令下载 $ wget https://example.com/path/to/vcredist_x64.exe ``` 需要注意的是,出于安全性和兼容性的考虑,推荐总是使用来自微软官方网站或其他可信来源提供的软件分发包,并保持系统上的 VC++ 运行库处于最新的稳定状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值