#include <stdio.h> #include <stdlib.h> #include <string.h> #define max 10000 typedef struct { char elem[max]; int length; }Sqlist; Sqlist L[ max ] , T; int n = 0,m = 0; void IF_simple( Sqlist S ) { int i = 0, j ,t ,sum ,flag = 1; for( ; i < n ; i++ ) { if( ! strcmp( L[i].elem , S.elem ) ) { printf("%s is correct\n",S.elem); flag = 0 ; break; } } if( flag ) { printf("%s:",S.elem); for( i = 0; i < n ; i++ ) { if( S.length == L[i].length + 1) { for( j = 0,t = 0,sum = 0; L[i].elem[j] != '\0' ; j++,t++ ) { if( L[i].elem[j] != S.elem[t] ) { sum++; j--; } if( sum > 1) break; } if( sum <= 1 ) printf(" %s",L[i].elem); } if( S.length == L[i].length - 1) { for( j = 0,t = 0,sum = 0; S.elem[t] != '\0' ; j++,t++ ) { if( L[i].elem[j] != S.elem[t] ) { sum++; t--; } if( sum > 1) break; } if( sum <= 1 ) printf(" %s",L[i].elem); } if( S.length == L[i].length ) { for( j = 0,t = 0,sum = 0; S.elem[t] != '\0' ; j++,t++ ) { if( L[i].elem[j] != S.elem[t] ) sum++; if( sum > 1) break; } if( sum <= 1 ) printf(" %s",L[i].elem); } } printf("\n"); } } int main() { while( gets(L[n].elem) ) { if( L[n].elem[0] == '#') break; L[n].length = strlen( L[n].elem ); n++; } while( gets(T.elem) ) { if( T.elem[0] == '#') break; T.length = strlen( T.elem ); IF_simple( T ); } return 0; }分析此代码的时间与空间复杂度
时间: 2024-02-15 18:26:43 浏览: 23
这段代码主要是实现一个单词检查的功能,具体来说是输入一些单词,然后对于每个单词进行检查,如果输入的单词在之前的输入中已经出现过,则直接输出 "correct",否则输出与输入的单词相差一个字符的所有单词。时间复杂度和空间复杂度分别分析如下:
时间复杂度:
- 主要的时间复杂度在于 IF_simple 函数中的循环,该循环的次数最多为 n,其中 n 是之前输入的单词的数量。而对于每个单词,都需要检查其与输入的单词是否相差一个字符,所以最坏情况下,需要遍历所有之前输入的单词,即时间复杂度为 O(n * m),其中 m 是输入单词的长度。同时,由于还需要对输入的单词进行循环遍历,所以整个程序的时间复杂度为 O(n * m * k),其中 k 是输入的单词数量。
- 注意到输入的单词数量可能很大,而且每个单词的长度也有限制,因此整个程序的时间复杂度是有上限的。
空间复杂度:
- 空间复杂度主要来自于输入的单词的存储。由于输入的单词数量可能很大,因此需要使用一个数组 L 来存储输入的单词。同时,还需要一个临时变量 T 来存储每次输入的单词。因此,整个程序的空间复杂度为 O(n * m),其中 m 是输入单词的长度。
相关问题
改进以下代码#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define ar arr[]={12,21,2,11,10,8} #define ELEM_TYPE int int ar; //顺序表的创建: typedef struct Sqlist { ELEM_TYPE *data; int length; int SIZE; }Sqlist,*PSqlist; //顺序表的初始化: void Init_Sqlist(P
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100 // 定义最大长度
typedef int ElemType; // 定义元素类型
typedef struct {
ElemType *data; // 动态分配数组
int length; // 当前长度
int maxSize; // 最大长度
} SqList;
// 初始化顺序表
void InitList(SqList *L) {
L->data = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE); // 动态分配数组
L->length = 0; // 初始长度为0
L->maxSize = MAXSIZE; // 最大长度为MAXSIZE
}
// 插入元素
int Insert(SqList *L, int i, ElemType e) {
// i的合法范围为 1 <= i <= L->length + 1
if (i < 1 || i > L->length + 1) {
return 0; // 插入位置不合法
}
if (L->length >= MAXSIZE) {
return 0; // 当前存储空间已满,不能插入新元素
}
for (int j = L->length; j >= i; j--) {
L->data[j] = L->data[j - 1]; // 将第i个元素及之后的元素后移
}
L->data[i - 1] = e; // 插入新元素
L->length++; // 长度加1
return 1;
}
// 删除元素
int Delete(SqList *L, int i) {
// i的合法范围为 1 <= i <= L->length
if (i < 1 || i > L->length) {
return 0; // 删除位置不合法
}
for (int j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j]; // 将第i+1个元素及之后的元素前移
}
L->length--; // 长度减1
return 1;
}
// 输出顺序表
void PrintList(SqList L) {
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
int main() {
SqList L;
InitList(&L);
Insert(&L, 1, 1);
Insert(&L, 2, 3);
Insert(&L, 3, 5);
PrintList(L);
Delete(&L, 2);
PrintList(L);
return 0;
}
以下程序哪里不对#include<stdio.h> #include<stdlib.h> #define MAX 10010 typedef struct{ char num[MAX]; char name[MAX]; float price; }ElemType; typedef struct{ ElemType *elem; int length; }SSTable; int main(){ SSTable table; scanf("%d",&table.length); for(int i=0;i<table.length;i++){ scanf("%s",table.elem[i].num);//elem是个指针 scanf("%s",table.elem[i].name); scanf("%f",&table.elem[i].price); } for(int i=0;i<table.length;i++){ printf("%s %s %f\n",table.elem[i].num,table.elem[i].name,table.elem[i].price); } }
该程序中存在一个问题:在定义SSTable类型的结构体时,只是定义了一个指向ElemType类型结构体的指针,但并没有为其分配空间。这导致在程序运行时,访问table.elem[i]时会出现段错误,因为elem指针并没有指向任何有效的内存地址。
解决方法是在定义SSTable结构体时,为elem指针分配足够的内存空间,可以使用malloc函数来实现。具体的代码修改如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX 10010
typedef struct {
char num[MAX];
char name[MAX];
float price;
} ElemType;
typedef struct {
ElemType *elem;
int length;
} SSTable;
int main() {
SSTable table;
scanf("%d", &table.length);
// 为elem指针分配内存空间
table.elem = (ElemType*)malloc(table.length * sizeof(ElemType));
for(int i = 0; i < table.length; i++) {
scanf("%s", table.elem[i].num);
scanf("%s", table.elem[i].name);
scanf("%f", &table.elem[i].price);
}
for(int i = 0; i < table.length; i++) {
printf("%s %s %f\n", table.elem[i].num, table.elem[i].name, table.elem[i].price);
}
// 释放内存空间
free(table.elem);
return 0;
}
```
需要注意的是,在使用malloc函数分配内存空间之后,需要在程序结束前使用free函数释放内存空间,以避免内存泄漏。
相关推荐
![c](https://img-home.csdnimg.cn/images/20210720083646.png)
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)