织芜 2023-07-09 17:22 采纳率: 70.8%
浏览 20

这个广义表构造以及求深度运行后结果不对,有什么问题

这个广义表构造以及求深度运行后结果不对,有什么问题

#include <stdio.h> 
#include <stdlib.h>
#include<string.h>

typedef enum{
    ATOM, LIST
} TagType;

typedef char AtomType;

typedef union {
    struct GLNode *hp, *tp;
    AtomType atom;
} PTR;

typedef struct GLNode {
    TagType tag;
    PTR ptr;
} GLNode, *GList;

// 相应的字符串算法
int StringLength(char* str) {
    int i = 0;
    while (str[i] != '\0') {
        ++i;
    }
    return i;
}

void SubString(char* str, char* sub, int begin, int end) {
    if (begin < 0 || end >= StringLength(str)) {
        exit(0);
    }
    for (int i = begin; i <= end; i++) {
        sub[i - begin] = str[i];
    }
    //sub[end - begin + 1] = '\0'; // 添加结束符
}

int StringEmpty(char* str) {
    if (str == NULL || *str == '\0') {
        return 1;
    }
    return 0;
}

void sever(char* sub, char* hsub) {
    int n = StringLength(sub);
    int i = 0;
    int k = 0;
    do {
        ++i;
        if (sub[i] == '(') {
            k++;
        }
        else if (sub[i] == ')') {
            k--;
        }
    } while (i < n && (sub[i] != ',' || k != 0));
    if (i < n) {
        SubString(sub, hsub, 1, i - 1);
        SubString(sub, sub, i + 1, n - 1);
    }
    else {
        for (int i = 0; i < n; i++) {
            hsub[i] = sub[i];
            sub[i] = '\0';
        }
    }
}
// 相应的字符串算法

void CreateGList(GList *L, char* str) {
    if (strcmp(str,"()") || StringEmpty(str)) {
        *L = NULL;
    }
    else {
        if (!(*L = (GList)malloc(sizeof(GLNode)))) {
            exit(0);
        }
        int len = StringLength(str);
        if (len == 1) { // 严女士提供的算法原子仅单字符
            (*L)->tag = ATOM;
            (*L)->ptr.atom = *str;
        }
        else {
            (*L)->tag = LIST;
            char* sub = (char*)malloc(len * sizeof(char));
            char* hsub = (char*)malloc(len * sizeof(char));
            SubString(sub, str, 1, len - 2);
            GList p = *L;
            GList q;
            do {
                sever(sub, hsub);
                q = p;
                CreateGList(&(p->ptr.hp), hsub);
                if (!(p = (GList)malloc(sizeof(GLNode)))) {
                    exit(0);
                }
                p->tag = LIST;
                q->ptr.tp = p;
            } while (!StringEmpty(sub)); // 很好的迭代思想
            q->ptr.tp = NULL;

            free(sub); // 释放动态内存
            free(hsub);
        }
    }
}
// 时间复杂度: O(广义表长度)

int GListDepth(GList L) {
    if (!L) {
        return 1;
    }
    if (L->tag == ATOM) {
        return 0;
    }
    int max = 0;
    int dep = 0;
    for (GList p = L; p; p = p->ptr.tp) {
        dep = GListDepth(p->ptr.hp);
        if (dep > max) max = dep;
    }
    return max + 1;
}
// 时间复杂度: O(节点数)

int main() {
    char* str = "((),(e),(a,(b,(f,(w,n),q),c,d)))";
    GList L;
    CreateGList(&L, str);
    printf("success\n");
    printf("%d\n", GListDepth(L));
    return 0;
}
  • 写回答

2条回答 默认 最新

  • 织芜 2023-07-09 17:43
    关注

    这个广义表构造以及求深度运行后结果不对,有什么问题

    #include <stdio.h> 
    #include <stdlib.h>
    #include<string.h>
    
    typedef enum{
        ATOM, LIST
    } TagType;
    
    typedef char AtomType;
    
    typedef union {
        struct GLNode *hp, *tp;
        AtomType atom;
    } PTR;
    
    typedef struct GLNode {
        TagType tag;
        PTR ptr;
    } GLNode, *GList;
    
    // 相应的字符串算法
    int StringLength(char* str) {
        int i = 0;
        while (str[i] != '\0') {
            ++i;
        }
        return i;
    }
    
    void SubString(char* str, char* sub, int begin, int end) {
        if (begin < 0 || end >= StringLength(str)) {
            exit(0);
        }
        for (int i = begin; i <= end; i++) {
            sub[i - begin] = str[i];
        }
        //sub[end - begin + 1] = '\0'; // 添加结束符
    }
    
    int StringEmpty(char* str) {
        if (str == NULL || *str == '\0') {
            return 1;
        }
        return 0;
    }
    
    void sever(char* sub, char* hsub) {
        int n = StringLength(sub);
        int i = 0;
        int k = 0;
        do {
            ++i;
            if (sub[i] == '(') {
                k++;
            }
            else if (sub[i] == ')') {
                k--;
            }
        } while (i < n && (sub[i] != ',' || k != 0));
        if (i < n) {
            SubString(sub, hsub, 1, i - 1);
            SubString(sub, sub, i + 1, n - 1);
        }
        else {
            for (int i = 0; i < n; i++) {
                hsub[i] = sub[i];
                sub[i] = '\0';
            }
        }
    }
    // 相应的字符串算法
    
    void CreateGList(GList *L, char* str) {
        if (strcmp(str,"()") || StringEmpty(str)) {
            *L = NULL;
        }
        else {
            if (!(*L = (GList)malloc(sizeof(GLNode)))) {
                exit(0);
            }
            int len = StringLength(str);
            if (len == 1) { // 严女士提供的算法原子仅单字符
                (*L)->tag = ATOM;
                (*L)->ptr.atom = *str;
            }
            else {
                (*L)->tag = LIST;
                char* sub = (char*)malloc(len * sizeof(char));
                char* hsub = (char*)malloc(len * sizeof(char));
                SubString(sub, str, 1, len - 2);
                GList p = *L;
                GList q;
                do {
                    sever(sub, hsub);
                    q = p;
                    CreateGList(&(p->ptr.hp), hsub);
                    if (!(p = (GList)malloc(sizeof(GLNode)))) {
                        exit(0);
                    }
                    p->tag = LIST;
                    q->ptr.tp = p;
                } while (!StringEmpty(sub)); // 很好的迭代思想
                q->ptr.tp = NULL;
    
                free(sub); // 释放动态内存
                free(hsub);
            }
        }
    }
    // 时间复杂度: O(广义表长度)
    
    int GListDepth(GList L) {
        if (!L) {
            return 1;
        }
        if (L->tag == ATOM) {
            return 0;
        }
        int max = 0;
        int dep = 0;
        // for (GList p = L; p; p = p->ptr.tp) {
        //     dep = GListDepth(p->ptr.hp);
        //     if (dep > max) max = dep;
        // }
        GList p = L->ptr.hp;
        while (p != NULL) {
                int depth = GListDepth(p);
                if (depth > max) {
                    max = depth;
                }
                p = p->ptr.tp; // 尾指针指向尾部子表
            }
        return max + 1;
    }
    // 时间复杂度: O(节点数)
    
    int main() {
        char* str = "((),(e),(a,(b,(f,(w,n),q),c,d)))";
        GList L;
        CreateGList(&L, str);
        printf("success\n");
        printf("%d\n", GListDepth(L));
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 修改了问题 7月9日
  • 修改了问题 7月9日
  • 创建了问题 7月9日

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥20 spring boot集成mqtt的使用问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物