PTA 02-线性结构3 Reversing Linked List

这题的意思是 第一行输入首地址 、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;
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值