⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basicoperate.h

📁 用c语言编写的一个文本编辑器,实现编辑文字
💻 H
字号:
//基本操作



PBigStr create_nullstr(void)//创建空串(实质是创建一个空结点)
{
	PBigStr pstr;
	int i;
	pstr=(PBigStr)malloc(sizeof(struct BigStr));
	if (pstr==NULL)
		printf("Out of space!\n");
	else
	{//初始化空串
		pstr->pc=(char *)malloc(81*sizeof(char));//分配81个字符空间,留出一个位置存放\0结束符,免得处理中出现问题
		for (i=0;i<81;i++)
			pstr->pc[i]='\0';
		pstr->link=NULL;
	}
	return pstr;
}

PBigStr locate_line(int n,PBigStr pstr)//定位到第n-1行
{
	PBigStr node=pstr;
	int i=1;
	while (node!=NULL&&i<n-1)
	{
		node=node->link;
		i++;
	}
	if (node==NULL)
		return NULL;
	return node;
}

int insert_char(PBigStr pstr,char c)//从表中的最后插入一个字符
{
	PBigStr node=pstr;
	int i;
	if (pstr==NULL)
	{
		printf("Null String!\n");
		return 0;
	}
	else
	{
		while (node->link!=NULL)//定位到最后一个结点
			node=node->link;
		for (i=0;i<80;i++)
			if (node->pc[i]=='\0')
				break;//定位到最后一个字符
		if (c=='\n')//最后为换行的时候创建新结点
		{
			node->link=create_nullstr();
			if (node->link==NULL)
				return 0;
			else
				return 1;
		}
		if (i==80)//最后没空间存放字符的时候创建新结点
		{
			node->link=create_nullstr();
			if (node->link==NULL)
				return 0;
			else
			{
				node->link->pc[0]=c;
				node->link->pc[1]='\0';
				return 1;
			}
		}
		else
		{
			node->pc[i]=c;//最后还有空间存放的时候直接插入
			return 1;
		}
	}
}

PBigStr find_line(char *str,PBigStr node)//判断某行是否出现了特定字符串str,是的话返回原结点,否的话返回空结点
{
	int i,j,n,m;
	i=0;
	j=0;
	n=strlen(str);
	m=strlen(node->pc);
	while (i<n&&j<m)
		if (str[i]==node->pc[j])
		{
			i++;
			j++;
		}
		else
		{
			j=j-i+1;
			i=0;
		}
		if (i>=n)
			return node;
		else
			return NULL;
}

int index_line(char *big,char *small)//在big字符串中查找small字符串首次出现的首字符下标,失败则返回-1(有回溯) 
{
    int i=0, j=0;
	int p=strlen(small);
	int t=strlen(big);
    while (i<p&&j<t)  
        if (small[i]==big[j]) 
		{
            i++;
			j++;
        }        
        else 
		{ 
            j=j-i+1;
			i=0;
        }

    if (i>=p)
        return(j-p);
    else 
		return -1;   
}

char *back_insert_char(char *str,char c)//在字符串str的最后插入字符c
{
	int n=strlen(str);
	str=(char *)realloc(str,(n+2)*sizeof(char));//重新分配空间
	str[n]=c;
	str[n+1]='\0';//加入'\0'结束符保证字符串的合法性
	return str;
}

PBigStr insert_str(char *str,PBigStr node)//在表的最后插入字符串str
{
	int i=0;
	for (i=0;str[i]!='\0';i++)
		insert_char(node,str[i]);
	return node;
}

int *makenext(char *str)//计算next数组
{
	int i,k;
	int n=strlen(str);
	int *next=(int *)malloc(n*sizeof(int));
	k=-1;
	i=0;
	next[0]=-1;
	while (i<(n-1))
	{
		while (k>=0&&str[i]!=str[k])
			k=next[k];
		i++;
		k++;
		if (str[i]==str[k])
			next[i]=next[k];
		else
			next[i]=k;
	}
	return next;
}

int match(char *big,char *small)//无回溯的查找
{
	int i,j;
	int p=strlen(small);
	int t=strlen(big);
	int *next;
	next=makenext(small);
	i=0;
	j=0;
	while (i<p&&j<t)
		if (i==-1||small[i]==big[j])
		{
			i++;
			j++;
		}
		else
			i=next[i];
		if (i>=p)
			return (j-p);
		else
			return -1;
}

int calculate_line(PBigStr pstr)//计算总行数
{
	int n=1;
	PBigStr node;
	node=pstr;
	while (node!=NULL)
	{
		if (node->link==NULL)
		{
			n++;
			break;
		}
		else
		{
			n++;
			node=node->link;
		}
	}
	return n;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -