男女生链表创建和合并

9 篇文章 0 订阅
9 篇文章 0 订阅

(1)编写create(n)函数,从控制台输入n个学生信息,根据性别存储为男生、女生两个链表,每个链表中的学生是按姓名升序排序的;

(2)编写merge()函数,将两个链表合并形成一个新链表,仍保持按姓名升序排序。

输入样例:

第一行输入学生数量;第二行开始,每行输入学生信息:姓名、性别和年龄。姓名长度小于20个字符;性别=1表示男生,=2表示女生;

8
liming 1 28
haoshu 2 27
zhaomo 1 26
zhanli 2 25
maomin 1 24
chenzi 2 23
wangli 1 22
pengmi 2 21

输出样例:

chenzi 2 23
haoshu 2 27
liming 1 28
maomin 1 24
pengmi 2 21
wangli 1 22
zhanli 2 25
zhaomo 1 26

 代码如下:

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

struct student
{
    char name[40];
    int sex,age;
    struct student *next;

};

struct student *insert(struct student **pp, struct student *pnew)
{
    struct student *pold,*p;
    //原链表为空 拷贝新创建的节点
     if(*pp == NULL)
    {
        *pp = pnew;
        return pnew;
    }


    //插入头节点前
    if((*pp) != NULL && strcmp((*pp) -> name, pnew -> name) > 0)
    {
        pnew -> next = *pp;
        *pp = pnew;
        return *pp;
    }//while

    //插入在中间
    pold = *pp;
    p = (*pp) -> next;
    while(p != NULL)
    {
        if(strcmp(pnew -> name, p -> name) > 0)
        {
            pold = p;
            p = p -> next;
        }//if
        else
        {
            pnew -> next = p;
            pold -> next = pnew;
            return *pp;
        }//else

    }//while

    //插入在尾节点后面
    while(p == NULL)
    {
        pold -> next = pnew;
        return *pp;
    }

}//insert

void create(int n,struct student **ppboys, struct student **ppgirls)
{
    struct student *pnew;
    int i = 0;
    //输入信息
    while(i < n)
    {
        i++;
        pnew = (struct student *)malloc(sizeof(struct student));
        pnew -> next = NULL;
        scanf("%s %d %d",pnew -> name, &pnew -> sex, &pnew -> age);

        //对男生排序
        if(pnew -> sex == 1)
        {
            *ppboys = insert(ppboys,pnew);//二级指针

        }//if

        //对女生排序
        if(pnew -> sex == 2)
        {
            *ppgirls = insert(ppgirls,pnew);

        }//if
    }//while
}

struct student *merge(struct student *pboys,struct student *pgirls)
{
    struct student *phead, *p;
    struct student *pb = pboys, *pg = pgirls;
    int compare = strcmp(pb -> name, pg -> name);

    if(compare > 0)
    {
        phead = pg;
        pg = pg -> next;
        p = phead;
    }
    else
    {
        phead = pb;
        pb = pb -> next;
        p = phead;
    }

    while(pb != NULL && pg != NULL)
    {//都非空时
        if(strcmp(pb -> name,pg -> name) > 0)
        {
            p -> next = pg;
            p = p -> next;
            pg = pg -> next;
        }//if
        else
        {
            p -> next = pb;
            p = p -> next;
            pb = pb -> next;
        }//else
    }//while

    if(pb != NULL && pg == NULL)
        p -> next = pb;

    if(pg != NULL && pb == NULL)
        p -> next = pg;

    return phead;
}//merge

/* 输出链表 */
void print(struct student *head)
{
    struct student *pnode = head;
    while(pnode != NULL){
        printf("%s %d %d\n", pnode->name, pnode->sex, pnode->age);
        pnode = pnode->next;
    }
}


int main()
{
    int n;
    scanf("%d", &n);
    struct student *pboys=NULL, *pgirls=NULL;
    struct student *pall;
    create(n, &pboys, &pgirls);

    // 用于测试男生、女生链表是否都有序了;
    printf("\n");
    print(pboys);
    printf("\n");
    print(pgirls);
    printf("\n");

    pall = merge(pboys, pgirls);
    printf("\n");
    print(pall);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值