这题的意思是 第一行输入首地址 、N、K 下面接着N行,每行包括首地址、数字、尾地址,首地址对应前一个元素的尾地址, 注意这里不一定是按顺序来的 所以需要你自己排好,然后把从第一个开始,每K个为一组,按顺序将每一组倒序输出,********注意输出后的首地址和尾地址也要前后对应*********
这题我写了整整一天 脑子都要炸了 。。。
代码修修补补终于还是ac了。
但是改了这么多次之后可读性变的非常差,我自己都不想看- - 我是用链表写的 听说用顺序表写会简单很多,下次有时间再用顺序表写一遍吧!溜了溜了,头都要炸了。。。
我的方法是读入数据之后排序排好,然后根据K将链表中的前K个放入堆栈,放完K个之后输出,再放入,循环,直到放完了
其实有很多细节也要注意
轻喷 0.0
惨不忍睹的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node *List;
List Head;
char a[10];
int N,K;
struct Node{
char head[10];
int num;
char end[10];
List next;
};
List read(){ //读入数据 返回链表的首地址
List head,p;
head=(List)malloc(sizeof(struct Node));
head->next=NULL;
p=head;
scanf("%s %d %d",a,&N,&K);
while(N--){
char l[10],r[10];
int num;
scanf("%s %d %s",l,&num,r);
List tmp=(List)malloc(sizeof(struct Node));
tmp->next=NULL;
strcpy(tmp->head,l);
tmp->num=num;
strcpy(tmp->end,r);
p->next=tmp;
p=p->next;
}
return head;
}
void Print(List L){ //输出链表
L=L->next;
while(L){
printf("%s %d %s\n",L->head,L->num,L->end);
L=L->next;
}
}
void sort(List L){ //给链表按顺序排好
List left,last,the;
left=L;
the=L->next;
last=L;
while(the){ //先排第一个
if(strcmp(the->head,a)==0){
if(last==L) //已经是第一位 不用换位置
break;
else{ //排到第一位
last->next=the->next;
the->next=left->next;
left->next=the;
break;
}
}else{
last=last->next;
the=the->next;
}
}
left=left->next;
while(strcmp(left->end,"-1")!=0){ //排之后的
last=left;
the=left->next;
while(the){
if(strcmp(the->head,left->end)==0){
if(last==left){
left=left->next;
break;
}else{
last->next=the->next;
the->next=left->next;
left->next=the;
left=left->next;
break;
}
}else{
last=last->next;
the=the->next;
}
}
}
free(left->next); //这里要注意把排不进去的结点删掉 不然之后会把这些无关的节点也输出
left->next=NULL;
return;
}
void push(List L,List ele){ //将排好的链表放入堆栈中
List tmp;
tmp=(List)malloc(sizeof(struct Node));
*tmp=*ele; //注意结构体赋值
tmp->next=L->next;
L->next=tmp;
return;
}
void pop(List L){ //从堆栈中输出
if(L->next==NULL)
return;
List r=L->next;
printf("%s %d %s\n",r->head,r->num,r->end);
L->next=r->next;
return;
}
int main(){
int i=0,j;
Head=read();
sort(Head);
List zhan;
zhan=(List)malloc(sizeof(struct Node));
zhan->next=NULL;
Head=Head->next;
List done=Head;
while(Head){
// for(i=0;i<K;i++){
// push(zhan,Head);
// Head=Head->next;
// }
push(zhan,Head);
Head=Head->next;
i++;
if(i==K){
List S;
S=zhan->next;
while(S->next!=NULL){
List SS=S->next;
strcpy(S->end,SS->head);
S=S->next;
}
if(S->next==NULL&&Head!=NULL){
List cycle=Head;
for(j=1;j<K;j++){
if(cycle!=NULL){
cycle=cycle->next;
}else
break;
}
if(cycle==NULL)
strcpy(S->end,Head->head);
else
strcpy(S->end,cycle->head);
}
if(Head==NULL)
strcpy(S->end,"-1");
done=Head;
while(i--)
pop(zhan);
i=0;
}
}
while(done){
printf("%s %d %s\n",done->head,done->num,done->end);
done=done->next;
}
return 0;
}