• 数据结构之链串


    数据结构之链串

    #include <stdio.h>
    #include <malloc.h>
    typedef struct snode 
    {	
    	char data;
    	struct snode *next;
    } LinkStrNode;
    void StrAssign(LinkStrNode *&s,char cstr[])
    {
    	int i;
    	LinkStrNode *r,*p;
    	s=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	r=s;						//r始终指向尾结点
    	for (i=0;cstr[i]!='';i++) 
    	{	p=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		p->data=cstr[i];
    		r->next=p;r=p;
    	}
    	r->next=NULL;
    }
    void DestroyStr(LinkStrNode *&s)
    {	LinkStrNode *pre=s,*p=s->next;	//pre指向结点p的前驱结点
    	while (p!=NULL)					//扫描链串s
    	{	free(pre);					//释放pre结点
    		pre=p;						//pre、p同步后移一个结点
    		p=pre->next;
    	}
    	free(pre);						//循环结束时,p为NULL,pre指向尾结点,释放它
    }
    void StrCopy(LinkStrNode *&s,LinkStrNode *t)	//串t复制给串s
    {
    	LinkStrNode *p=t->next,*q,*r;
    	s=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	r=s;						//r始终指向尾结点
    	while (p!=NULL)				//将t的所有结点复制到s
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL;
    }
    bool StrEqual(LinkStrNode *s,LinkStrNode *t)	//判串相等
    {
    	LinkStrNode *p=s->next,*q=t->next;
    	while (p!=NULL && q!=NULL && p->data==q->data) 
    	{	p=p->next;
    		q=q->next;
    	}
    	if (p==NULL && q==NULL)
    		return true;
    	else
    		return false;
    }
    int StrLength(LinkStrNode *s)	//求串长
    {
    	int i=0;
    	LinkStrNode *p=s->next;
    	while (p!=NULL) 
    	{	i++;
    		p=p->next;
    	}
    	return i;
    }
    LinkStrNode *Concat(LinkStrNode *s,LinkStrNode *t)	//串连接
    {
    	LinkStrNode *str,*p=s->next,*q,*r;
    	str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	r=str;
    	while (p!=NULL)				//将s的所有结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	p=t->next;
    	while (p!=NULL)				//将t的所有结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL;
    	return str;
    }
    LinkStrNode *SubStr(LinkStrNode *s,int i,int j)	//求子串
    {
    	int k;
    	LinkStrNode *str,*p=s->next,*q,*r;
    	str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	str->next=NULL;
    	r=str;						//r指向新建链表的尾结点
    	if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
    		return str;				//参数不正确时返回NULL 
    	for (k=0;k<i-1;k++)
    		p=p->next;
    	for (k=1;k<=j;k++) 			//将s的第i个结点开始的j个结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL;
    	return str;
    }
    LinkStrNode *InsStr(LinkStrNode *s,int i,LinkStrNode *t)		//串插入
    {
    	int k;
    	LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;
    	str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	str->next=NULL;
    	r=str;								//r指向新建链表的尾结点
    	if (i<=0 || i>StrLength(s)+1)		//参数不正确时返回空串
    		return str;
    	for (k=1;k<i;k++)					//将s的前i个结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	while (p1!=NULL)					//将t的所有结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p1->data;
    		r->next=q;r=q;
    		p1=p1->next;
    	}
    	while (p!=NULL)						//将结点p及其后的结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL;
    	return str;
    }
    LinkStrNode *DelStr(LinkStrNode *s,int i,int j)	//串删去
    {
    	int k;
    	LinkStrNode *str,*p=s->next,*q,*r;
    	str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	str->next=NULL;
    	r=str;						//r指向新建链表的尾结点
    	if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
    		return str;				//参数不正确时返回空串
    	for (k=0;k<i-1;k++)			//将s的前i-1个结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	for (k=0;k<j;k++)				//让p沿next跳j个结点
    		p=p->next;
    	while (p!=NULL)					//将结点p及其后的结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL;
    	return str;
    }
    LinkStrNode *RepStr(LinkStrNode *s,int i,int j,LinkStrNode *t)	//串替换
    {
    	int k;
    	LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;
    	str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    	str->next=NULL;
    	r=str;							//r指向新建链表的尾结点
    	if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
    		return str;		 			//参数不正确时返回空串
    	for (k=0;k<i-1;k++)  			//将s的前i-1个结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;q->next=NULL;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	for (k=0;k<j;k++)				//让p沿next跳j个结点
    		p=p->next;
    	while (p1!=NULL)				//将t的所有结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p1->data;q->next=NULL;
    		r->next=q;r=q;
    		p1=p1->next;
    	}
    	while (p!=NULL)					//将结点p及其后的结点复制到str
    	{	q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    		q->data=p->data;q->next=NULL;
    		r->next=q;r=q;
    		p=p->next;
    	}
    	r->next=NULL;
    	return str;
    }
    void DispStr(LinkStrNode *s)	//输出串
    {
    	LinkStrNode *p=s->next;
    	while (p!=NULL)
    	{	printf("%c",p->data);
    		p=p->next;
    	}
    	printf("
    ");
    }
    int main()
    {    
        LinkStrNode *s,*s1,*s2,*s3,*s4;
        StrAssign(s,"abcdefghrfghijklmn");	 
        StrAssign(s1,"xyz");
        DispStr(s);
        printf("%d
    ",StrLength(s));
        s2=InsStr(s,9,s1);
    	DispStr(s2);
    	s2=DelStr(s,2,5);
    	DispStr(s2);
    	s2=RepStr(s,2,5,s1);
    	DispStr(s2);
    	s3=SubStr(s,2,10);
    	DispStr(s3);
    	s4=Concat(s1,s2);
    	DispStr(s4);
    	DestroyStr(s);
    	DestroyStr(s1);
    	DestroyStr(s2);
    	DestroyStr(s3);
    	DestroyStr(s4);
    }
    	 
    
  • 相关阅读:
    17点50分系列-如何平静的工作
    Java之简单的聊天工具
    伪分布式环境下命令行正确运行hadoop示例wordcount
    Linux 从 sar 到 sar2html 的认识
    telnet简单操作 模拟请求
    3D跑酷游戏《月影忍者之疾风狂逃》
    [每日一题] OCP1z0-047 :2013-07-24 子查询――外查询与内查询的执行顺序
    思科27亿美元收购网络安全公司Sourcefire
    利用Format函数格式化时间和日期
    HI3531网络tftp、nfs加载 分类: arm-linux-Ubuntu HI3531 2014-01-03 09:11 826人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/AmosAlbert/p/12832344.html
Copyright © 2020-2023  润新知