为了方便,把ENQUEUE ,DEQUEUE,STOP分别设为整数的1,2,0
例如:
2
5 Anny Jack Jean Bill Jane
6 Eva Mike Ron Sony Geo Zoro
1 Anny
1 Eva
1 Jack
1 Jean
1 Bill
1Jane
2
2
1 Mike
1 Ron
2
2
2
2
0
#include
#include
#include
typedef struct Node{
int group;//记录属于哪个朋友组
char name[5];
struct Node* next;
}Node;//自己定义一个结点类型
struct Array{
char name[5];
int group;//记录属于哪个朋友组
};//用于存贮结果
struct arrname{
int group;//记录属于哪个朋友组
char name[5];
};//用于接收所有输入人的名字
int main()
{
int group;
char name[5];
scanf("%d",&group);//表示组数
Array *p=(Array*)malloc(group*sizeof(Array));//动态生成数组,得到结果
arrname *s=(arrname*)malloc(1000*group*sizeof(arrname));//记录所有名字和所在的组数
int pnum=0;//记录人的个数
int tag=1;//定义组数标号从1开始
int num;//得到某组人的个数
int k=0;//定义s组的下标,从0开始
for(int i=0;i
scanf("%d",&num);
for(int j=0;j
scanf("%s",name);
strcpy(s[k].name,name);
s[k].group=tag;
k++;//s的下标加1
}
pnum+=num;
tag++;//组数标号加1
}//存储名字和所在组数
int symbol;
Node* L=(Node*)malloc(sizeof(Node));//以链表的方式存储,L为头结点,程序运行时不改变
Node* move;//定义用来移动的指针
L->next=NULL;
k=0;//用于动态数组的存储标
int count=0;//记录出队列的人数
while(1)
{
scanf("%d",&symbol);//0表示退出,1表示进队列,2表示出队列
if(symbol==0) break;
else if(1==symbol)
{
scanf("%s",name);//得到进队列人的名字
for(int j=0;j
if(0==strcmp(name,s[j].name))//在s数组中得到该人的组数标号
break;
}//得到该人的组数标号
move=L;
while(move->next)
{
move=move->next;
}//将move移到链表的倒数第二位置
Node *elem=(Node*)malloc(sizeof(Node));//生成结点,用于存储进队人的信息
strcpy(elem->name,name);
elem->group=s[j].group;
move->next=elem;
elem->next=NULL;//将新增结点添加到链表的倒数第二
}
else
{
count++;//记录出队列的人数
Node* test;
test=L;
if(test->next)//如果链表不为空,则进行删除首结点和相关的朋友
{
int group=test->next->group;//得到首结点的组数标号
Node *freep;
while(test->next)//遍历整个链表,记录并删除朋友结点
{
if(group==test->next->group)
{
freep=test->next;
strcpy(p[k].name,freep->name);//记录结果
k++;
test->next=freep->next;
free(freep);//释放结点内存
continue;//这里很容易错误,不要忘了
}
if (!test->next) break;//如果链表空,结束while
test=test->next;//test后移
}
}
}
}
for(int j=0;j
return 0;
}
我是西电ACM新手...
好吧,我来个没用的回答.......
我知道我英语烂,你就不能翻译下么..........
这个问题我已经解决了