2016河南大学计算机硕士研究生复试上机考试第2题
2018-03-29 15:54
846 查看
(题目要求读入两个列表,我是写着玩,所以运行程序后需要自己输入两个字符串序列,输入方法为:输入一个字符串序列,回车,输入下一个序列,回车)
题目:若两个链表包含相同的项,项的顺序可不同,则它们被称为对方的排列(若一个列表中某一项有K个,则另一个列表中也应有K个)。如,列表<7e7q>和<qe77>互为排列,而<31425>和<53431>则不是
写一个程序,读入两个列表,判断它们是否为对方的排列
#include<iostream>
#define maxsize 100/*定义字符数组最大长度*/
using namespace std;
typedef struct node *List;/*指向结构体的指针*/
/*结构体*/
struct node{
char data;/*字符*/
int count;/*字符数目*/
List next;/*指针域*/
};
/*尾插法函数*/
void attach(List *rear/*实参应为要更改链表尾指针的地址*/,char n/*要插入结点的字符*/){
List a;
a=(List)malloc(sizeof(struct node));
a->count=1;
a->data=n;
a->next=NULL;/*定义一个节点,分配内存,初始化指针域,数据域*/
(*rear)->next=a;/*修改原尾结点指针域,指向要插入对位的结点*/
*rear=a;/*更改尾指针*/
}
/*从队头到队尾依次检查新字符是否在链表中出现,如果出现,修改对应字符节点的数目,没出现就插入队尾*/
void create(List ptrl,char n){
List P;
P=ptrl;
while(P){
if(P->data==n){
P->count++;
return;
}/*出现,修改对应字符节点数目*/
else {
if(P->next)
P=P->next;
else break;/*遍历整个链表依然没有出现,退出循环*/
}
}
attach(&P,n);/*将新字符插入链表*/
}
int main(){
int m;
List A,B,C;//39
char a[maxsize],b[maxsize];
char *str1,*str2;
gets(a);
gets(b);/*使用两个字符数组存储两个字符串*/
A=(List)malloc(sizeof(struct node));
B=(List)malloc(sizeof(struct node));
str1=&a[0];
str2=&b[0];
attach(&A,*str1);
str1++;
while(*str1!='\0'){
create(A,*str1);
str1++;
};
attach(&B,*str2);
str2++;
while(*str2!='\0'){
create(B,*str2);
str2++;
};/*将两个字符串插入链表*/
/*判断两个链表是否相同*/
while(A){
m=0;/*计数器,用来判断第一个链表中的一个字符是否出现在另一个链表中*/
C=B;/*遍历链表B*/
while(C){
if(A->data==C->data)/*B链表中存在与A链表相同的字符*/{
m--;
if(A->count==C->count)break;/*第一个链表中的一个元素在第二个链表中而且数目一样,直接退出,判断第一个链表的下一个元素*/
cout<<"NO"<<endl;/*相同字符的数目不相同,直接判定不同*/
return 0;
}
C=C->next;
}
if(m==0)/*第一个链表中存在一个元素,第二个链表中不存在,判定不同*/{
cout<<"NO"<<endl;
return 0;
}
A=A->next;
}
cout<<"YES"<<endl;/*整个循环比较完成,相同*/
return 0;
}
题目:若两个链表包含相同的项,项的顺序可不同,则它们被称为对方的排列(若一个列表中某一项有K个,则另一个列表中也应有K个)。如,列表<7e7q>和<qe77>互为排列,而<31425>和<53431>则不是
写一个程序,读入两个列表,判断它们是否为对方的排列
#include<iostream>
#define maxsize 100/*定义字符数组最大长度*/
using namespace std;
typedef struct node *List;/*指向结构体的指针*/
/*结构体*/
struct node{
char data;/*字符*/
int count;/*字符数目*/
List next;/*指针域*/
};
/*尾插法函数*/
void attach(List *rear/*实参应为要更改链表尾指针的地址*/,char n/*要插入结点的字符*/){
List a;
a=(List)malloc(sizeof(struct node));
a->count=1;
a->data=n;
a->next=NULL;/*定义一个节点,分配内存,初始化指针域,数据域*/
(*rear)->next=a;/*修改原尾结点指针域,指向要插入对位的结点*/
*rear=a;/*更改尾指针*/
}
/*从队头到队尾依次检查新字符是否在链表中出现,如果出现,修改对应字符节点的数目,没出现就插入队尾*/
void create(List ptrl,char n){
List P;
P=ptrl;
while(P){
if(P->data==n){
P->count++;
return;
}/*出现,修改对应字符节点数目*/
else {
if(P->next)
P=P->next;
else break;/*遍历整个链表依然没有出现,退出循环*/
}
}
attach(&P,n);/*将新字符插入链表*/
}
int main(){
int m;
List A,B,C;//39
char a[maxsize],b[maxsize];
char *str1,*str2;
gets(a);
gets(b);/*使用两个字符数组存储两个字符串*/
A=(List)malloc(sizeof(struct node));
B=(List)malloc(sizeof(struct node));
str1=&a[0];
str2=&b[0];
attach(&A,*str1);
str1++;
while(*str1!='\0'){
create(A,*str1);
str1++;
};
attach(&B,*str2);
str2++;
while(*str2!='\0'){
create(B,*str2);
str2++;
};/*将两个字符串插入链表*/
/*判断两个链表是否相同*/
while(A){
m=0;/*计数器,用来判断第一个链表中的一个字符是否出现在另一个链表中*/
C=B;/*遍历链表B*/
while(C){
if(A->data==C->data)/*B链表中存在与A链表相同的字符*/{
m--;
if(A->count==C->count)break;/*第一个链表中的一个元素在第二个链表中而且数目一样,直接退出,判断第一个链表的下一个元素*/
cout<<"NO"<<endl;/*相同字符的数目不相同,直接判定不同*/
return 0;
}
C=C->next;
}
if(m==0)/*第一个链表中存在一个元素,第二个链表中不存在,判定不同*/{
cout<<"NO"<<endl;
return 0;
}
A=A->next;
}
cout<<"YES"<<endl;/*整个循环比较完成,相同*/
return 0;
}
相关文章推荐
- 又一版 A+B 浙大计算机研究生复试上机考试-2008年
- 浙大计算机研究生复试上机考试-2010年
- 浙大计算机研究生复试上机考试-2010年 最短路径问题
- 算法之美——浙大计算机研究生复试上机考试-2009年
- Is It Symmetric 浙大计算机研究生保研复试上机考试-2011年
- 畅通工程 hdu 1863 最小生成树+并查集 浙大计算机研究生复试上机考试-2007年
- 浙江大学计算机系硕士研究生复试题目解答(1)
- 浙大研究生复试上机考试2005——畅通工程
- HDU1864-最大报销额-题意有问题-浙大计算机研究生复试上机考试-2007年
- 计算机研究生复试上机题目:顺时针螺旋矩阵简单实现
- hdu 3792-浙大计算机研究生保研复试上机考试-2011年
- 浙江大学计算机系硕士研究生复试题目解答(2)
- 012年全国硕士研究生考试复试分数线划定
- 浙大计算机研究生复试上机考试-2009年
- hdu 1881 毕业bg (01背包变形)浙大计算机研究生复试上机考试-2008年
- 浙大计算机研究生复试上机考试-2010年 zoj问题
- 浙大计算机研究生复试上机考试-2010年 .
- 北理工2012年计算机研究生复试上机题
- HDU1877 又一版A+B 浙大计算机研究生复试上机考试-2008年
- 2016年全国硕士研究生招生考试考生进入复试的初试成绩基本要求