急求用单链表查找链表中的某些字符串和另一个链表相等的字符串

fsagd 2009-12-08 01:45:20
列:链表一“abg gaa acd gad"
链表二"adagd abg adfg aga"
空白处为空格在链表二中有“abg”字符串与链表一中相同
我又下面的程序,但是不知道什么地方出啦问题
#include<iostream>
typedef struct pointer{
char dat;
struct pointer *link;
}pointer;
void bingNum(pointer *head1,pointer *head2,int m,int n);
//输入链表
int readdata(pointer *head){
pointer *p;
char tmp;
int i=1;
printf("input data:\n"); //只能输入如"abg dgc aga!"的字符串
scanf("%c",&tmp);
if(tmp==NULL) i=0;
else while(tmp!='!')
{
if(tmp==' ') i++;
p=(pointer *)malloc(sizeof(struct pointer));
p->dat=tmp;
p->link=head->link;
head->link=p;
scanf("%c",&tmp);
}
cout<<"集合的元素数:"<<i<<endl;
return i;
}
void disp(pointer *head){
pointer *p;
p=head->link;
printf("{");
while(p!=NULL)
{
if(p->dat!=' '){
printf("%c",p->dat);
p=p->link;}
else{
p=p->link;
printf(",");}
}
printf("}");
printf("\n");
}
void bingNum(pointer *head1,pointer *head2,int m,int n)
{
pointer *p1,*p2;
int k=m,j=n,i=0,l=k+j-i,c=0;
p1=head1->link;
p2=head2->link;
while(p1!=NULL&&p2!=NULL)
{
if(p1->dat!=p2->dat)
l--;
while(p1!=NULL&&p2!=NULL){
p1=p1->link;p2=p2->link;
if(p1->dat==' '&&p2->dat==' ')
{p1=p1->link;p2=p2->link;break;}
}
}
cout<<l<<endl;
}

void main()
{
pointer *head1,*head2;
int n1,n2;
head1=(pointer *)malloc(sizeof(struct pointer));
head1->link=NULL;
head2=(pointer *)malloc(sizeof(struct pointer));
head2->link=NULL;
printf("输入集合1:\n");
n1=readdata(head1);
printf("输入集合2:\n");
n2=readdata(head2);
printf("\n集合1为:\n");
disp(head1);
printf("\n集合2为:\n");
disp(head2);
bingNum(head1,head2,n1,n2);
}

...全文
359 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
200303148 2009-12-12
  • 打赏
  • 举报
回复
正在研究,先领个非技术分。
200303148 2009-12-12
  • 打赏
  • 举报
回复

/*列:链表一“abg gaa acd gad"
链表二"adagd abg adfg aga"
空白处为空格在链表二中有“abg”字符串与链表一中相同
我又下面的程序,但是不知道什么地方出啦问题 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 20

struct string;
typedef struct string * PString;
typedef struct string{
char dat[N]; // 楼主题目是以两个空格之间的字符串为单位进行比较,所以一个链表节点存放一个字符串效果好一些,而用一个节点存储一个字符比较麻烦
。PString link;
}string;



//输入链表
void readdata(PString head) {
PString pre, p = (PString)malloc(sizeof(string));
char tmp = '\0';
int i; -
pre = head;

printf("input data:\n"); //只能输入如"abg dgc aga!"的字符串
for( i=0; tmp !='!';) {
scanf("%c",&tmp);
if( tmp ==' ') { 如果遇到空格,表示本次字符串(pre指向的节点)储存完毕,新建一个节点存储下一个字符串,新建节点link为NULL
pre->dat[i] = '\0';
p->link = pre->link;
pre->link = p;
pre = p;
p = (PString)malloc(sizeof(string));
i = 0; //i置0,准备存储新的字符串
}
else {
pre->dat[i] = tmp; //没遇到空格,继续存储本次的
i++;
}-
}
pre->dat[i-1] = '\0'; //遇到!时循环结束,还没有给它加结束符,且最后一个字符串的下标i多加了1,所以要进行这步操作。
}

/*按两个空格之间的字符串为单位,进行比较,遍历head链表,与head1中第一个字符串比较,有就打印出来。然后再遍历head2,
与第一个链表中第二个字符串比较……直到比较完毕,这样1个空格之间的两个字符串都相等的情况,也能顺利打印出来*/
void comparedata(PString head1, PString head2)
{
int i;
PString p1 = head1;
PString p2;
for ( ; p1 != NULL; p1=p1->link)
for( p2 = head2; p2 != NULL; p2 = p2->link) {
i = 0;
while ( (p1->dat)[i] == (p2->dat)[i] && (p1->dat[i]) != '\0' && (p2->dat[i]) != '\0' )
++i;
if ( (p1->dat)[i] == '\0' && (p1->dat)[i] == '\0' ) //while语句比较字符串是否相等。该处用strcmp函数会得到错误结果,还没仔细看。
printf("%s ", p2->dat); /*每个相等的字符串之后打印了一个空格,这会使最后一个相等的字符后也有空格,所以
在下面打印一个退格符,去掉最后那个空格,但是如果没有相等的字符串会产生什么后果呢…… */
}
printf("\b");
}



int main()
{
PString head1 = (string *)malloc(sizeof(string));
PString head2 = (string *)malloc(sizeof(string));
head1->link = NULL;
head2->link = NULL;
readdata(head1);
getchar(); //消耗回车符
readdata(head2);
printf("read done\n");
comparedata(head1,head2);
return 0;
}



楼主给分吧,让我从0到1的质变。还有你的风格比较混乱,也没用到c++的什么东西,我就用c了。
200303148 2009-12-12
  • 打赏
  • 举报
回复

/*列:链表一“abg gaa acd gad"
链表二"adagd abg adfg aga"
空白处为空格在链表二中有“abg”字符串与链表一中相同
我又下面的程序,但是不知道什么地方出啦问题 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 20

struct string;
typedef struct string * PString;
typedef struct string{
char dat[N]; // 楼主题目是以两个空格之间的字符串为单位进行比较,所以一个链表节点存放一个字符串效果好一些,而用一个节点存储一个字符比较麻烦
。PString link;
}string;



//输入链表
void readdata(PString head) {
PString pre, p = (PString)malloc(sizeof(string));
char tmp = '\0';
int i; -
pre = head;

printf("input data:\n"); //只能输入如"abg dgc aga!"的字符串
for( i=0; tmp !='!';) {
scanf("%c",&tmp);
if( tmp ==' ') { 如果遇到空格,表示本次字符串(pre指向的节点)储存完毕,新建一个节点存储下一个字符串,新建节点link为NULL
pre->dat[i] = '\0';
p->link = pre->link;
pre->link = p;
pre = p;
p = (PString)malloc(sizeof(string));
i = 0; //i置0,准备存储新的字符串
}
else {
pre->dat[i] = tmp; //没遇到空格,继续存储本次的
i++;
}-
}
pre->dat[i-1] = '\0'; //遇到!时循环结束,还没有给它加结束符,且最后一个字符串的下标i多加了1,所以要进行这步操作。
}

/*按两个空格之间的字符串为单位,进行比较,遍历head链表,与head1中第一个字符串比较,有就打印出来。然后再遍历head2,
与第一个链表中第二个字符串比较……直到比较完毕,这样1个空格之间的两个字符串都相等的情况,也能顺利打印出来*/
void comparedata(PString head1, PString head2)
{
int i;
PString p1 = head1;
PString p2;
for ( ; p1 != NULL; p1=p1->link)
for( p2 = head2; p2 != NULL; p2 = p2->link) {
i = 0;
while ( (p1->dat)[i] == (p2->dat)[i] && (p1->dat[i]) != '\0' && (p2->dat[i]) != '\0' )
++i;
if ( (p1->dat)[i] == '\0' && (p1->dat)[i] == '\0' ) //while语句比较字符串是否相等。该处用strcmp函数会得到错误结果,还没仔细看。
printf("%s ", p2->dat); /*每个相等的字符串之后打印了一个空格,这会使最后一个相等的字符后也有空格,所以
在下面打印一个退格符,去掉最后那个空格,但是如果没有相等的字符串会产生什么后果呢…… */
}
printf("\b");
}



int main()
{
PString head1 = (string *)malloc(sizeof(string));
PString head2 = (string *)malloc(sizeof(string));
head1->link = NULL;
head2->link = NULL;
readdata(head1);
getchar(); //消耗回车符
readdata(head2);
printf("read done\n");
comparedata(head1,head2);
return 0;
}


楼主给分吧,让我从0到1的质变。
fsagd 2009-12-11
  • 打赏
  • 举报
回复
经典,还有解法不啊??
logiciel 2009-12-08
  • 打赏
  • 举报
回复

while(p1!=NULL&&p2!=NULL){
p1=p1->link;p2=p2->link; //如果执行了这2条语句后,p1或p2变成NULL,再执行以下语句就出错了
if(p1->dat==' '&&p2->dat==' ')
{p1=p1->link;p2=p2->link;break;}
}


改成以下试试:

    do
{
if(p1->dat==' '&&p2->dat==' ')
{
p1=p1->link;p2=p2->link;break;
}
p1=p1->link;p2=p2->link;
}while(p1!=NULL&&p2!=NULL);
mengde007 2009-12-08
  • 打赏
  • 举报
回复
百度LCS算法;
fsagd 2009-12-08
  • 打赏
  • 举报
回复
这个可是可以,但是如果这样的话,就不能比较在两个空格间的字符串是否相等啦...

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