12.26 training5中

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值