两个辅助指针变量挖字符串(4种实现方式)

两个辅助指针挖字符串1) 使用第二种内存模型 主调函数分配内存 #include #include #include #include /*函数功能 根据字符c来分割字符串str*/ int splitStr(const char *str,char c ,char buf[10][20],int *num)
摘要由CSDN通过智能技术生成

两个辅助指针挖字符串

内存模型图


1) 使用第二种内存模型 主调函数分配内存

    #include<stdio.h>  
    #include<stdlib.h>  
    #include <string.h>  
    #include <ctype.h>  
    /*函数功能 根据字符c来分割字符串str*/  
    int splitStr(const char *str,char c ,char buf[10][20],int *num)  
    {  
        char* p = NULL,*pTmp = NULL;//两个辅助指针变量  
        int tmpcount = 0,len;  
        p = str;  
        pTmp = str;  
        do   
        {  
            p = strchr(p,c);  
              
            if (p!=NULL)  
            {  
                if (p-pTmp>0)  
                {  
                    strncpy(buf[tmpcount],pTmp,p-pTmp);  
                    buf[tmpcount][p-pTmp] = '\0';  
                    //printf("%s\n",buf[tmpcount]);  
                    tmpcount++;  
                    pTmp = p = p+1;  
                    len = strlen(p);//用来保存最后一个字符串的长度  
                }     
            }  
            else  
            {  
                //拷贝最后一个分割的字符串包括\0  
                strncpy(buf[tmpcount],pTmp,len+1);  
                break;  
            }  
              
        } while (*p!='\0');  
        *num=tmpcount+1;  
        return 0;  
    }  
    /*函数功能 打印二维数组*/  
      
    void printArr(char a[10][20],int n)  
    {  
        int i;  
        for (i=0;i<n;i++)  
        {  
            printf("%s\n",*(a+i));  
        }  
    }  
      
    int main()  
    {  
        char *input="abcdefg,hjkln,sssss,kkk,hhh,j";  
        char ctemp = ',';  
        char myArr[10][20]={0};  
        char *tmp;  
          
        int ret;  
        int n,i;  
          
        ret = splitStr(input,ctemp,myArr,&n);  
        if (ret!=0)  
        {  
            printf("er
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的问题,我会尽量详细地回答。首先,我们需要明确一下这个问题的需求和要求: 需求: 1. 根据字符串表达式构造二叉树。 2. 计算表达式的值。 3. 使用二叉链表表示二叉树。 4. 通过遍历实现计算。 要求: 1. 使用 C 语言编写代码。 2. 提供实验思路和核心代码思想。 3. 对每一行代码和每一个变量进行注释。 接下来,我将按照这个需求和要求,分别讲解如何完成这个问题。 1. 根据字符串表达式构造二叉树 对于这个需求,我们可以使用一个栈来辅助完成。具体思路如下: 1. 创建一个空栈,用于保存操作符。 2. 从左到右遍历表达式字符串。 3. 如果遇到操作数,直接创建一个节点并入栈。 4. 如果遇到操作符,先创建一个节点,然后从栈中弹出两个节点作为其左右子节点,并将这个节点入栈。 5. 遍历完整个表达式字符串后,栈中只剩下一个节点,即根节点。将其弹出即可。 下面是代码实现和注释: ```c // 定义二叉树节点 typedef struct TreeNode { char val; // 节点的值,可能是操作数也可能是操作符 struct TreeNode* left; // 左子节点 struct TreeNode* right; // 右子节点 } TreeNode; // 定义栈 typedef struct Stack { int top; // 栈顶指针,初始值为 -1 TreeNode* data[MAX_SIZE]; // 栈的数据,存储节点指针 } Stack; // 创建一个空栈 Stack* createStack() { Stack* stack = (Stack*)malloc(sizeof(Stack)); stack->top = -1; return stack; } // 判断栈是否为空 int isEmpty(Stack* stack) { return stack->top == -1; } // 判断栈是否已满 int isFull(Stack* stack) { return stack->top == MAX_SIZE - 1; } // 入栈操作 void push(Stack* stack, TreeNode* node) { if (isFull(stack)) { printf("Error: Stack is full.\n"); return; } stack->data[++stack->top] = node; } // 出栈操作 TreeNode* pop(Stack* stack) { if (isEmpty(stack)) { printf("Error: Stack is empty.\n"); return NULL; } return stack->data[stack->top--]; } // 根据字符串表达式构造二叉树 TreeNode* buildTree(char* expression) { Stack* stack = createStack(); // 创建一个空栈 for (int i = 0; expression[i] != '\0'; i++) { // 从左到右遍历表达式字符串 char c = expression[i]; if (isdigit(c)) { // 如果遇到操作数,创建一个节点并入栈 TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->val = c; node->left = NULL; node->right = NULL; push(stack, node); } else { // 如果遇到操作符,创建一个节点,并从栈中弹出两个节点作为其左右子节点 TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->val = c; node->right = pop(stack); node->left = pop(stack); push(stack, node); // 将这个节点入栈 } } TreeNode* root = pop(stack); // 遍历完整个表达式字符串后,栈中只剩下一个节点,即根节点 return root; } ``` 2. 计算表达式的值 对于这个需求,我们可以使用递归来计算表达式的值。具体思路如下: 1. 如果当前节点是操作数,直接返回它的值。 2. 如果当前节点是操作符,递归计算其左右子节点的值,并根据操作符进行运算。 下面是代码实现和注释: ```c // 计算表达式的值 int calculate(TreeNode* root) { if (root == NULL) { return 0; } if (root->left == NULL && root->right == NULL) { // 如果当前节点是操作数,直接返回它的值 return root->val - '0'; } int leftValue = calculate(root->left); // 递归计算左子树的值 int rightValue = calculate(root->right); // 递归计算右子树的值 switch (root->val) { // 根据操作符进行运算 case '+': return leftValue + rightValue; case '-': return leftValue - rightValue; case '*': return leftValue * rightValue; case '/': return leftValue / rightValue; default: return 0; } } ``` 3. 使用二叉链表表示二叉树 对于这个需求,我们已经在构造二叉树的过程中使用了二叉链表表示二叉树。具体来说,我们定义了一个 `TreeNode` 结构体,其中包含左右子节点的指针。这样就可以通过指针来表示节点之间的关系。 4. 通过遍历实现计算 对于这个需求,我们可以使用前序遍历来实现。具体思路如下: 1. 如果当前节点是操作数,直接输出它的值。 2. 如果当前节点是操作符,输出它的值,并递归遍历其左右子节点。 下面是代码实现和注释: ```c // 前序遍历二叉树,并输出节点的值 void preOrderTraversal(TreeNode* root) { if (root == NULL) { return; } printf("%c ", root->val); preOrderTraversal(root->left); preOrderTraversal(root->right); } // 主函数 int main() { char* expression = "23+4*5-"; TreeNode* root = buildTree(expression); printf("Expression: %s\n", expression); printf("Tree: "); preOrderTraversal(root); printf("\n"); int result = calculate(root); printf("Result: %d\n", result); return 0; } ``` 至此,我们已经完成了这个问题的所有需求和要求。完整代码如下:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值