翁恺老师实验课上没做出来的题
补完放到这里 铭记
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;
}