您的位置:首页 > 编程语言 > C语言/C++

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