数组越界 内存泄露-指针或数组越界实在找不到问题了

问题描述

指针或数组越界实在找不到问题了

http://wenku.baidu.com/link?url=e_SMeDv5empBQO07OE4vnfFpYDsc_nZ61H-j6OoSTbwN8J24IgKdxnTHnHk51sKnRx0IbujnnQepn-Ml5_l6n3XJGomwgwt6zxoIdF2E32i

实验五,要交OJ,OJ上题目略有不同。

输入有以下四种情况:

当输入大写英文字母'T'时,表示下一行是文本内容,包含若干英文单词、标点符号以及阿拉伯数字,用于构建二叉查找树。文本内容以字符‘@’结束,文本中的每个英文单词的长度不超过30个字母。

当输入大写英文字母'S'时,表示后面跟着的若干行都是停用词,每个停用词占一行,当某行是字符‘#’时,表示停用词输入完毕。对每个停用词,都需要删除二叉查找树中的相应结点,即:每输入一个停用词,执行一次删除结点的操作。

当输入大写英文字母'V'时,表示中序遍历二叉查找树。遍历结果中的每个单词占一行,先输出该单词,然后输出一个空格,再输出该单词出现的次数。

当输入大写英文字母'Q'时,表示后面跟着的若干行都是查询词,每个查询词占一行,当某行是字符‘#’时,表示查询词输入完毕。对每个查询词,都需要在二叉查找树中的搜索相应结点,如果找到,则输出该单词及其出现次数,如果未找到,则输出-1。每个查询词的查询结果占一行,先输出该单词,然后输出一个空格,再输出该单词出现的次数。

当输入大写英文字母'X'时,表示输入结束。

runtime error
找了一上午了找不到错误...
代码如下

 #include<iostream>
#include<string>
using namespace std;
class Node{
    string key;
    int count;
    Node *leftChild;
    Node *rightChild;
public:
    Node(string str){
        key = str;
        count = 1;
        leftChild = NULL;
        rightChild = NULL;
    }
    friend class BinarySearchTree;
};
class BinarySearchTree{
    Node *root;
public:
    BinarySearchTree(){ root = NULL; };
    ~BinarySearchTree(){};
    Node *Search(string str,Node *&,int);//查找
    void InOrder( Node*);//中序遍历
    void Insert(string &, Node *&,BinarySearchTree &);//插入一个元素
    void Delete(string &, Node*&);//删除一个元素
    Node *GetRoot();//获得根节点
};
void BinarySearchTree::Insert(string &str, Node *&r,BinarySearchTree &BSTree){
    if (!root){
        root = new Node(str);
    }
    else{
        Node *p,*parent;
        p = BSTree.Search(str, r, 1);
        if (p)
            p->count++;
        else{
            p = new Node(str);
            parent = BSTree.Search(str,r,2);
            if (str<parent->key)
                parent->leftChild = p;
            else
                parent->rightChild = p;
        }
    }
}
Node *BinarySearchTree::Search(string str, Node*&r,int tag){
    if (!root){
        if (tag == 0)
            cout << -1 << endl;
        return root;
    }
    else{
        Node *p = r,*parent=NULL;
        while (p){
            if (str == p->key){
                if (tag == 0){
                    cout << p->key << " " << p->count << endl;
                    return p;
                }
                else if (tag == 1)
                    return p;
                else
                    return parent;
            }
            else{
                if (str < p->key){
                    parent = p;
                    p = p->leftChild;
                }
                else{
                    parent = p;
                    p = p->rightChild;
                }
            }
        }
        if (tag == 0){
            cout << -1 << endl;
            return p;
        }
        else if (tag == 1)
            return p;
        else
            return parent;
    }
}
void BinarySearchTree::InOrder(Node *r){
    if (r){
        InOrder(r->leftChild);
        cout << r->key << " " << r->count << endl;
        InOrder(r->rightChild);
    }
}
void BinarySearchTree::Delete(string &str, Node*&r){
    if (r){
        Node *p = Search(str, r, 1),*parent=Search(str,r,2),*del;
        if (p){
            if (!p->leftChild){
                if (!parent){
                    r = p->rightChild;
                    del = p;
                    delete del;
                }
                else if (parent->leftChild == p){
                    parent->leftChild = p->rightChild;
                    del = p;
                    delete del;
                }
                else if(parent->rightChild==p){
                    parent->rightChild = p->rightChild;
                    del = p;
                    delete del;
                }
            }
            else if (!p->rightChild){
                if (!parent){
                    r = p->leftChild;
                    del = p;
                    delete del;
                }
                else if (parent->leftChild == p){
                    parent->leftChild = p->leftChild;
                    del = p;
                    delete del;
                }
                else if (parent->rightChild == p){
                    parent->rightChild = p->leftChild;
                    del = p;
                    delete del;
                }
            }
            else{
                Node *rr = p, *r = p->leftChild;
                while (r->rightChild){
                    rr = r;
                    r = r->rightChild;
                }
                p->key = r->key;
                rr->rightChild = r->leftChild;
                del = r;
                delete del;
            }
        }
    }
}
Node *BinarySearchTree::GetRoot(){
    return root;
}
int main(){
    char ch;
    string str1, str2;
    BinarySearchTree BSTree;
    while (cin >> ch&&ch != 'X'){
        if (ch == 'T'){
            Node *r1;
            while (cin >> str1&&str1 != "@"){
                //判断选择str
                str2 = str1;
                int j;
                unsigned int i;
                for (i = j = 0; i< str1.size(); i++){
                    if (str1[i] >= 'a'&&str1[i] <= 'z'){
                        str2[j] = str1[i];
                        j++;
                    }
                    else if (str1[i] >= 'A'&&str1[i] <= 'Z'){
                        str2[j] = str1[i] + 32;
                        j++;
                    }
                }
                str2 = str2.substr(0,j);
                r1 = BSTree.GetRoot();
                if (str2.size())
                    BSTree.Insert(str2, r1,BSTree);
            }
        }
        else if (ch == 'S'){
            Node *r2;
            while (cin >> str1&&str1 != "#"){
                r2 = BSTree.GetRoot();
                BSTree.Delete(str1, r2);
            }
        }
        else if (ch == 'V'){
            BSTree.InOrder(BSTree.GetRoot());
        }
        else if (ch == 'Q'){
            Node *p, *r3;
            while (cin >> str1&&str1 != "#"){
                p = NULL, r3 = BSTree.GetRoot();
                BSTree.Search(str1, r3, 0);
            }
        }
    }
}
时间: 2024-09-26 23:28:05

