PTA补题

翁恺老师实验课上没做出来的题
补完放到这里 铭记

1.一帮一

题目链接 https://pintia.cn/problem-sets/1098941609422696448/problems/1098944260419956736

题意:将名次最靠前的学生与名次最靠后的异性学生分为一组
代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
struct student{
	char name[15];//放名字 
	int x;//性别 
	int y;//排名 
}f[105];

void getstruct(struct student *p)
{
	scanf("%d",&p->x);
	scanf("%s",p->name);
}
int boy[105],girl[105];//建两个数组,一个按顺序存男生编号,一个存女生编号 注意:存编号~ 
int main()
{
	int N,t1=1,t2=1;
	scanf("%d",&N);
	for(int k=1;k<=N;k++)
	{
		getstruct(&f[k]);
		f[k].y=k;//y作为排名的记录 
	}
	for(int k=1;k<=N;k++)
	{
		if(f[k].x==0) 
			girl[t1++]=k;
		else 
			boy[t2++]=k;
	}
	for(int k=1;k<=N/2;k++)// 从前往后扫 是女孩从男孩后面娶一个 是男孩从女孩后面娶一个 
	{
		if(f[k].x==0){
			printf("%s %s\n",f[k].name,f[boy[t2-1]].name);
			t2--;
		}
		else{
			printf("%s %s\n",f[k].name,f[girl[t1-1]].name);
			t1--;
		}
	}

	return 0;
}

2.奇数值结点链表

题目链接 https://pintia.cn/problem-sets/1102533410432065536/problems/1102533710714871808

题意:把链表的奇数项串起来拿走,留下偶数项
代码:

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
     struct ListNode *p = L;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}
int main()
{
    struct ListNode *L, *Odd;
    L = readlist();
    Odd = getodd(&L);
    printlist(Odd);
    printlist(L);

    return 0;
}
struct ListNode *readlist(){
	struct ListNode* p,*tmp,*ans;
	p=(struct ListNode*)malloc(sizeof(struct ListNode));
	p->next=NULL;
	ans=p;
	int a;
	scanf("%d",&a);
	while(a!=-1)
	{
		tmp=(struct ListNode*)malloc(sizeof(struct ListNode));
		tmp->next=NULL;
		tmp->data=a;
		p->next=tmp;
		p=p->next;
		scanf("%d",&a);
	 } 
	 return ans;

}

struct ListNode *getodd( struct ListNode **L )//传入的是二级指针 取*后直接对原指针进行操作而不会复制原指针 
{
	struct ListNode *odd,*even,*tmp,*ansodd;//起名起的好看点 
	//留下偶数 串起来奇数
	 	odd=(struct ListNode*)malloc(sizeof(struct ListNode));
		odd->next=NULL;//odd作为奇数表的操作指针 
		even=(struct ListNode*)malloc(sizeof(struct ListNode));
		even=*L;//even作为偶数表的操作指针,表头还是L 
		ansodd=odd;//ansodd作为奇数表的表头,用于返回 
		while(even&&even->next)//注意只有even->next不行 debug时发现even最后变成NULL 没法再取next了 
		{
			while(even->next&&even->next->data%2==1){
				odd->next=even->next;
				odd=odd->next;
				even->next=odd->next;
			}//next不是NULL而且是奇数 就让odd的下一个指向奇数,odd转到下一个,even的next指向奇数的下一个,但even不转 连续的奇数排查完再移动 
			even=even->next;//移动even 往后走 
		}
		odd->next=NULL;//刚才没发现有这个bug!如果最后依然是偶数,odd最后不会指向NULL,会导致又把even接上了 比如1 2 2 2 -1 打印出1 2 2 2/n 2 2 2 
		*L=(*L)->next;//因为print函数直接打印,所以表头往后移一位 
		return ansodd->next;
}

3.用链表完成多项式运算

题目链接: https://pintia.cn/problem-sets/1116890088965287936/problems/1116890653602492416

代码:

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
typedef struct node
{   
  int coef;             /* 系数 */
  int exp;              /* 指数 */
  struct node *next;
} polynomial;

