zoukankan      html  css  js  c++  java
  • 数据结构之链串

    数据结构之链串

    #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);
    }
    	 
    
  • 相关阅读:
    System.Environment.GetFolderPath函数中未开放的枚举参数
    如何获得TextBox里光标位置
    c#中用windows api函数修改内存数据
    C#客户端绑定DataView和DataTable的几个技巧
    如何锁定windows系统以及调用其它系统对话框
    c#中拖动图片的例子
    php数据库操作类mysql
    二级下拉关联菜单 js
    服务器端用 mysql_real_escape_string 清洁客户端数据
    心电正常值范围
  • 原文地址:https://www.cnblogs.com/AmosAlbert/p/12832344.html
Copyright © 2011-2022 走看看