4.题目:将上题中建立的链表进行反转,实现按年龄的逆序排列(带表头节点)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
char name[20];
char age[20];
struct node *next;
};
typedef struct node Node;
typedef struct node *link;
void create_link_man(link * head1)
{
*head1 = (link)malloc(sizeof(Node));
link p, q;
p = q = *head1;
int i;
printf("请输入男生信息:1 or 0?\n");
scanf("%d",&i);
getchar();
while(i)
{
p = (link)malloc(sizeof(Node));
printf("请输入男生的姓名:\n");
gets(p->name);
printf("请输入男生的年龄:\n");
gets(p->age);
q->next = p;
q=p;
scanf("%d",&i);
getchar();
}
q->next = NULL;
}
void create_link_woman(link * head2)
{
*head2 = (link)malloc(sizeof(Node));
link p, q;
p = q = *head2;
int i;
printf("请输入女生信息:1 or 0?\n");
scanf("%d",&i);
getchar();
while(i)
{
p = (link)malloc(sizeof(Node));
printf("请输入女生的姓名:\n");
gets(p->name);
printf("请输入女生的年龄:\n");
gets(p->age);
q->next = p;
q=p;
scanf("%d",&i);
getchar();
}
q->next = NULL;
}
void combine_link( link *head1, link *head2)
{
link p, p1, q;
p = *head1;
q = *head2;
if( p == NULL)
{
printf("link is empty!\n");
return;
}
p =(*head1)->next;
if( q == NULL)
{
printf("link is empty!\n");
return;
}
while( p != NULL)
{
p1 = p;
p = p->next;
}
p1->next = q->next;
free(q);
}
void bubble_node(link head)
{
if(head == NULL)
{
printf("link is empty!\n");
return;
}
if(head->next == NULL)
{
return;
}
link p,p1,p2,p3,end,temp;
p = head->next;
end = NULL;
temp = NULL;
while( p != end )
{
for(p1=head,p2=p1->next,p3=p2->next;p3 != end;p1=p1->next,p2=p1->next,p3 = p2->next)
{
if(strcmp(p2->age, p3->age)>0)
{
p2->next = p3->next;
p1->next = p3;
p3->next = p2;
temp = p2;
p2 = p3;
p3 = temp;
}
}
end = p2;
}
}
void reversal_link(link head)
{
link p , p1, p2, p3, q;
p = p1 = p2 = p3 = head;
if(p == NULL)
{
printf("link is empty!\n");
return ;
}
q = head->next;
if(p->next == NULL)
{
return ;
}
p1 = p->next;
if( p1->next == NULL)
{
return ;
}
p2 = p1->next;
if( p2->next == NULL)
{
p2->next = p1;
head->next = p2;
p1->next = NULL;
return;
}
p3 = p2->next;
while(p3->next != NULL)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p3->next = p2;
p2->next = p1;
head->next = p3;
q->next = NULL;
}
void display_link(link head)
{
link p;
p=head;
if(p == NULL)
{
printf("link is empty!\n");
}
else
{
p = head->next;
if(p != NULL)
{
printf("链表:\n");
}
while(p != NULL)
{
printf("\t姓名:%s\t\t年龄:%s\t\t\n",p->name,p->age);
p=p->next;
}
}
}
void release_link(link * head)
{
link p, q;
p = q = *head;
if(p == NULL)
{
printf(" link is empty!\n");
}
else
{
p = p->next;
while(p != NULL)
{
q->next = p->next;
free(p);
p = p->next;
}
free(*head);
*head = NULL;
}
}
int main()
{
link head1=NULL, head2=NULL;
create_link_man(&head1);
create_link_woman(&head2);
display_link(head1);
printf("\n");
display_link(head2);
printf("\n");
combine_link(&head1,&head2);
bubble_node(head1);
display_link(head1);
reversal_link(head1);
display_link(head1);
release_link(&head1);
//release_link(&head2);
printf("\n");
display_link(head1);
//display_link(head2);
return 0;
}