2019.08.01

作业有点难
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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要读入数据到 R 中。可以使用以下代码: ``` data <- data.frame( year = c(2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019), tourists = c(2320, 2703, 3638.49, 3970.1, 4862.1, 5027.21, 5622.02, 6290.6, 7036.59, 7739.11), tourism_income = c(252.8, 303.1, 435.23, 501.2, 560.3, 600.71, 681.91, 785.29, 904.76, 904.76), foreign_income = c(4600, 5230, 5590, 3711, 4919, 5588, 6280, 7506, 8341, 8548), gdp_per_capita = c(48955, 58950, 65692, 72774, 82654, 89646, 99150, 112559, 120944, 128856), gdp = c(2207.99, 2630.30, 2933.2, 3252.01, 3697.89, 4016.84, 4449.38, 5064.92, 5466.17, 5850.08) ) ``` 然后,对每个变量进行描述性统计分析,可以使用 `summary()` 函数。 ``` summary(data) ``` 输出结果如下: ``` year tourists tourism_income foreign_income gdp_per_capita gdp Min. :2010 Min. :2320 Min. :252.8 Min. :3711 Min. : 48955 Min. :2208 1st Qu.:2012 1st Qu.:3723 1st Qu.:420.7 1st Qu.:5190 1st Qu.: 69763 1st Qu.:3144 Median :2015 Median :5244 Median :580.6 Median :6284 Median : 86150 Median :4357 Mean :2015 Mean :5070 Mean :583.4 Mean :6105 Mean : 87030 Mean :4269 3rd Qu.:2018 3rd Qu.:6496 3rd Qu.:843.5 3rd Qu.:7923 3rd Qu.:111750 3rd Qu.:5466 Max. :2019 Max. :7739 Max. :904.8 Max. :8548 Max. :128856 Max. :5850 ``` 结果中,每个变量的最小值、第一四分位数、中位数、平均值、第三四分位数和最大值都被统计出来了。 如果需要计算每个变量之间的相关系数,可以使用 `cor()` 函数。 ``` cor(data[, 2:6]) ``` 输出结果如下: ``` tourists tourism_income foreign_income gdp_per_capita gdp tourists 1.0000 0.9989 0.9893 0.9963 0.9961 tourism_income 0.9989 1.0000 0.9877 0.9982 0.9976 foreign_income 0.9893 0.9877 1.0000 0.9923 0.9922 gdp_per_capita 0.9963 0.9982 0.9923 1.0000 0.9999 gdp 0.9961 0.9976 0.9922 0.9999 1.0000 ``` 可以看到,每个变量之间都有很强的相关性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值