用c语言实现串的存储结构是指,数据结构学习笔记-串(C语言实现)

串由零个或多个字符组成,说白了就是字符串。串的存储方式相对于线性表来讲有些不同,他分为以下几种:顺序存储、堆分配存储、链式存储。顺序存储通常在数组中的头元素存放字符串长度。堆分配存储通常会动态分配空间。链式存储分为两种,一种是每个节点存放一个字符(比较浪费空间),另一种则是每个节点存放多个字符,如果字符不是刚好,就用#代替。(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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值