C语言:使用链表实现的可变长度字符串处理函数

本文介绍了如何使用C语言的链表结构实现一个可变长度的字符串处理函数,包括输入字符串、释放内存、打印字符串、获取字符串长度等功能。此外,还提供了一个搜索子字符串位置的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//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;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值