数组越界 内存泄露-指针或数组越界实在找不到问题了的相关文章

《从缺陷中学习C/C++》——6.12 二维数组的内存泄露

6.12 二维数组的内存泄露 从缺陷中学习C/C++代码示例 int main() { int **pVal = new int* [2]; for(int i = 0; i < 2;i++){ pVal[i] = new int[3]; } delete [] pVal; return 0; } 现象&结果二维数组的释放,没有将每个元素逐一释放,造成内存泄露.使用valgrind检测工具检测,可以得到类似的信息,LEAK SUMMARY: definitely lost: 24 bytes

一个关于指针和数组的问题

问题描述 一个关于指针和数组的问题 #define _CRT_SECURE_NO_WARNINGS#include ""stdlib.h""#include ""stdio.h""#include ""string.h"" int main(){ char buf1[100] = { 0 }; char buf2[100] = { 0 }; char *p1 = buf1; char *

数组和内存控制

数组和内存控制 一. 数组初始化: a) 静态初始化: 初始化时由程序员指定数组元素值:系统会自动决定该数组的长度. b) 动态初始化: 初始化时,程序员指定数组的长度,系统默认为数组元素赋初始化. //采用静态初始化方式初始化第一个数组 String[] books = new String[] { "仓央嘉措诗集", "人生若只如初见", "当时只道是寻常" }; //采用静态初始化的简化形式初始化第二个数组 String[] names =

C++指针数组、数组指针、数组名及二维数组技巧汇总_C 语言

本文较为详细的分析了关于理解C++指针数组,数组指针,数组名,二维数组的一些技巧.是比较重要的概念,相信对于大家的C++程序设计有一定的帮助作用. 一.关于数组名 假设有数组: int a[3] = {1, 2, 3} 1.数组名代表数组第一个元素的地址,注意,不是数组地址(虽然值相等),是数组第一个元素地址,a 等同于 &a[0]; a+1是第二个元素的地址.比第一个元素地址a(或者&a[0])超出了一个整型指针的大小,在这里是4个字节(byte) cout << a <

Linux C 编程内存泄露检测工具(一):mtrace

前言 所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況,包括: mtrace dmalloc memwatch 1. mtrace mtrace是三款工具之中是最简单易用的,mtrace是一个C函數,在<mcheck.h>里声明及定义,函数原型为:     void mtrace(void);   其实mtrace是类似malloc_hook的malloc

谨防动态数组越界造成的内存泄露

在Delphi中,静态数组,编译器会自动检测下标是否越界,动态数组,不会自动检测. 注意:delphi中数组的下标索引是从0开始的,也就是说,如果数组长度为2,则下标索引分别为0,1   procedure TestArray; var   arr1: array[0..2] of byte; //静态数组   arr2: array of byte;//动态数组 begin   //静态数组   arr1[0] := 1;   arr1[1] := 2;   arr1[2] := 3;   a

c语言先用scanf初始化了一个字符指针,之后再定义字符数组出现内存不可读,在线等,急求

问题描述 c语言先用scanf初始化了一个字符指针,之后再定义字符数组出现内存不可读,在线等,急求 #include #include int main() { char*s; scanf("%s",s); //printf("%sn",s); //int n = strlen(s); //printf("%dn",n); char ret[56]; return 0; } 解决方案 s只是指针变量,没有分配内存 char*s; s = mall

c++中 类 指针数组 动态内存

问题描述 c++中 类 指针数组 动态内存 小白问题 关于类的指针数组中 动态内存分配问题 如何来运用 求讲解 解决方案 看看这文章http://blog.csdn.net/lanbing510/article/details/8112786 解决方案二: 你应该属于初学者,应该多看书,多编写程序,验证自己的思想,这才会进步的快,对于参考书,你可以参考这里让你走上牛人的C++学习书籍推荐,半年后你就会觉得你问的问题根本不叫问题,对于动态内存,你可以参考指针参数是如何传递内存的?和既然有了mall

谨防数组函数返回值造成的内存泄露

数组作为函数返回值时,非常容易引起内存泄露. 问题现象:Build应用程序后,提示非法内存访问:可是Compile应用程序却没有这个问题. 问题思考:函数返回值,在被调用函数中负责释放:局部变量也是在函数调用结束后在函数内被释放.如果一个函数调用了另外一个函数,却没有使用被调用函数的返回值,就有可能造成内存泄露.   //数组作为函数返回值 function StrToPByte(Const str: string;Var arrByte: array of byte): PByte;var