C语言 链表的使用(创建学生链表,按年龄排序,逆序,查找与查询年龄最近的学生)

代码

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

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

struct Student
{
	char *name;
	int age;
	struct Student *next;
};

typedef struct Student Stu;
typedef Stu *Link;

void create_link(Link *head)
{
    *head = (Link)malloc(sizeof(Stu));
    (*head)->next = NULL;
}

void insert_node(Link newnode, Link *head)
{
    Link temp = *head;
	while (temp->next != NULL)
	{
		temp = temp->next;
    }
	temp->next=newnode;
	newnode->next=NULL;
}



void display_link(Link head)
{
    Link temp = head->next;

	while (temp != NULL)
	{
		printf("%s %d \n", temp->name,temp->age);
		temp = temp->next;
	}
	printf("\n");
}


void sort(Link *head)
{
	int i;
	int j;
	int n;
	int count = 0;			    
	Link p = *head;
	Link s = p->next;
	Link t = s->next;

	Link 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;
	}
}

void reverse_sort(Link *head)
{
	    Link p = *head;
		Link s = p->next;
		Link t = s->next;
	    Link temp = (*head)->next;
		while(t != NULL)
		{
			s->next = p;
		    p = s;
			s = t;
			t = t->next;
		}
		s->next = p;
		(*head)->next->next = NULL;
		(*head)->next = s;
}

void find_nearest(Link *head,Link *result,int age)
{
	int min;
	int MIN = 30;
	Link temp = (*head)->next;
	Link t = (*head)->next;
	
	//先找到与查询年龄相差最小的数值
	 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);

	//再遍历 找到所有年龄差符等于MIN的学生
	while(t != NULL)
	{
		if(((t->age) - age) >= 0)
		{
			min = (t->age) - age;
		}
		else
		{
			min = age - (t->age);
		}
		if(min == MIN)
		{
			Link find_stu = (Link)malloc(sizeof(Stu));
			find_stu->name = t->name;
			find_stu->age = t->age;
			insert_node(find_stu,&(*result));
		}
		t=t->next;
	}
}

int main()
{
	Link boy_head;
	Link girl_head;
	Link stu1,stu2;

	char *boy[5]={"Jack","Tom","Richard","Tomas","LiHua"};
	char *girl[5]={"Lily","Amily","Fairy","Mei","Dora"};

	int b[5]={18,20,19,21,20};
	int g[5]={19,20,20,21,19};

	
	create_link(&boy_head);
	create_link(&girl_head);

	for(int i=0;i<5;i++)
	{
		stu1 = (Link)malloc(sizeof(Stu));
		stu1->name=boy[i];
		stu1->age=b[i];
		insert_node(stu1, &boy_head);
	}
	for(int i=0;i<5;i++)
	{
		stu2 = (Link)malloc(sizeof(Stu));
		stu2->name=girl[i];
		stu2->age=g[i];
		insert_node(stu2,&girl_head);
	}
	printf("1. boy List:\n");
	display_link(boy_head);
	printf("1. girl List:\n");
	display_link(girl_head);

	
	printf("2. connect two Lists :\n");
	stu1->next=girl_head->next;
	display_link(boy_head);
	
	printf("2. age from young to old\n");
	sort(&boy_head);
	display_link(boy_head);

	printf("3. age from old to young\n");
	reverse_sort(&boy_head);
	display_link(boy_head);

	int age;
	printf("4. please input a age(18-21岁):\n");
	scanf("%d",&age);
	printf("4. Find the nearest student \n");
	Link result=(Link)malloc(sizeof(Stu));
	find_nearest(&boy_head,&result,age);
	display_link(result);

}

项目开发日报表

项目名称【苏嵌实训-嵌入式 linux C 第 6天】
今日进度 以及任务管理两个男生女生链表,实现 创建,合并,按年龄排序,逆序,查找与输入年龄差最小学生等功能
本日任务完成情况已实现此功能
本日开发中出现的问题汇总1.开始时结构体里名字的类型是数组,在主函数里定义的名字是指针数组,赋值时类型不匹配。2.在链表逆序和寻找年龄差最小时不太清楚算法。
本日未解决问题
本日开发收获了解了链表管理数据的存取的功能,学习了有表头单链表和无表头单链表的头插,尾插,中间插入和删除的操作方法
其他
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值