头歌——串的表示和实现

目录

第一关——定长存储表示

任务描述

相关知识

代码内容

第二关——堆分配存储表示

任务描述

代码内容

第三关——块链存储表示

代码内容


第一关——定长存储表示

任务描述

本关任务:实现串的定长顺序存储结构。

相关知识

我们知道,顺序存储结构(顺序表)的底层实现用的是数组,根据创建方式的不同,数组又可分为静态数组和动态数组,因此顺序存储结构的具体实现其实有两种方式。

静态数组:如 str[10],静态数组的长度是固定的。
动态数组:它使用 malloc 和 free 函数动态申请和释放空间,因此动态数组的长度是可变的。

串的定长顺序存储结构,可以简单地理解为采用 "固定长度的顺序存储结构" 来存储字符串,因此限定了其底层实现只能使用静态数组。

使用定长顺序存储结构存储字符串时,需结合目标字符串的长度,预先申请足够大的内存空间。

例如,采用定长顺序存储结构存储 "data.biancheng.net",通过目测得知此字符串长度为 18(不包含结束符 '\0'),因此我们申请的数组空间长度至少为 18,用 C 语言表示为:

char str[18] = "data.biancheng.net";
请你实现使用定长顺序存储结构存储字符串的代码:

代码内容

#include<stdio.h>
int main()
{
    // 创建数组,内容为"this is my string"
    // 请在下方填写你的代码
    /******** begin *******/
    char str[18] = "this is my string";
    printf("%s\n",str);
    /******* end *********/
    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, "Hello");//将字符串"data.bian"复制给a1
    a2 = (char*)malloc(10 * sizeof(char));
    strcpy(a2, "World");
    int lengthA1 = strlen(a1);//a1串的长度
    int lengthA2 = strlen(a2);//a2串的长度
    /**** 请在下方补全代码 ************/
 /************* begin *********************/
 a1 = (char*)realloc(a1,(lengthA1 + lengthA2 +1)*sizeof(char));
 strcat(a1,a2);
 /************* end **********************/
    //串的末尾要添加 \0,避免出错
    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, "hello.world");
    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;
    //初始化链表
/** 请在此处填写你的代码 ****/
/************************** begin ******************/
int i = 0;
while(i < num){
    for(int j = 0 ; j < linkNum ; j++){
        if(i* linkNum + j < length){
            temp->a[j] = str[i * linkNum + j];
        }else{
                temp->a[j] = '#';
            }
        }
        if( i * linkNum + linkNum < length){
            temp->next = (link*)malloc(sizeof(link));
            temp = temp->next;
            temp->next = NULL;
        }
        i++;
}


/*************************** end *******************/
    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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值