(C语言)串实验

295 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1.(1):编写输出字符串s中值等于字符ch的第一个字符的下标的函数,并用主函数测试结果。 注:原题目为 “编写输出字符串s中值等于字符ch的第一个字符的函数,并用主函数测试结果。”,后问过老师,这里要我们输出的是下标。

实现代码:

 #include <stdio.h>
 #include <string.h>
 #define MAXSIZE 100 
 int SearchFirst(char s[],char ch){
     int i;
     for (i = 0;i < strlen(s);i++){
         if (s[i] == ch)
             return i;
     }
     return -1; 
 }
 int main() {
     char s[MAXSIZE];
     printf("请输入字符串s:\n");
     gets(s);
     char ch;
     printf("请输入字符ch:\n");
     scanf("%c", &ch);
     int flag = SearchFirst(s,ch);
     if (flag != -1){
         printf("字符串s中值等于字符ch的第一个字符的下标为:%d", flag);
     }else{
         printf("字符串s中不存在值等于字符ch的字符!");
     }
     return 0;    
 }

运行结果:

在这里插入图片描述 在这里插入图片描述

分析: 该程序中用于查找字符串s中值等于字符ch的第一个字符并返回其下标的函数的时间复杂度与空间复杂度均为线性阶O(n)。

(2):编写输出字符串s中值等于字符ch的所有字符的下标的函数,并用主函数测试结果。解题思路:可以将第一题程序改进成一个子函数,在本题中循环调用。 注:此题同上一题一样原题目表述不完整,问过老师,这里要我们输出的也是下标。

实现代码:

 #include <stdio.h>
 #include <string.h>
 #define MAXSIZE 100 
 void SearchEqual(char s[],char ch){
     int i,flag = 0;
     for (i = 0;i < strlen(s);i++){
         if (s[i] == ch){
             if (flag == 0){
                 flag = 1;
                 printf("字符串s中值等于字符ch的所有字符的下标为:\n");
             }
             printf("%d ", i);
         }
     }
     if (flag == 0) printf("字符串s中不存在值等于字符ch的字符!");
 }
 int main() {
     char s[MAXSIZE];
     printf("请输入字符串s:\n");
     gets(s);
     char ch;
     printf("请输入字符ch:\n");
     scanf("%c", &ch);
     SearchEqual(s,ch);
     return 0;    
 }

运行结果:

在这里插入图片描述 在这里插入图片描述

分析: 该程序中用于输出字符串s中值等于字符ch的所有字符的下标的函数的时间复杂度与空间复杂度均为线性阶O(n)。

(3):设字符串采用单字符的链式存储结构,编程删除串s从位置i开始长度为k的子串。

实现代码:

 #include <stdio.h>
 #include <stdlib.h>
 typedef struct linknode{
     char data;
     struct linknode *next;
 }linkstring;
 linkstring *CreateLinkstring(){
     char ch; 
     linkstring *head,*r,*s;
     head = (linkstring *)malloc(sizeof(linkstring));
     r = head;
     printf("请输入链串中的字符(以回车为结束符):\n");
     ch = getchar();
     while(ch != '\n'){
         s = (linkstring *)malloc(sizeof(linkstring));
         s->data = ch;
         r->next = s;
         r = s;
         ch = getchar();              
     }
     r->next = NULL;
     return head;
 }
 void DeleteSubstring(linkstring *s,int i,int k){
     if (s->next == NULL || i < 0 || k <= 0){
         printf("该链串为空串或存在错误输入,无法进行删除!\n");
         return; 
     }
     linkstring *p,*q;
     int m = 0,n = 1;
     p = s->next;
     while (p != NULL){
         if (m == i-1){
             q = p->next;
             break;     
         }
         p = p->next;
         m++; 
     }
     if (p == NULL || q == NULL) {
         printf("串中不存在位置i,无法进行删除!\n");
         return;
     }
     while (q != NULL){
         if (n == k) break;
         q = q->next;
         n++;                                     
     }
     if (q == NULL){
         printf("串中位置i后的子串长度不足k,无法进行删除!\n");
         return;
     }
     p->next = q->next; 
 }
 void PrintLinkstring(linkstring *head){
     linkstring *t = head->next;
     if (t == NULL){
         printf("该链串为空串!\n");
     }
     while(t != NULL){
         printf("%c",t->data);
         t = t->next;
     }
 }
 int main() {
     printf("创建链串s。\n");
     linkstring *s = CreateLinkstring();
     int i,k;
     printf("请输入位置i和长度k的值:\n");
     scanf("%d %d",&i,&k);
     DeleteSubstring(s,i,k);
     printf("执行完删除操作后,串s为:\n");
     PrintLinkstring(s);
     return 0;  
 }

运行结果:

在这里插入图片描述

输入的位置i不存在时: 在这里插入图片描述

位置i后的子串长度不足k时: 在这里插入图片描述

分析: 该程序中用于删除串s从位置i开始长度为k的子串的函数的时间复杂度与空间复杂度均为线性阶O(n)。

2.假设以链结构表示串,编写算法实现将串S插入到串T中某个字符之后,若串T中不存在这个字符,则将串S联接在串T的末尾。 提示:为提高程序的通用性,插入位置字符应设计为从键盘输入。

实现代码:

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 typedef struct linknode{
     char data;
     struct linknode *next;
 }linkstring;
 linkstring *CreateLinkstring(){
     char ch; 
     linkstring *head,*r,*s;
     head = (linkstring *)malloc(sizeof(linkstring));
     r = head;
     printf("请输入链串中的字符(以回车为结束符):\n");
     ch = getchar();
     while(ch != '\n'){
         s = (linkstring *)malloc(sizeof(linkstring));
         s->data = ch;
         r->next = s;
         r = s;
         ch = getchar();              
     }
     r->next = NULL;
     return head;
 }
 void PrintLinkstring(linkstring *head){
     linkstring *t = head->next;
     if (t == NULL){
         printf("该链串为空串!\n");
     }
     while(t != NULL){
         printf("%c",t->data);
         t = t->next;
     }
 } 
 void SearchAndInsert(linkstring *S,linkstring *T,char ch){
     linkstring *p,*q,*r,*m;
     p = S->next;
     q = T->next; 
     if (p == NULL){
         printf("要插入的串为空串,不用插入!\n");
         return;
     } 
     if (q == NULL){
         printf("要被插入的串为空串,无法插入!\n");
         return; 
     }
     while (q->data != ch && q->next != NULL){
         q = q->next;
     }
     if (q->data != ch){
         printf("串中不存在字符%c,直接联接到末尾。\n",ch); 
         q->next = p;
         return;
     } 
     m = q->next;
     q->next = p;
     r = S->next;
     while (r->next != NULL){
         r = r->next;
     } 
     r->next = m;
 }
 int main(){
     printf("创建链串T。\n");
     linkstring *T = CreateLinkstring();
     printf("创建链串S。\n");
     linkstring *S = CreateLinkstring();
     char ch;
     printf("请输入插入位置字符:\n");
     scanf("%c",&ch);
     SearchAndInsert(S,T,ch);
     printf("执行完插入操作之后,串T为:\n");
     PrintLinkstring(T);
     return 0;
 } 

运行结果:

输入的字符存在时: 在这里插入图片描述

输入的字符不存在时: 在这里插入图片描述

分析: 该程序中用于将串S插入到串T中字符ch之后的函数的时间复杂度为线性阶O(n),假设串S与串T中均有n个字符,则其空间复杂度为线性阶O(n)。