/* 提示:递交的答案将会自动插入此处 */
void sortpoly(polynomial* poly)//从小到大排序 冒泡排 
{
	polynomial* q,* p;
	//q=(polynomial*)malloc(sizeof(struct node));
	q=poly->next;
	if(q)p=q->next;
	while(q)
	{
		while(p)
		{
			if(q->exp<p->exp)
			{
				int tmp2;
				double tmp1;
				tmp1=q->coef;
				q->coef=p->coef;
				p->coef=tmp1;
				tmp2=q->exp;
				q->exp=p->exp;
				p->exp=tmp2;
			}
			p=p->next;
		}
		
		q=q->next;
		if(q)p=q->next;
	}
	//合并系数 
	polynomial* pp=poly->next;
	while(pp)
	{
		if(pp->next)
		{
			if(pp->exp==pp->next->exp)
			{
				polynomial*q=pp;
			    while(pp->next&&q->exp==pp->next->exp)
				  {
				  		pp=pp->next;		  	
				  		q->coef+=pp->coef; 
				  }
				  pp=pp->next;
				  q->next=pp; 
						
			}
		 	else pp=pp->next; 
		}
		else pp=pp->next;
		
	}
	//删除0项 
	polynomial* ppp=poly->next;
	while(ppp)
	{
		if(ppp->next==NULL&&ppp->coef==0)poly->next=NULL;
		else if(ppp->next&&ppp->next->coef==0)
		{
			polynomial* tmp=(polynomial*)malloc(sizeof(struct node));
			tmp=ppp->next;
			ppp->next=tmp->next;
			free(tmp);
		}
		if(ppp)ppp=ppp->next;
	}
	
}
void print_polynomial(polynomial * p)
{
	if(p->next)p=p->next;
	else{
		printf("0\n");
		return;
	} 
	if(p){
		if(p->coef!=-1&&p->coef!=1&&p->coef&&p->exp>1)printf("%dx^%d",p->coef,p->exp);
		else if(p->coef==1&&p->exp>1)printf("x^%d",p->exp);
		else if(p->coef==-1&&p->exp>1)printf("-x^%d",p->exp);
		else if(p->coef!=-1&&p->coef!=1&&p->exp==1)printf("%dx",p->coef);
		else if(p->coef==1&&p->exp==1)printf("x");
		else if(p->coef==-1&&p->exp==1)printf("-x");
		else if(p->exp==0)printf("%d",p->coef);	
		p=p->next;	
	}
	for(;p;p=p->next)
 	{
 		if(p->coef>1&&p->exp>1)
	  	     printf("+%dx^%d",p->coef,p->exp);
 		else if(p->coef>1&&p->exp==1)
			  printf("+%dx",p->coef);
 		else if(p->coef==1&&p->exp>1)
			  printf("+x^%d",p->exp);
 		else if(p->coef==1&&p->exp==1)
 			 printf("+x");
 		else if(p->coef<-1&&p->exp>1)
 			 printf("%dx^%d",p->coef,p->exp);
 		else if(p->coef<-1&&p->exp==1)
 			 printf("%dx",p->coef);
 		else if(p->coef==-1&&p->exp>1)
 			 printf("-x^%d",p->exp);
 		else if(p->coef==-1&&p->exp==1)
 			 printf("-x");
	    else if(p->exp==0)
	    {
	    	if(p->coef>0)printf("+%d",p->coef);
	    	else if(p->coef<0)printf("%d",p->coef);
		}
    }
    printf("\n");
}
polynomial *create_polynomial()
{
	polynomial *tmp,*ans,*p;
	int n,m1,m2;
	ans=(polynomial*)malloc(sizeof(polynomial));
	ans->next=NULL;//啊啊啊 
	p=ans;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d%d",&m1,&m2);
		tmp=(polynomial*)malloc(sizeof(polynomial));
		if(m1==0)continue;
		tmp->coef=m1;
		tmp->exp=m2;
		tmp->next=NULL;
		p->next=tmp;
		p=p->next; 
	}
	sortpoly(ans);
	return ans;
}
polynomial * add_polynomial(polynomial *p1,polynomial *p2)
{
	polynomial * p,*ans,*pp1,*pp2;
	pp1=p1->next;
	pp2=p2->next;
	p=(polynomial *)malloc(sizeof(struct node));
	p->next=NULL;
	ans=p;
	while(pp1&&pp2)
	{
		if(pp1->exp>pp2->exp){
			polynomial *tmp=(polynomial *)malloc(sizeof(struct node));
			tmp->next=NULL;
			tmp->coef=pp1->coef;
			tmp->exp=pp1->exp;
			p->next=tmp;
			p=p->next;
			pp1=pp1->next;
		}
		else if(pp1->exp<pp2->exp)
		{
		    polynomial * tmp=(polynomial *)malloc(sizeof(struct node));
			tmp->next=NULL;
			tmp->coef=pp2->coef;
			tmp->exp=pp2->exp;
			p->next=tmp;
			p=p->next;
			pp2=pp2->next;
		}
		else{
			polynomial * tmp=(polynomial *)malloc(sizeof(struct node));
			tmp->next=NULL;
			tmp->coef=pp1->coef+pp2->coef;
			tmp->exp=pp1->exp;
			if(tmp->coef){
				p->next=tmp;
				p=p->next;
				pp1=pp1->next;
				pp2=pp2->next; 
			}
			else {
				free(tmp);
			//	p=p->next;
				pp1=pp1->next;
				pp2=pp2->next; 
			}
		}
	}
	if(pp1)p->next=pp1;
	if(pp2)p->next=pp2;
	return ans;
}
polynomial *subtract_polynomial(polynomial *p1,polynomial *p2)
{
	polynomial * mp2,*ans;
	mp2=(polynomial *)malloc(sizeof(struct node));
	mp2->next=NULL;
	ans=mp2;
	if(p1->next==NULL&&p2->next==NULL)return ans;
	p2=p2->next;
	while(p2)
	{
		polynomial * tmp=(polynomial *)malloc(sizeof(struct node));
		tmp->next=NULL;
		tmp->coef=-p2->coef;
		tmp->exp=p2->exp;
		mp2->next=tmp;
		p2=p2->next;
		mp2=mp2->next;
	}
	
	return add_polynomial(p1,ans);
}
polynomial *multiply_polynomial(polynomial *p1,polynomial *p2)
{
	polynomial * phead,*p,*tmp,*pp1,*pp2,*ans,*pp2h;
	pp1=p1->next;
	pp2=p2->next;
	pp2h=pp2;
	p=(polynomial *)malloc(sizeof(struct node));
	p->next=NULL;
	ans=p;
	if(pp1==NULL||pp2==NULL)return p;
	while(pp2){
		polynomial * tmp=(polynomial *)malloc(sizeof(struct node));
		tmp->next=NULL;
		tmp->coef=pp1->coef*pp2->coef;
		tmp->exp=pp1->exp+pp2->exp;
		p->next=tmp;
		p=p->next;
		pp2=pp2->next;
	}
	pp1=pp1->next;
	while(pp1)
	{
		pp2=pp2h;
		while(pp2)
		{
			polynomial * tmp=(polynomial *)malloc(sizeof(struct node));
			tmp->next=NULL;
			tmp->coef=pp1->coef*pp2->coef;
			tmp->exp=pp1->exp+pp2->exp;
			polynomial * q1=ans,*q=q1->next;
			while(q&&q->exp>tmp->exp)
				{
					q=q->next;
					q1=q1->next;
				}
			if(q)
			{
				if(q->exp==tmp->exp){
					q->coef+=tmp->coef;
					if(q->coef){
						pp2=pp2->next;	
						continue;				
					}
					else{
						q1->next=q->next;
						free(q);
					}
				}
			else  {
				tmp->next=q->next;
				q->next=tmp;	//插入		
			}
			}
			else {
				if(tmp->coef)
				{
					p->next=tmp;
					p=p->next;
				}
			}
			pp2=pp2->next;		
		}
		pp1=pp1->next;
		 
	}
	return ans;
}

