(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;
}