2301_77118124 2023-04-23 20:17 采纳率: 66.7%
浏览 13
已结题

c语言 链式串中子串的替换算法怎么写

若采用单链存储的方式存储串,编写一个算法将串s中的第i个字符到第
j个字符之间的字符(不包括i和j)用t串替换

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-04-23 21:29
    关注
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct Node {
        char data;
        struct Node* next;
    } Node, *LinkedList;
    
    // 创建一个空链表
    LinkedList createList() {
        LinkedList L = (LinkedList)malloc(sizeof(Node));
        L->next = NULL;
        return L;
    }
    
    // 将一个字符串转换为单链表
    LinkedList stringToList(char s[]) {
        LinkedList L = createList();
        Node* tail = L;
        for (int i = 0; s[i] != '\0'; i++) {
            Node* p = (Node*)malloc(sizeof(Node));
            p->data = s[i];
            p->next = NULL;
            tail->next = p;
            tail = p;
        }
        return L;
    }
    
    // 将链表转换为一个字符串
    void listToString(LinkedList L, char s[]) {
        int i = 0;
        Node* p = L->next;
        while (p != NULL) {
            s[i++] = p->data;
            p = p->next;
        }
        s[i] = '\0';
    }
    
    // 将s串中第i个字符到第j个字符之间的字符(不包括i和j)用t串替换
    void replaceSubString(LinkedList L, int i, int j, char t[]) {
        // 找到第i个节点前面的节点
        Node* p = L;
        for (int k = 1; k < i; k++) {
            if (p == NULL) {
                printf("i太大\n");
                return;
            }
            p = p->next;
        }
        // 找到第j个节点
        Node* q = p;
        for (int k = i; k <= j; k++) {
            if (q == NULL) {
                printf("j太大\n");
                return;
            }
            q = q->next;
        }
        // 将[t]插入到p和q之间
        Node* tList = stringToList(t);
        Node* tail = tList;
        while (tail->next != NULL) {
            tail = tail->next;
        }
        tail->next = q;
        p->next = tList->next;
        free(tList);
    }
    
    int main() {
        char s[] = "Hello, world!";
        LinkedList L = stringToList(s);
    
        printf("原始串:\n");
        printf("%s\n", s);
    
        replaceSubString(L, 7, 12, "GitHub");
        char s2[20];
        listToString(L, s2);
    
        printf("替换后的串:\n");
        printf("%s\n", s2);
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 创建了问题 4月23日

悬赏问题

  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多