【数据结构】【C语言】字符串

名词解释

串存储结构

  • 存储字符串
  • 线性存储结构

空串

  • 存储0个字符的串,例如S = "";

空格串

  • 只包含空格字符的串,例如S = "";

子串和主串

  • 子串是主串的一段

子串在主串中的位置

  • 子串首个字符在主串中的位置

串存储结构的实现

  • 定长顺序存储:用普通数组(静态数组)存储。
  • 堆分配存储:用动态数组存储字符串
  • 块链存储:用链表存储字符串

串的定长顺序存储

  • 可以理解为采用了“固定长度的顺序存储结构”来存储字符串,因此限定了其底层实现,只能用静态数组。
#include<stdio.h>
int main()
{
    char str[19]="data.biancheng.net";
    printf("%s\n",str);
    return 0;
}

串的堆分配存储结构

  • 具体实现方式是,采用动态数组存储字符串
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
	char * a1 = NULL;
	char * a2 = NULL;

	a1 = (char *)malloc(10 * sizeof(char));
	strcpy(a1, "www.bai");
	a2 = (char *)malloc(10 * sizeof(char));
	strcpy(a2, "du.com");

	int lengthA1 = strlen(a1);
	int lengthA2 = strlen(a2);

	if(lengthA1 < lengthA1 + lengthA2)
	{
		a1 = (char *)realloc(a1, (lengthA1 + lengthA2) * sizeof(char));
	}

	for(int i = lengthA1; i < lengthA1 + lengthA2; i++)
	{
		a1[i] = a2[i - lengthA1];
	}

	a1[lengthA1 + lengthA2] = '\0';

	printf("%s", a1);
	
	free(a1);
	free(a2);
	
	return 0;
}

串的块链存储结构

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define linkNum 3//全局设置链表中节点存储数据的个数
typedef struct Link {
    char a[linkNum]; //数据域可存放 linkNum 个数据
    struct Link * next; //代表指针域,指向直接后继元素
}link; // nk为节点名,每个节点都是一个 link 结构体
link * initLink(link * head, char * str);
void displayLink(link * head);
int main()
{
    link * head = NULL;
    head = initLink(head, "www.baidu.com");
    displayLink(head);
    return 0;
}
//初始化链表,其中head为头指针,str为存储的字符串
link * initLink(link * head, char * str) {
    int length = strlen(str);
    //根据字符串的长度,计算出链表中使用节点的个数
    int num = length/linkNum;
    if (length%linkNum) {
        num++;
    }
    //创建并初始化首元节点
    head = (link*)malloc(sizeof(link));
    head->next = NULL;
    link *temp = head;
    //初始化链表
    for (int i = 0; i<num; i++)
    {
        int j = 0;
        for (; j<linkNum; j++)
        {
            if (i*linkNum + j < length) {
                temp->a[j] = str[i*linkNum + j];
            }          
            else
                temp->a[j] = '#';
        }
        if (i*linkNum + j < length)
        {
            link * newlink = (link*)malloc(sizeof(link));
            newlink->next = NULL;
            temp->next = newlink;
            temp = newlink;
        }
    }
    return head;
}
//输出链表
void displayLink(link * head) {
    link * temp = head;
    while (temp) {
        for (int i = 0; i < linkNum; i++) {
            printf("%c", temp->a[i]);
        }
        temp = temp->next;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45117176/article/details/132033617
今日推荐