本文主要是介绍PTA 6-3 入侵者围剿第二关3情报解密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
经过上一步已经将2个分队得到的秘密情报合并到一起,并进行了信息去重。接下来,经过情报的分析,发现情报进行加密的方式,将链表从正中间断开,然后后面的链表全部接到前面,输出来的次序就是敌方的武器发射次序。
函数接口定义:
ptr encrypt(ptr head,ptr last,ptr s[]);
带头结点,head是头指针,last是尾指针,s是ptr类型的数组。为了对链表方便的取正中央位置,加了一个辅助数组(以空间换时间)。每遍历一个结点,把当前结点的地址存到数组s中,s的元素个数就是结点个数,s的元素值就是链表结点的地址
裁判测试程序样例:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct snode {
char name[10]; int age; int num;
struct snode *next; }node,*ptr;
ptr creat();//系统默认实现(上一步代码)
ptr add(ptr ha,ptr hb);//系统默认实现(上一步代码)
ptr output(ptr h);//系统默认实现,有返回值,返回尾结点的地址
ptr encrypt(ptr head,ptr last,ptr s[]);//答题者实现
ptr createnode(ptr p,ptr last);//系统实现(上一步代码)
void addremaining(ptr p,ptr q,ptr last);//系统实现(上一步代码)
int main() {
ptr h1,h2,h3,s[100]; h1=creat(); //
output(h1); h2=creat(); //
output(h2); h3=add(h1,h2);
ptr last3=output(h3);
last3=encrypt(h3,last3,s);
output(h3); return 0; }
ptr output(ptr h)//返回尾结点地址 {
ptr q,p; p=h->next;
while(p!=NULL) {
printf("%s %d %d; ",p->name,p->age,p->num);
q=p; p=p->next; }
printf("\n"); return q; }
ptr creat() { ptr head,tail,q;
char tname[10]; int tnum; int tage;
head=tail=(ptr)malloc(sizeof(node));
head->next=NULL;
scanf("%d%s%d",&tnum,tname,&tage);
while(tnum!=0) {
q=(ptr)malloc(sizeof(node));
strcpy(q->name,tname);
q->num=tnum;
q->age=tage;
tail->next=q;
q->next=NULL;
tail=tail->next;
scanf("%d%s%d",&tnum,tname,&tage); }
return head; }
/* 请在这里填写答案 */
输入样例1:
2 tom 22
4 jim 23
6 ho 21
0 0 0
1 lili 20
4 jim 23
7 bobo 19
9 fei 20
0 0 0
输出样例1:
lili 20 1; tom 22 2; jim 23 4; ho 21 6; bobo 19 7; fei 20 9;
ho 21 6; bobo 19 7; fei 20 9; lili 20 1; tom 22 2; jim 23 4;
6个结点,后三个结点断开,重串到链表的首部,画出示意图,再理清串接关系
代码实现:
ptr encrypt(ptr head, ptr last, ptr s[]) {int blacksheep=0;ptr p = head->next;while (p!= last) {s[blacksheep] = p;p = p->next;blacksheep++;}int mid = (blacksheep-1) / 2;p->next=NULL;head->next=s[mid+1];last->next=s[0];s[mid]->next=NULL;return head;
}
这篇关于PTA 6-3 入侵者围剿第二关3情报解密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!