/*假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,可共享相同的后缀存储空间。设str1和srt2分别
指向两个单词所在单链表的头结点,链表节点结构为data、next,请设计一个时间上尽可能高效的算法,找出由str1和str2
所指向两个链表共同后缀的起始位置。*/
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList tailInsertList(LinkList &L)
{
ElemType x;
L = (LinkList)malloc(sizeof(LNode));
LNode *r=L;
scanf("%d",&x);
while(x!=9999)
{
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
int getLenList(LinkList L)
{
LNode *p = L->next;
int len = 0;
while(p){
++len;
p = p->next;
}
return len;
}
//这里的共同后缀,我就返回较长的那个链所在的公共后缀的起始位置,因为我没有写共享存储。
LNode *findCommonStr(LinkList str1,LinkList str2)
{
int m,n;
LNode *p,*q;
m = getLenList(str1);
n = getLenList(str2);
for(p=str1;m>n;--m)
p = p->next;
for(q=str2;n>m;--n)
q = q->next;
while(p->next!=NULL && p->next->data!=q->next->data)
{
p = p->next;
q = q->next;
}
return p->next;
}
bool printList(LinkList L)
{
LNode *p = L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return true;
}
void main()
{
LinkList Str1,Str2;
LNode *t;
tailInsertList(Str1);
tailInsertList(Str2);
t = findCommonStr(Str1,Str2);
printf("%d %d\n",t->data,t->next->data);
}
寻找共享后缀初始结点
最新推荐文章于 2024-08-24 23:49:52 发布
该博客探讨了一种在带头结点的单链表中,通过比较两个单词链表来查找相同后缀的方法。它首先计算两个链表的长度,然后从较长的链表开始同步遍历,直到找到不匹配的字符或到达链表尾部。最后返回公共后缀的起始位置。算法注重效率,减少了不必要的比较。
摘要由CSDN通过智能技术生成