int main()
{
	polynomial *polyA,*polyB;     
	
	polyA=create_polynomial();  /* 其中函数create_polynomial()用于读入并创建多项式A的链表,请自行实现 */ 
	polyB=create_polynomial();  /* 读入并创建多项式B的链表 */
	printf("A=");
	print_polynomial(polyA);   /* 输出多项式A */
	printf("B=");
	print_polynomial(polyB);  /* 输出多项式B */
	printf("A+B=");
	print_polynomial(add_polynomial(polyA,polyB) );   
			 /* 输出多项式加A+B 的结果, 其中函数add_polynomial(polyA,polyB)将返回A+B的多项式,请自行实现*/ 
	printf("A-B=");
	print_polynomial(subtract_polynomial(polyA,polyB) ); 
			 /* 输出多项式减A-B 的结果,其中其中函数subtract_polynomial(polyA,polyB)返回A-B的多项式,请自行实现*/ 
	printf("A*B=");
	print_polynomial(multiply_polynomial(polyA,polyB));   
			 /* 输出多项式乘A*B 的结果,其中函数multiply_polynomial(polyA,polyB)返回A*B的多项式,请自行实现 */ 
	
	return 0;
}

4. 单链表分段逆转

题目链接:https://pintia.cn/problem-sets/1116890088965287936/problems/1116891504723243008
用链表写了好久没写出来,回去用数组很快就好了。。。

