串由零个或多个字符组成,说白了就是字符串。串的存储方式相对于线性表来讲有些不同,他分为以下几种:顺序存储、堆分配存储、链式存储。顺序存储通常在数组中的头元素存放字符串长度。堆分配存储通常会动态分配空间。链式存储分为两种,一种是每个节点存放一个字符(比较浪费空间),另一种则是每个节点存放多个字符,如果字符不是刚好,就用#代替。(c中字符串定义会有以下几种形式:字符串常量"hello",char数组char m[40] = "hello,world",char指针char *m = "hello,world"。字符串碰到‘\0’结束,定义的字符串末尾都会被系统添加‘\0’)这几种串的存储实现原理都一样,只是方式有些异同。以下是串的基本操作:
基本操作:
init(t , chars)
初始条件: chars是一个字符串常量。
操作结果:生成一个值为chars的串t。
connection(s, t)
初始条件:串s, t 已存在。
 操作结果:将串t联结到串s后形成新串存放到s中。
getLength(t)
初始条件:字符串t已存在。
操作结果:返回串t中的元素个数,称为串长。
SubString (s, pos, len, sub)
初始条件:串s, 已存在, 1≦pos≦StrLength(s)且 0≦len≦StrLength(s) –pos+1。
操作结果:用sub返回串s的第pos个字符起长度为len 的子串。
下面是串的链式存储代码实现:
#include #include //串的链式存储
typedef struct charNode{
char data;
struct charNode *next;
}charNode;
typedef charNode *charLink;
//c中字符串会有以下几种形式:字符串常量"hello",char数组char m[40] = "hello,world",char指针char *m = "hello,world"
void init(charLink *c,char s[]){
charLink p,q;
(*c)=(charLink)malloc(sizeof(charNode));//创建链式串
q=*c;//定义指针指向串
for(int i=0;s[i]!='\0';i++){//c里面所有定义的字符串后面都会有一个‘\0’,他代表结束
p=(charLink)malloc(sizeof(charNode));
p->data=s[i];//这里类似链表的尾插法
q->next=p;
q=p;
}
q->next=NULL;
}
//获取串长度
int getLength(charLink c){
int i=0;
charLink p;
p=c;
while(p->next){
p=p->next;
i++;
}
return i;
}
//将两个串拼成一个串
void connection(charLink *c,charLink b){
charLink p=(*c)->next;//定义一个指针指向c的第一个字符。
charLink p2=b;//定义一个指针指向b
charLink p3;//用来存储在b中取出的字符节点
char s;//用来存放从b中取出的字符数据
while(p2->next){//从b的第一个字符节点开始取
p2=p2->next;
s=p2->data;
while(p->next){//从c的第一个字符节点的next开始判断,如果不为空,就向下指,直到p成为c的最后一个字符节点
p=p->next;
}
p3=(charLink)malloc(sizeof(charNode));
p3->data=s;
p->next=p3;//类似链表的尾插法,让后插入的数据都往后排
p=p3;
}
p->next=NULL;
}
void substring(charLink c,int index,int slength,charLink *s){
//当index+slength<=(*s).length+1时才能取
charLink p,z;
*s=(charLink)malloc(sizeof(charNode));
z=*s;
p=c->next;
int i=1,j=1;
//拿到主串的要取数据的第一个位置
while(p->next&&inext;
i++;
}
//取值赋值
while(p&&j<=slength){
charLink n=(charLink)malloc(sizeof(charNode));
n->data=p->data;
z->next=n;
z=n;
p=p->next;
j++;
}
z->next=NULL;
}
void display(charLink c){
charLink p=c->next;
while(p){
char q=p->data;
printf("%c ",q);
p=p->next;
}
printf("\n");
}
int main()
{
charLink c,b,z;
char c1[20]="hello hello";
char c2[20]=" world world";
char c3[10]="";
init(&z,c3);
init(&c,c1);
display(c);
init(&b,c2);
display(b);
connection(&c,b);
display(c);
printf("串的长度为:\n%d\n",getLength(c));
substring(c,1,5,&z);
display(z);
return 0;
}