满意答案
gyimlb
2018.11.08
采纳率:58% 等级:13
已帮助:6096人
程序功能:录入N个字符串(动态内存申请,内存范围内不限长度个和字符个数)
输入一个字符串,查找是否有相同,有输出1,没有输出0。(先比较长度再比较内容)
字符串可以包含空格,代码我都详细备注了。
#include
#include
#include
#include
typedef struct strList
{
char *s; //一行字符串首地址
int clo; //列数
struct strList *next; //链表指针
}STRL;
STRL *inputStr(STRL *strlHead,STRL *strlTail,int ff);
void prSTRL(STRL *strlHead);
int findSTRL(STRL *strlHead);
void meError(void *p);
int main()
{
STRL *strlHead=(STRL *)malloc(sizeof(STRL)),*strlTail=NULL;
meError(strlHead);
strlHead->next=NULL;
strlTail=inputStr(strlHead,strlTail,0);
printf("录入的字符串信息为:\n");
prSTRL(strlHead);
while(1)
printf("查找结果:%d\n\n",findSTRL(strlHead));
return 0;
}
void prSTRL(STRL *strlHead)//打印链表字符串
{
while(strlHead->next!=NULL)
{
printf("%s\n",strlHead->next->s);
strlHead=strlHead->next;
}
printf("\n");
}
int findSTRL(STRL *strlHead)//查找字符串,先比较长度,再比较内容,找到返回1,未找到返回0
{
int flag=0;
STRL sFindHead,*sFindTail=NULL;
sFindHead.s=NULL;
sFindHead.next=NULL;
sFindTail=inputStr(&sFindHead,sFindTail,1);
if(!sFindTail)
return 0;
while(strlHead->next!=NULL)
{
if(strlHead->next->clo==sFindTail->clo && !strcmp(strlHead->next->s,sFindTail->s))
{
flag=1;
break;
}
strlHead=strlHead->next;
}
free(sFindTail->s);
free(sFindTail);
return flag;
}
STRL *inputStr(STRL *strlHead,STRL *strlTail,int ff)
//ff!=1录入多行任意长度字符串,连续回车结束录入,返回尾节点
//ff==1录入单行任意长度字符串,返回尾节点
{
char *str=NULL,*temp=NULL,c;
int len,add,cnt,flag=1;//len:字符串预设长度(包含结束符号);add:长度增长值,cnt:实际录入的字符个数;flag=0结束录入
STRL *strlNew=NULL;
if(ff!=1)
printf("输入多行字符串(每输入一行回车确认,不输入直接回车结束录入):\n");
else
printf("输入要查找的字符串:\n");
while(flag)//换行
{
cnt=0;
len=10;
add=10;
str=(char *)malloc(sizeof(char)*len);
meError(str);
while(1)//输入一行
{
temp=NULL;
c=getch();
if(c=='\r' && cnt>0)
{
strlNew=(STRL *)malloc(sizeof(STRL));
meError(strlNew);
strlNew->s=str;
strlNew->clo=cnt;
strlNew->next=NULL;
if(ff==1)//单行录入模式
flag=0;
//保存录入并在多行模式下开始录入新的一行
if(!strlHead->next)
strlHead->next=strlNew;
else
strlTail->next=strlNew;
strlTail=strlNew;
printf("\n");
break;
}
if(c=='\r' && cnt==0)//结束录入
{
if(ff==1)
return NULL;
flag=0;
free(str);
break;
}
if(c!='\r' && cnt>=len-1)//一行字符串内存已满,扩充内存
{
len+=add;
temp=(char *)realloc(str,sizeof(char)*len);
meError(temp);
str=temp;
}
str[cnt++]=c;
str[cnt]=0;
printf("%c",c);
}
}
return strlTail;
}
void meError(void *p)//内存申请失败
{
if(p==NULL)
{
printf("异常:内存申请失败!回车结束程序!\n");
while(getch()!='\r');
exit(0);
}
}
00分享举报