問題及代碼:
問題描述:定義鏈串的存儲結構,實現串的基本運算,並完成測試。
輸入描述:各種串的輸入。
程序輸出:各操作後的輸出。
(1)頭文件:
typedef struct snode
{
char data;
struct snode *next;
} LiString;
void StrAssign(LiString *&s,char cstr[]); //字符串常量cstr賦給串s
void StrCopy(LiString *&s,LiString *t); //串t複製給串s
bool StrEqual(LiString *s,LiString *t); //判串相等
int StrLength(LiString *s); //求串長
LiString *Concat(LiString *s,LiString *t); //串連接
LiString *SubStr(LiString *s,int i,int j); //求子串
LiString *InsStr(LiString *s,int i,LiString *t) ; //串插入
LiString *DelStr(LiString *s,int i,int j); //串刪去
LiString *RepStr(LiString *s,int i,int j,LiString *t); //串替換
void DispStr(LiString *s); //輸出串
(2)源文件:
#include <stdio.h>
#include <malloc.h>
#include "liString.h"
void StrAssign(LiString *&s,char cstr[]) //字符串常量cstr賦給串s
{
int i;
LiString *r,*p;
s=(LiString *)malloc(sizeof(LiString));
r=s; //r始終指向尾節點
for (i=0;cstr[i]!='\0';i++)
{ p=(LiString *)malloc(sizeof(LiString));
p->data=cstr[i];
r->next=p;r=p;
}
r->next=NULL;
}
void StrCopy(LiString *&s,LiString *t) //串t複製給串s
{
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;
}
bool 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 true;
else
return false;
}
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));
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++)
p=p->next;
for (k=1;k<=j;k++) //將s的第i個節點開始的j個節點複製到str
{ q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
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));
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=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
while (p1!=NULL) //將t的所有節點複製到str
{ q=(LiString *)malloc(sizeof(LiString));
q->data=p1->data;
r->next=q;r=q;
p1=p1->next;
}
while (p!=NULL) //將*p及其後的節點複製到str
{ q=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
r->next=q;r=q;
p=p->next;
}
r->next=NULL;
return str;
}
LiString *DelStr(LiString *s,int i,int j) //串刪去
{
int k;
LiString *str,*p=s->next,*q,*r;
str=(LiString *)malloc(sizeof(LiString));
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=(LiString *)malloc(sizeof(LiString));
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=(LiString *)malloc(sizeof(LiString));
q->data=p->data;
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));
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=(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");
}
(3)測試main函數:
#include <stdio.h>
#include "liString.h"
int main()
{
LiString *s,*s1,*s2,*s3,*s4;
printf("鏈串的基本運算如下:\n");
printf(" (1)建立串s和串s1\n");
StrAssign(s,"abcdefghijklmn");
printf(" (2)輸出串s:");
DispStr(s);
StrAssign(s1,"123");
printf(" (2)輸出串s1:");
DispStr(s1);
printf(" (3)串s的長度:%d\n",StrLength(s));
printf(" (4)在串s的第9個字符位置插入串s1而產生串s2\n");
s2=InsStr(s,9,s1);
printf(" (5)輸出串s2:");
DispStr(s2);
printf(" (6)刪除串s第2個字符開始的5個字符而產生串s2\n");
s2=DelStr(s,2,3);
printf(" (7)輸出串s2:");
DispStr(s2);
printf(" (8)將串s第2個字符開始的5個字符替換成串s1而產生串s2\n");
s2=RepStr(s,2,5,s1);
printf(" (9)輸出串s2:");
DispStr(s2);
printf(" (10)提取串s的第2個字符開始的10個字符而產生串s3\n");
s3=SubStr(s,2,10);
printf(" (11)輸出串s3:");
DispStr(s3);
printf(" (12)將串s1和串s2連接起來而產生串s4\n");
s4=Concat(s1,s2);
printf(" (13)輸出串s4:");
DispStr(s4);
return 0;
}
知識點總結:
鏈串的操作。