您的位置:首页 > 理论基础

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: