33,311
社区成员
发帖
与我相关
我的任务
分享
/*列:链表一“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;
}
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);