某地区有两个地下党行动小组,分别为小组A与小组B。
每个小组有一个以上的成员,构成上下线关系。每一位成员都有自己的代号与等级。地下党基本上都是采取的单线联系,所以接触到的人只有一个或者两个,一个是上线一个是下线。级别较小的为上线。
例如地下党行动小组A的成员有:
狐狸 独狼 云雀 鼹鼠 飞鹰 杜鹃
1 3 7 9 10 11
另一个地下党行动小组B的成员有:
雪松 郁金香 茉莉 冷杉 丁香
2 4 5 6 8
那么杜鹃是飞鹰的下线、飞鹰是杜鹃的上线。但是鼹鼠和杜鹃有可能互不认识。因此鼹鼠的下线只有飞鹰。
给定成员的代号与等级,用 尾插法建立两个地下党行动小组的 双向链表。
要求给定一个组,一个成员名,可以输出该成员的下线。
输入
第1行是两个整数numA、numB,分别表示每个小组含有的成员个数;
接下来的2numA行由等级从低到高(从上线到下线)的顺序依次输入A小组每个成员的代号(字符串)与等级(整数);
接下来的2numB行由等级从低到高(从上线到下线)的顺序依次输入B小组每个成员的代号(字符串)与等级(整数);
接下来的1行输入一个字符c,c可以为'A'或'B',代表要检索哪个小组;
接下来的1行输入该小组成员的代号name,代表要检索该小组的哪个成员。
输出
输出结果有1行,分别为一个字符串+空格+整数值,字符串代表所要检索的成员下线的代号,数值代表该下线成员的等级。
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
struct DoubleNode;
typedef struct DoubleNode *PDoubleNode;
struct DoubleNode
{
char daihao[30];
int grade;
PDoubleNode llink,rlink;
};
typedef struct DoubleNode *PDoubleList;
PDoubleList createNulllist_link(void);//创建空表函数
void locate(PDoubleList pdlist);//查找并输出函数
int main()
{
int x,y,i;
PDoubleNode r,s;//A组的指针
PDoubleNode a,b;//B组的指针
PDoubleList pdlistA,pdlistB;//AB组的头指针 ,指向双链表头结点
scanf("%d%d",&x,&y);//输入A组B组的人数
pdlistA=createNulllist_link();
pdlistB=createNulllist_link();//创建AB组的空表
r=pdlistA;
for(i=0;i<x;i++){
s=(PDoubleNode)malloc(sizeof(struct DoubleNode));
if(s==NULL){
printf("out of space!\n");
return 0;
}
scanf("%s%d",s->daihao,&(s->grade));
r->llink=s;
s->rlink=r;
r=s;
}
s->llink=NULL;//A组尾插法建立双向链表
a=pdlistB;
for(i=0;i<y;i++){
b=(PDoubleNode)malloc(sizeof(struct DoubleNode));
if(b==NULL){
printf("out of space!\n");
return 0;
}
scanf("%s%d",b->daihao,&(b->grade));
a->llink=b;
b->rlink=a;
a=b;
}
b->llink=NULL;//B组尾插法建立双向链表
int order;
scanf("%d",&order);//输入序号 (???)
char group;
scanf("%c",&group); //输入组名
if(group=='A'){
locate(pdlistA);
}
else if(group=='B'){
locate(pdlistB);//查找并输出
}
system("pause");
return 0;
}
PDoubleList createNulllist_link(void){//创建空表函数
PDoubleList pdlist;//头结点指针
pdlist= (PDoubleList)malloc(sizeof(struct DoubleNode));//开出头结点
if(pdlist!=NULL)pdlist->llink=NULL;
return (pdlist);
}
void locate(PDoubleList pdlist){//查找并输出函数
char name[30];
scanf("%s",name);//输入代号
PDoubleNode p;
p=pdlist->llink;
while(p!=NULL&&strcmp(p->daihao,name)!=0){
p=p->llink;
}
if((p->llink)!=NULL)printf("%s %d",p->llink->daihao,p->llink->grade);
else printf("没有人");
}
这样写就是对的,但int order;
scanf("%d",&order);//输入序号 (???)
是我一开始看错了题写上去的,结果阴错阳差对了;
删去这两行就不对,请问是为什么?