代码
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.在链表逆序和寻找年龄差最小时不太清楚算法。 |
本日未解决问题 | |
本日开发收获 | 了解了链表管理数据的存取的功能,学习了有表头单链表和无表头单链表的头插,尾插,中间插入和删除的操作方法 |
其他 |