串链基本操作的实现

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

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

/*字符常量cstr赋值给串s*/
void StrAssign(LiString *s, char cstr[])
{
 LiString *p1;
 LiString *p2;
 char *p3=cstr;

 s=(LiString *)malloc(sizeof(LiString)); //头结点
 p2=s;

 while(p3!='/0')
 {
  p1=(LiString *)malloc(sizeof(LiString));
  p1->data=*p3;
  p3++;
  p2->next=p1;
  p2=p1;
 }
 p2->next=NULL;
}

/*串链复制*/
void StrCopy(LiString *s, LiString *t)
{
 LiString *p1;
 LiString *p2;
 LiString *p3=t->next;

 s=(LiString *)malloc(sizeof(LiString));
 p2=s;

 while(p3->next!=NULL)
 {
  p1=(LiString *)malloc(sizeof(LiString));
  p1->data=p3->data;
  p3=p3->next;
  p2->next=p1;
  p2=p1;
 }
 p2->next=NULL;
}

/*判断两串链是否相等*/
int StrEqual(LiString *s, LiString *t)
{
 LiString *p1=s->next;
 LiString *p2=t->next;

 while((p1!=NULL)&&(p2!=NULL)&&(p1->data==p2->data))
 {
  p1=p1->next;
  p2=p2->next;
 }

 if((p1==NULL)&&(p2==NULL))
  return 1;
 return 0;
}

/*计算串联长度*/
int StrLength(LiString *s)
{
 int length=0;
 LiString *p=s->next;

 while(p!=NULL)
 {
  length++;
  p=p->next;
 }
 return length;
}

/*将两个串链接起来形成新的串链*/
LiString *Concat(LiString *s, LiString *t)
{
 LiString *p1=s->next;
 LiString *p2=t->next;
 LiString *head, *p3, *p4;

 head=(LiString *)malloc(sizeof(LiString));
 p3=head;

 while(p1!=NULL)
 {
  p4=(LiString *)malloc(sizeof(LiString));
  p4->data=p1->data;
  p3->next=p4;
  p1=p1->next;
  p3=p4;
 }

 while(p2!=NULL)
 {
  p4=(LiString *)malloc(sizeof(LiString));
  p4->data=p2->data;
  p3->next=p4;
  p2=p2->next;
  p3=p4;
 }
 p3->next=NULL;

 return head;
}

LiString *SubStr(LiString *s, int i, int j)
{
 return NULL;
}

/*将串t插入到s的第i个字符位置*/
LiString *InsStr(LiString *s, int i, LiString *t)
{
 return NULL;
}

LiString *DelStr(LiString *s, int i, int j)
{
 return NULL;
}

LiString *RepStr(LiString *s, int i, int j, LiString *t)
{
 return NULL;
}

/*串链输出显示*/
void DispStr(LiString *s)
{
 LiString *p=s->next;

 while(p!=NULL)
 {
  printf("%c", p->data);
  p=p->next;
 }
 printf("/n");
}

/*创建串链*/
void CreateStr(LiString *&s, int n)
{
 int i;
 LiString *p1, *p2;
 s=(LiString *)malloc(sizeof(LiString));
 p1=s;

 for(i=0; i<n; i++)
 {
  p2=(LiString *)malloc(sizeof(LiString));
  p2->data=i+0x30;
  p1->next=p2;
  p1=p2;
 }
 p1->next=NULL;
}

/*释放串链*/
void FreeStr(LiString *s)
{
 LiString *p1, *p2;
 p1=s;
 p2=s->next;

 while(p2!=NULL)
 {
  free(p1);
  p1=p2;
  p2=p2->next;
 }
 free(p2);
}

void main(void)
{
 LiString *strList, *strList1=NULL, *strList2=NULL;

 CreateStr(strList1, 10);
 CreateStr(strList2, 40);
 
 strList=Concat(strList1, strList2);
 DispStr(strList);

 FreeStr(strList1);
 FreeStr(strList2);
 FreeStr(strList);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值