目录
第一关——定长存储表示
任务描述
本关任务:实现串的定长顺序存储结构。
相关知识
我们知道,顺序存储结构(顺序表)的底层实现用的是数组,根据创建方式的不同,数组又可分为静态数组和动态数组,因此顺序存储结构的具体实现其实有两种方式。
静态数组:如 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;
}
}