您的位置:首页 > 其它

判断两个循环链表内容是否相等

2017-09-20 23:51 411 查看
问题描述:循环链表首尾相连都有头结点,然而在很多时候,当两个循环链表长度相等且构成环以后,可能在内容上完全相等,然而若从头结点开始看这两个循环链表可能不能对应相等。此处给出判断两个循环链表内容是否相等的方法。

然而还有通常做法中从首字母开始比一直到结束看是否相等,然而当待比较的字符串含有多个基准字符串的首字母时,也应从待比字符串多处地方依次比较。

演示图例1



演示图例2



演示图例3



#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Lnode //定义链表结点的数据结构
{
char data;
struct Lnode *next;
}node;
node *create()//尾插法构建循环链表不带头结点
{   char x;
node *h, *t;
t = h = (node *)malloc(sizeof(node));
h->next = NULL;

scanf("%c", &x);
while (x !='#')
{
node *s = (node *)malloc(sizeof(node));
s->data = x;
s->next = h->next;
t->next = s;
t = s;
scanf("%c", &x);
}
t->next=h->next;//尾和head->next相连
return h->next;//不带头结点
}
int compare(node *A,node*B)
{
node *p=A;
node *tem;
node *q=B;
int i=0;
int flag=0;
while(1)
{
if(q->data!=p->data)
q=q->next;//找到B中与A首字符相等的字符位置
if(q==tem)//如果试图找出B中每个与A首字符相等时其后所构成的字符串与A比较失败后,B循环一遍后又回到最初开始比较的位置,则整个比较失败,返回失败。
return false;
if(q->data==p->data)
while(1)
{
if(p->data!=q->data)
{i++;
if(i==1)
q=tem;//tem记录第一次找到B中与A首字符相等的字符位置
flag=1;//其后试图第二次找到B中与A首字符相等的字符位置
break;
}
p=p->next;
q=q->next;
if(p==A)//如果A链表循环一遍到头值后也未发现不相等的字符则成功
return true ;
}
if(flag==1)
{
p=A;flag=0;//试图第二次找到B中与A首字符相等的字符位置时让p指向A的头重新与A进行比较
}
}
}
int main(void)
{
printf("请输入两个字符串以分别以#号结束") ;
node *a=create();
node *b=create();
if(compare(a,b))
printf("两个字符串循环相等为同内容循环链表");
else
printf("两个字符串不循环相等为不同内容循环链表");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息