【数据结构】(c语言)链式串的实现

链式串的定义

跟链表一样

typedef struct node
{
	char data;
	struct node *next;
} linkstrnode;

操作实现

尾插法建立单链表

void strcreate(linkstrnode **S)
{
	char ch;
	linkstrnode* p;
		linkstrnode*r;   //p用来生成新节点
	*S = NULL; r = NULL;  //r是尾结点,S指向头节点,
	r = *S;				  //开始是r和S是同一个节点
	while ((ch = getchar()) != '\n')
	{
		p = (linkstrnode *)malloc(sizeof(linkstrnode));
		p->data = ch;     //产生新结点
		if (*S == NULL) /*新结点插入空表*/
			*S = p;
		else r->next = p;
		r = p;
	} /*处理表尾结点指针域*/
	if (r != NULL)  r->next = NULL;
}

输出单链表的内容

void outlinkstring(linkstrnode* head)
{
	linkstrnode *p;
	p = head;
	while (p)
	{
		printf("%c-->", p->data);
		p = p->next;
	}
	printf("\n");
}

将串T插入到串S中第i个字符之前

void strinsert(linkstrnode**S, int i, linkstrnode* T)
{
	int k;
	linkstrnode* p;
	linkstrnode* q;
	p = *S, k = 1;
	while (p && k < i - 1)
	{
		p = p->next;
		k++;
	}
	if (!p) printf("error\n");
	else
	{		
		q = T;
		
		while (q->next) q = q->next;
		q->next = p->next;
		p->next = T;
	}
}

删除串s中第i个字符后的len个字符

void strdelete(linkstrnode* *S, int i, int len)
{
	int k;
	linkstrnode* p;
	linkstrnode* q;
	linkstrnode* r;
	p = *S, q = null; k = 1;
	while (p && k < i)
	{
		q = p; p = p->next; k++;
	}
	if (!p) printf("error1\n");
	else
	{
		k = 1;
		while (k < len && p)
		{
			p = p->next; k++;
		}
		if (!p)  printf("error2\n");
		else
		{
			if (!q) { r = *S; *S = p->next; }
			else
			{
				r = q->next; q->next = p->next;
			}
			p->next = null;
			while (r != null)
			{
				p = r; r = r->next; free(p);
			}
		}
	}
}

串的连接

void strconcat(linkstrnode**S1, linkstrnode* S2)
{
	linkstrnode* p;
	if (!(*S1))
	{
		*S1 = S2; 
		return;
	}
	else
		if (S2)
		{
			p = *S1;
			while (p->next) p = p->next; 
			p->next = S2;		
		}	
}

求子串

linkstrnode* substring(linkstrnode* S, int i, int len)
//此过程里r保存的是子串信息,p是主串信息,t是取到的每个结点的信息临时保存,
{
	int k;   //计数器
	linkstrnode* p;
	linkstrnode* q;
	linkstrnode* r;
	linkstrnode* t;
	p = S;
	k = 1;
	while (p && k < i) { p = p->next; k++; } //将p的指针定位到第i个结点
	if (!p) { 
		printf("empty error\n"); 
		return(null); 
	}
	else{
		r = (linkstrnode*)malloc(sizeof(linkstrnode));
		r->data = p->data; 
		r->next = null;   //把第i个结点赋值给r
		k = 1; //计数器归1
		q = r;//r和q指向同一个地址
		while (p->next  && k < len)   
		{
			p = p->next; 
			k++;
			t = (linkstrnode*)malloc(sizeof(linkstrnode));
			t->data = p->data; 
			q->next = t;  
			q = t;   
		}
		if (k < len) { 
			printf("len error\n"); 
			return(null); 
		}else
		{
			q->next = null; 
			return(r);   
		}
	}
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值