c语言编写程序实现5,C语言编写程序

满意答案

dcebd7a0de6265b6ccae5ead692f1eab.png

gyimlb

2018.11.08

dcebd7a0de6265b6ccae5ead692f1eab.png

采纳率:58%    等级:13

已帮助:6096人

程序功能:录入N个字符串(动态内存申请,内存范围内不限长度个和字符个数)

输入一个字符串,查找是否有相同,有输出1,没有输出0。(先比较长度再比较内容)

字符串可以包含空格,代码我都详细备注了。

c5cea83b5be89cba9b45760444bc1a6f.png#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分享举报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值