C语言:使用链表实现的可变长度字符串处理函数
2013-04-13 11:18
555 查看
//unlimitedstr.h
struct usrstr
{
char str;
struct usrstr * next;
struct usrstr * back;
};
struct usrstr * inputstr();
int releasestr(struct usrstr *);
int printstr(struct usrstr *);
int printextstr(char *,struct usrstr *,char *);
//unlimitedstr.c
#include<stdio.h>
#include<stdlib.h>
#include"unlimitedstr.h"
//function : return a usrstr * ,it is a head of double link list which contains the user input string.
struct usrstr * inputstr()
{
char c;
int i;
struct usrstr * headstr;
struct usrstr * usrcpnow;
struct usrstr * usrcpnext;
headstr=(struct usrstr *)malloc(sizeof(struct usrstr));
if(headstr==NULL)
return NULL;
headstr->back=NULL;
usrcpnow=headstr;
for(i=0;(c=getchar())!=’\n’;i++)
{
usrcpnow->str=c;
usrcpnext=(struct usrstr *)malloc(sizeof(struct usrstr));
usrcpnow->next=usrcpnext;
usrcpnext->back=usrcpnow;
usrcpnow=usrcpnext;
}
usrcpnow->next=NULL;
usrcpnow->str=”;
return headstr;
}
//this function is used to release the double Link list which contains the string.
int releasestr(struct usrstr * headstr)
{
struct usrstr * temp;
while(temp!=NULL)
{
temp=headstr->next;
free(headstr);
headstr=temp;
}
return 0;
}
int printstr(struct usrstr * headstr)
{
struct usrstr * usrcpnow=headstr;
while(usrcpnow->next!=NULL)
{
putchar(usrcpnow->str);
usrcpnow=usrcpnow->next;
}
return 0;
}
int printextstr(char * str1,struct usrstr * headstr,char * str2)
{
struct usrstr * usrcpnow=headstr;
printf("%s",str1);
while(usrcpnow->next!=NULL)
{
putchar(usrcpnow->str);
usrcpnow=usrcpnow->next;
}
printf("%s",str2);
return 0;
}
int getstrlen(struct usrstr * headstr)
{
int length=0;
struct usrstr * temp=headstr;
while(temp->next!=NULL)
{
length++;
temp=temp->next;
}
return length;
}
//main.c
#include "unlimitedstr.h"
#include<stdio.h>
#include<stdlib.h>
int k,i,substrlen,charlen;
int flag=1;
typedef struct usrstr * strnode;
int work(strnode,strnode,strnode *);
strnode first,second;
//实现了搜索子字符串位置的功能
int main()
{
strnode strcp1,strcp2;
strnode strcpnow=NULL;
int temp;
printf("input first string :");
first=inputstr();
//printf("\n");
printf("input second string :");
second=inputstr();
strcp1=first;
strcp2=second;
while(getstrlen(strcp1)-getstrlen(strcp2)>=0)
{
if(strcp1->str==strcp2->str) //first char match, we should go to recurve
{
temp=work(strcp1,strcp2,&strcpnow);
if(temp==1)//match key and exit loop
{
printf("find the substring,position:%d\n",getstrlen(first)-getstrlen(strcpnow)-getstrlen(second)+1);
strcp1=strcpnow;
continue;
//break;
}
else //dismatch key , move cp to new position and continue
{
strcp1=strcpnow;
continue;
}
}
else //first char dismatch, compare to the next char
{
strcp1=strcp1->next;
continue;
}
}
releasestr(first);
releasestr(second);
system("pause");
return 0;
}
int work(strnode strcp1,strnode strcp2,strnode * strcpnow)
{
if(strcp2->next==NULL) // last char compare
{
(*strcpnow)=strcp1;
return 1; //match the key;
}
if((strcp1->str)==(strcp2->str))
{
strcp1=strcp1->next;
strcp2=strcp2->next;
work(strcp1,strcp2,strcpnow);
}
else
{
(*strcpnow)=strcp1;
return 0;
}
}
struct usrstr
{
char str;
struct usrstr * next;
struct usrstr * back;
};
struct usrstr * inputstr();
int releasestr(struct usrstr *);
int printstr(struct usrstr *);
int printextstr(char *,struct usrstr *,char *);
//unlimitedstr.c
#include<stdio.h>
#include<stdlib.h>
#include"unlimitedstr.h"
//function : return a usrstr * ,it is a head of double link list which contains the user input string.
struct usrstr * inputstr()
{
char c;
int i;
struct usrstr * headstr;
struct usrstr * usrcpnow;
struct usrstr * usrcpnext;
headstr=(struct usrstr *)malloc(sizeof(struct usrstr));
if(headstr==NULL)
return NULL;
headstr->back=NULL;
usrcpnow=headstr;
for(i=0;(c=getchar())!=’\n’;i++)
{
usrcpnow->str=c;
usrcpnext=(struct usrstr *)malloc(sizeof(struct usrstr));
usrcpnow->next=usrcpnext;
usrcpnext->back=usrcpnow;
usrcpnow=usrcpnext;
}
usrcpnow->next=NULL;
usrcpnow->str=”;
return headstr;
}
//this function is used to release the double Link list which contains the string.
int releasestr(struct usrstr * headstr)
{
struct usrstr * temp;
while(temp!=NULL)
{
temp=headstr->next;
free(headstr);
headstr=temp;
}
return 0;
}
int printstr(struct usrstr * headstr)
{
struct usrstr * usrcpnow=headstr;
while(usrcpnow->next!=NULL)
{
putchar(usrcpnow->str);
usrcpnow=usrcpnow->next;
}
return 0;
}
int printextstr(char * str1,struct usrstr * headstr,char * str2)
{
struct usrstr * usrcpnow=headstr;
printf("%s",str1);
while(usrcpnow->next!=NULL)
{
putchar(usrcpnow->str);
usrcpnow=usrcpnow->next;
}
printf("%s",str2);
return 0;
}
int getstrlen(struct usrstr * headstr)
{
int length=0;
struct usrstr * temp=headstr;
while(temp->next!=NULL)
{
length++;
temp=temp->next;
}
return length;
}
//main.c
#include "unlimitedstr.h"
#include<stdio.h>
#include<stdlib.h>
int k,i,substrlen,charlen;
int flag=1;
typedef struct usrstr * strnode;
int work(strnode,strnode,strnode *);
strnode first,second;
//实现了搜索子字符串位置的功能
int main()
{
strnode strcp1,strcp2;
strnode strcpnow=NULL;
int temp;
printf("input first string :");
first=inputstr();
//printf("\n");
printf("input second string :");
second=inputstr();
strcp1=first;
strcp2=second;
while(getstrlen(strcp1)-getstrlen(strcp2)>=0)
{
if(strcp1->str==strcp2->str) //first char match, we should go to recurve
{
temp=work(strcp1,strcp2,&strcpnow);
if(temp==1)//match key and exit loop
{
printf("find the substring,position:%d\n",getstrlen(first)-getstrlen(strcpnow)-getstrlen(second)+1);
strcp1=strcpnow;
continue;
//break;
}
else //dismatch key , move cp to new position and continue
{
strcp1=strcpnow;
continue;
}
}
else //first char dismatch, compare to the next char
{
strcp1=strcp1->next;
continue;
}
}
releasestr(first);
releasestr(second);
system("pause");
return 0;
}
int work(strnode strcp1,strnode strcp2,strnode * strcpnow)
{
if(strcp2->next==NULL) // last char compare
{
(*strcpnow)=strcp1;
return 1; //match the key;
}
if((strcp1->str)==(strcp2->str))
{
strcp1=strcp1->next;
strcp2=strcp2->next;
work(strcp1,strcp2,strcpnow);
}
else
{
(*strcpnow)=strcp1;
return 0;
}
}
相关文章推荐
- 字符串处理函数strlen、strcpy、strcat、strcmp和convert的C语言实现
- C++不使用变量求字符串长度strlen函数的实现方法
- 【C语言】编写一个函数reverse_string(char * string)(递归实现),将参数字符串中的字符反向排列,不能使用C函数库中的字符串操作函数。
- 用C语言编写函数,实现strlen计算字符串长度的功能
- 【C语言】编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。要求:不能使用C函数库中的字符串操作函数。
- 【Python_Demo_1】使用Python实现C语言中sprintf()格式化字符串写入函数
- C语言实现常见的字符串处理函数
- C语言字符串处理函数的实现
- C语言--字符串处理函数的使用
- 用c语言实现求一个字符串长度的函数
- 【c语言】实现一个函数,求字符串的长度
- C语言中字符串处理函数实现(部分)
- C语言中求字符串长度的函数的几种实现方法
- PHP - Manual手册 - CLXI. String 字符串处理函数 - str_pad使用另一个字符串将一个字符串填充到指定长度
- 【c语言】实现一个函数,求字符串的长度,不允许创建第三方变量
- 【c语言】编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数
- C语言 不使用strcpy 函数实现字符串复制功能
- C语言字符串处理函数原型实现
- C语言 编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数。
- C语言实现求字符串的长度,不使用库函数