7月10号作业

1、创建两个学生链表、含有姓名、年龄的信息,一个链表存放男生,一个链表存放女生
2、将上面两个链表合并,按学生的年龄进行排序,合成新的链表
3、将上题中 建立的链表进行反转,实现按年龄的逆序排列
4、在上面的实现的新链表中,给定一个年龄 ,迅速查找和该学生年龄最接近的学生姓名。


#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef struct student
{
	char name[20];
	int age;
	struct student *next;
};

typedef struct  student student;
typedef student * Link;

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

void insert_head_node(Link newnode,Link *head)
{
	newnode->next = *head;
	*head = newnode;
}

//初始化链表信息
void init_student(char *a,int age,Link *head)
{
	Link newnode = (Link )malloc(sizeof(student));
	strcpy(newnode->name,a);
	newnode->age = age;
	insert_head_node(newnode,&(*head));
}

//打印链表
void display_link(Link head)
{
	Link temp = head;
	while(temp != NULL)
	{
		printf("name = %s\tage = %d\n",temp->name,temp->age);
		temp = temp->next;
	}
}

//合并链表,并按年龄排序
Link merge(Link head_gril ,Link head_boy)
{
	Link temp_gril = head_gril;
	Link temp_boy = head_boy;
    if(temp_gril == NULL){
        return temp_boy;
    }
    if(temp_boy == NULL){
        return temp_gril;
    }
    if(temp_gril->age < temp_boy->age){
        temp_gril->next = merge(temp_gril->next,temp_boy);
        return temp_gril;
    }
    else{
        temp_boy->next = merge(temp_gril,temp_boy->next);
        return temp_boy;
    }
}

//反转链表
Link reverse(Link head)
{
	Link p;
    Link res = NULL;
	Link temp = head;

    while(temp){
        p = temp->next;
        temp->next = res;
        res = temp;
        temp = p;
    }
    return res;
}

//查找链表
void search(Link head,int age)
{
	Link temp = head;
	int age_1;
	int age_2;
	
	while(temp->next != NULL)
	{
		if(temp->age >= age && temp->next->age <= age)
		{
			age_1 = abs(temp->age - age);
			age_2 = abs(temp->next->age - age);
			if(age_1 <= age_2)
			{
				printf("name = %s ",temp->name);
				break;
			}
			else
			{
				printf("name = %s ",temp->next->name);
				break;
			}
		}	
		temp = temp->next;
	}
}

int main(int argc,char *argv[])
{
	int i = 0;

	Link head_girl;
	Link head_boy;
	Link res = NULL;

	create_link(&head_girl);
	create_link(&head_boy);
	if(NULL == head_girl || NULL == head_boy)
	{
		printf("init link success!\n");
	}
	else
	{
		printf("init link failed!\n");
	}
	
	//初始化链表信息
	init_student("girl_1",22,&head_girl);
	init_student("girl_2",18,&head_girl);
	init_student("girl_3",14,&head_girl);
	init_student("boy_1",20,&head_boy);
	init_student("boy_2",16,&head_boy);
	init_student("boy_3",12,&head_boy);
	
	//打印链表
	printf("Link_girl:\n");
	display_link(head_girl);
	printf("Link_boy:\n");
	display_link(head_boy);
	printf("\n\n");

	//合并链表
	res = merge(head_girl,head_boy);
	printf("Link_merge:\n");
	display_link(res);
	printf("\n\n");

	//反转链表
	res = reverse(res);
	printf("Link_reverse:\n");
	display_link(res);
	printf("\n\n");

	//查找链表
	search(res,20);
	printf("\n\n");

	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值