数据结构之链串的基本操作——C语言

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

typedef struct snode
{
	char data;
	struct snode * next;
}LiString;

void StrAssign(LiString *&s,char t[])   
{    	
	int i;
    LiString *r,*p;	/*r始终指向尾结点*/
    s=(LiString *)malloc(sizeof(LiString));
    r=s;
    for (i=0;t[i]!='\0';i++) 
	{     
		p=(LiString *)malloc(sizeof(LiString));
	    p->data=t[i];
		r->next=p;
		r=p;
	}
	r->next=NULL;
}

void StrCopy(LiString *&s,LiString *t)
{   	
	LiString *p=t->next,*q,*r;
    s=(LiString *)malloc(sizeof(LiString));
	r=s;			/*r始终指向尾结点*/
    while (p!=NULL)    	/*将t的所有结点复制到s*/
	{    
		q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
		r->next=q;
		r=q;
        p=p->next;
    }
	r->next=NULL;
}

int StrEqual(LiString *s,LiString *t)
{   	
	LiString *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 1;
    	else 
			return 0;
}

int StrLength(LiString *s)
{    
	int i=0;
    LiString *p=s->next;
    while (p!=NULL) 
    {     
		i++;
	    p=p->next;
    }
    return i;
}

LiString *Concat(LiString *s,LiString *t)
{    
	LiString *str,*p=s->next,*q,*r;
   	str=(LiString *)malloc(sizeof(LiString));
    r=str;
    while (p!=NULL)    /*将s的所有结点复制到str*/
	{    
		q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
        r->next=q;
		r=q;
	    p=p->next;
    }
	p=t->next;
   	while (p!=NULL) /*将t的所有结点复制到str*/
	{  
		q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
        r->next=q;
		r=q;
        p=p->next;
    }
    r->next=NULL;
    return str;
}

LiString *SubStr(LiString *s,int i,int j)
{  	 
	int k;
    LiString *str,*p=s->next,*q,*r;
    str=(LiString *)malloc(sizeof(LiString));
    r=str;
    if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
	{     
		printf("参数不正确\n");
        return str;    	/*参数不正确时返回空串*/
	}
    for (k=0;k<i-1;k++)   /*找第i-1个结点,由p指向它*/
		p=p->next;
    	for (k=1;k<=j;k++)  /*s[i]开始的j个结点=>str*/
		{    
			q=(LiString *)malloc(sizeof(LiString));
        	q->data=p->data;q->next=NULL;
        	r->next=q;r=q;
        	p=p->next;
    	}
    r->next=NULL;
    return str;
}

LiString *InsStr(LiString *s,int i,LiString *t)
{
	int k;
    LiString *str,*p=s->next,*p1=t->next,*q,*r;
    str=(LiString *)malloc(sizeof(LiString));
    r=str;
    if (i<=0 || i>StrLength(s)+1) 	
	{
		printf("参数不正确\n");
        return str; 	/*参数不正确时返回空串*/
	}
	for (k=1;k<i;k++)   /*将s的前i个结点复制到str*/
	{
		q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;q->next=NULL;
        r->next=q;
		r=q;
		p=p->next;    	
	}
    while (p1!=NULL)  /*将t的所有结点复制到str*/
	{
		q=(LiString *)malloc(sizeof(LiString));
        q->data=p1->data;q->next=NULL;
        r->next=q;r=q; p1=p1->next; 	
	}
    while (p!=NULL) /*将*p及其后的结点复制到str*/
	{
		q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;q->next=NULL;
        r->next=q;r=q; p=p->next; 	
	}
    r->next=NULL;  //q用来申请结点,p遍历s1,q遍历s2
	return str;
}

LiString *DelStr(LiString *s,int i,int j)
{
	int k;
    LiString *str,*p=s->next,*q,*r;
    str=(LiString *)malloc(sizeof(LiString));
    r=str;
    if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
	{
		printf("参数不正确\n");
        return str;  	/*参数不正确时返回空串*/
	}
	for (k=0;k<i-1;k++)   /*将s的前i-1个结点复制到str*/
	{
		q=(LiString *)malloc(sizeof(LiString));
        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 (p!=NULL) /*将*p及其后的结点复制到str*/
	{
		q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;q->next=NULL;
        r->next=q;
		r=q;
		p=p->next;
    }
    r->next=NULL;
	return str;
}

LiString *RepStr(LiString *s,int i,int j,LiString *t)
{
	int k;
    LiString *str,*p=s->next,*p1=t->next,*q,*r;
    str=(LiString *)malloc(sizeof(LiString));
    r=str;
    if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
	{
		printf("参数不正确\n");
        return str; /*参数不正确时返回空串*/
	}
	for (k=0;k<i-1;k++) /*将s的前i-1个结点复制到str*/
	{
		q=(LiString *)malloc(sizeof(LiString));
        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=(LiString *)malloc(sizeof(LiString));
        q->data=p1->data;q->next=NULL;
        r->next=q;r=q;p1=p1->next;
    }
	while (p!=NULL) /*将*p及其后的结点复制到str*/
	{
		q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
		q->next=NULL;
        r->next=q;
		r=q;
        p=p->next;
    }
    r->next=NULL;
	return str;
}

void DispStr(LiString *s)
{
	LiString *p=s->next;
    while (p!=NULL) 
	{
		printf("%c",p->data);
	    p=p->next;
	}
	printf("\n");
}

int main()
{
	LiString *s,*s1,*s2,*s3,*s4;
	printf("建立串S和S1...\n");
	StrAssign(s,"abcdefghijklmn");
	StrAssign(s1,"xyz");
	Sleep(2000);

	printf("输出串S:");
	DispStr(s);
	Sleep(2000);

	int length = StrLength(s);
	printf("输出串S的长度:%d",length);
	printf("\n");
	Sleep(2000);

	s2 = InsStr(s,9,s1);
	printf("在串S的第9个字符位置插入串S1而生成串S2...\n");
	Sleep(2000);

	printf("输出串S2:");
	DispStr(s2);
	Sleep(2000);

	s2 = DelStr(s,2,5);
	printf("删除串S的第2个字符开始的5个字符而生成串S2...\n");
	Sleep(2000);

	printf("输出串S2:");
	DispStr(s2);
	Sleep(2000);

	s2 = RepStr(s,2,5,s1);
	printf("将串S的第2个字符开始的5个字符替换成串S1而生成串S2...\n");
	Sleep(2000);

	printf("输出串S2:");
	DispStr(s2);
	Sleep(2000);

	s3 = SubStr(s,2,10);
	printf("提取串S的第2个字符开始的10个字符而生成串S3...\n");
	Sleep(2000);

	printf("输出串S3:");
	DispStr(s3);
	Sleep(2000);

	s4 = Concat(s1,s2);
	printf("将串S1和S2连接起来生成串S4...\n");
	Sleep(2000);
	
	printf("输出串S4:");
	DispStr(s4);
	Sleep(2000);
	return 0;
}

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeJR

如果觉得有用请赏一个呗!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值