代码:

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

List ReadInput(); /* 裁判实现,细节不表 */
void PrintList( List L ); /* 裁判实现,细节不表 */
void K_Reverse( List L, int K );
List ReadInput()
{
	List ans,p,tmp;
	ans=(List)malloc(sizeof(struct Node));
	ans->Next=NULL;
	p=ans;
	int n;
	scanf("%d",&n);
	int m;
	for(int i=0;i<n;i++)
	{
		scanf("%d",&m);
		tmp=(List)malloc(sizeof(struct Node));
		tmp->Data=m;
		tmp->Next=NULL;
		p->Next=tmp;
		p=p->Next;
	}
	return ans;
}
void PrintList( List L )
{
	List p;
	p=L->Next;
	while(p)
	{
		printf("%d ",p->Data);
		p=p->Next;
	}
}
int main()
{
    List L;
    int K;

    L = ReadInput();
    scanf("%d", &K);
    K_Reverse( L, K );
    PrintList( L );

    return 0;
}
void K_Reverse( List L, int K )
{
    int a[100000],i=1;
	List p=L->Next;
	while(p)
	{
	 	a[i++]=p->Data;
	 	p=p->Next;
	} 
	int n=i;
	for(int i=1;i<n;i+=K)
	{
		if(i+K>n)break;
		for(int t=1;t<=K/2;t++)//K/2
		{
			int tmp=a[t+i-1];
			a[t+i-1]=a[K-t+i];
			a[K-t+i]=tmp;
		}
	}
	p=L->Next;
	for(int i=1;i<n;i++)
	{
		p->Data=a[i];
		p=p->Next;
	}
}

5.猴子选大王

linklist *CreateCircle( int n )
{
	int d;
	linklist *ans,*tmp,*h,*tail;
	ans=(linklist*)malloc(sizeof(linklist));
	ans->next=NULL;
	h=ans;
	for(int i=0;i<n;i++)
	{
		linklist* tmp=(linklist*)malloc(sizeof(linklist));
		scanf("%d",&tmp->mydata);
		tmp->number=i+1;
		tmp->next=NULL;
		ans->next=tmp;
		ans=ans->next;
	}
	tail=ans;
	tail->next=h->next;
	//ans->next=h->next;
	return ans;
}
linklist *DeleteNext(linklist *p)
{
	linklist*tmp=(linklist*)malloc(sizeof(linklist));
	tmp=p->next;
	printf("Delete No:%d\n",tmp->number);
	p->next=tmp->next;
	free(tmp);
}
int KingOfMonkey(int n,linklist *head)
{
	int k=1;
	int d=head->mydata;
	for(int i=0;i<n-1;)
	{
		if(k==d)
		{
			k=0;
			d=head->next->mydata;
			DeleteNext(head);
			//printf("%d",d);
			i++;
		}
		else head=head->next;
		k++;
	}
	return head->number;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值