1、题目:创建两个学生链表,含有姓名、年龄的信息,一个链表存放男生,一个链表存放女生
2、题目:将上面两个链表合并,按学生的年龄进行排序,合成新的链表
3、题目:将上题中建立的链表进行反转,实现按年龄的逆序排列
4、题目:在上面的实现的新链表中,给定一个年龄,迅速查找和该学生年龄最接近的学生姓名
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 3
struct node
{
char name[30];
int age;
struct node * next;
struct node * prior;
};
typedef struct node Node;
typedef struct node* Link;
void create_node(Link *node) //创建结点
{
*node = (Link)malloc(sizeof(Node));
if(*node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_link(Link *head) //创建链表
{
create_node(head);
(*head)->prior = (*head)->next = *head;
}
void insert_node_tail(Link head,Link new_node) //尾插
{
new_node->next = head;
new_node->prior = head->prior;
head->prior = new_node;
new_node->prior->next = new_node;
}
void display_link(Link head) //输出
{
Link p;
if(head == NULL)
{
printf("no such link!\n");
return;
}
p = head->next;
if(p == NULL)
{
printf("link is empty!\n");
return;
}
while(p != head)
{
printf("%d\t%s\n",p->age,p->name);
p = p->next;
}
}
void display_link_inv(Link head) //逆序输出
{
Link p;
if(head == NULL)
{
printf("no such link!\n");
return;
}
p = head->prior;
if(p == NULL)
{
printf("link is empty!\n");
return;
}
while(p != head)
{
printf("%d\t%s\n",p->age,p->name);
p = p->prior;
}
}
void merge_link(Link head,Link boy,Link girl) //合并链表
{
Link p,q;
p = boy->next;
//将boy链表加到head中去
head->next = p;
head->prior = boy->prior;
p->prior = head;
head->prior->next = head;
//将girl链表加入
q = head->prior;
head->prior->next = girl->next;
head->prior = girl->prior;
head->prior->next = head;
girl->next->prior = q;
}
int get_length(Link head) //计数
{
int count = 0;
Link p;
if(head == NULL)
{
printf("no such link!\n");
return;
}
p = head->next;
while(p != head)
{
count++;
p = p->next;
}
return count;
}
void exchange(Link head,int length)
{
Link p = head;
Link q = p->next;
Link m = q->next;
int i,j;
for(i = 1;i < length;i++)
{
for(j = 0;j < length - i;j++)
{
if(q->age > m->age)
{
q->next = m->next;
q->prior = m;
p->next = m;
m->next->prior = q;
m->next = q;
m->prior = p;
q = m;
m = p->next->next;
}
p = p->next;
q = q->next;
m = m->next;
}
p = head;
q = p->next;
m = q->next;
}
}
void sort_link(Link head) //排序
{
int length = get_length(head);
exchange(head,length); //冒泡交换结点
}
void search_name(Link head) //查找
{
int age;
printf("输出要查找的大概年龄:\n");
scanf("%d",&age);
Link p;
p = head->next;
if(p == NULL)
{
printf("link is empty!\n");
return;
}
while(p != head && fabs(p->age - age) <= 5)
{
printf("%s\n",p->name);
p = p->next;
}
}
int main()
{
Link boy = NULL;
Link girl = NULL;
Link b = NULL;
Link g = NULL;
//创建链表
create_link(&boy);
create_link(&girl);
int i;
for(i = 1;i < N;i++)
{
//分配新的结点空间
create_node(&b);
create_node(&g);
printf("第%d个男生年龄姓名:",i);
scanf("%d%s",&b->age,&b->name);
printf("第%d个女生年龄姓名:",i);
scanf("%d%s",&g->age,&g->name);
//尾插
insert_node_tail(boy,b);
insert_node_tail(girl,g);
}
display_link(boy);
display_link(girl);
printf("\n");
Link head = NULL;
create_link(&head);
merge_link(head,boy,girl); //合并链表
display_link(head);
printf("\n");
sort_link(head); //排序
display_link(head);
printf("\n");
display_link_inv(head); //逆序输出
search_name(head); //查找年龄相近的人
return 0;
}
6、题目:实现一个函数,把两个从大到小的有序链表合并成一个链表,新的链表是一个从小到大的有序链表。
可以分成两个思路:
(1)先把两个链表合并成一个链表,合并后的链表从大到小排序
(2)将链表逆置,得到从小到达排序的链表
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct node
{
int num;
struct node * prior;
struct node * next;
};
typedef struct node Node;
typedef struct node* Link;
void create_node(Link *node)
{
*node = (Link)malloc(sizeof(Node));
if(*node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_link(Link *head)
{
create_node(head);
(*head)->prior = (*head)->next = *head;
}
void insert_node_sort(Link head,Link new_node) //边插入边排序
{
Link p,q;
p = head->next;
q = head;
while(p != head && p->num > new_node->num)
{
q = p;
p = p->next;
}
new_node->next = p;
new_node->prior = p->prior;
p->prior = new_node;
new_node->prior->next = new_node;
}
void display_link(Link head)
{
Link p;
if(head == NULL)
{
printf("no such link!\n");
return;
}
p = head->next;
if(p == NULL)
{
printf("link is empty!\n");
return;
}
while(p != head)
{
printf("%d\t",p->num);
p = p->next;
}
}
void display_link_inv(Link head) //逆序输出
{
Link p;
if(head == NULL)
{
printf("no such link!\n");
return;
}
p = head->prior;
if(p == NULL)
{
printf("link is empty!\n");
return;
}
while(p != head)
{
printf("%d\t",p->num);
p = p->prior;
}
}
void merge_link(Link head,Link a,Link b) //合并链表
{
Link p,q;
p = a->next;
q = b->next;
head->next = p;
head->prior = p->prior->prior;
p->prior = head;
head->prior->next = head;
b->prior->next = head;
q->prior = head->prior;
q->prior->next = q;
head->prior = b->prior;
}
int get_length(Link head) //得到结点个数
{
Link p;
int count = 0;
if(head == NULL)
{
printf("no such link!\n");
return;
}
p = head->next;
if(p == NULL)
{
printf("no node!\n");
return;
}
while(p != head)
{
count++;
p = p->next;
}
return count;
}
void exchange(Link head,int length)
{
Link p = head;
Link q = p->next;
Link m = q->next;
int i,j;
for(i = 1;i < length;i++)
{
for(j = 0;j < length - i;j++)
{
if(q->num < m->num)
{
q->next = m->next;
q->prior = m;
p->next = m;
m->next->prior = q;
m->next = q;
m->prior = p;
q = m;
m = p->next->next;
}
p = p->next;
q = q->next;
m = m->next;
}
p = head;
q = p->next;
m = q->next;
}
}
void bubber_sort(Link head) //冒泡
{
int length = get_length(head);
exchange(head,length); //冒泡交换
}
int main()
{
srand((unsigned)time(NULL));
Link A = NULL;
Link B = NULL;
Link a = NULL;
Link b = NULL;
create_link(&A);
create_link(&B);
int i;
for(i = 0;i < 5;i++)
{
create_node(&a);
create_node(&b);
a->num = rand() % 100;
b->num = rand() % 100;
insert_node_sort(A,a); //边插入边排序
insert_node_sort(B,b);
}
display_link(A);
printf("\n");
display_link(B);
printf("\n");
Link head;
create_link(&head);
merge_link(head,A,B); //合并链表
display_link(head);
printf("\n");
bubber_sort(head); //冒泡排序
display_link(head);
printf("\n");
display_link_inv(head); //逆序输出
printf("\n");
return 0;
}