我最后一次分配学期时苦苦挣扎。不寻找“答案”只是寻找一些见解..自从我上一次实际的编程课以来已经很长时间了,因为这是一个数据结构类,我们不会审查代码。赋值:
用于在数组中搜索以及搜索和遍历树的程序。
到目前为止,
- 要求用户输入输入数据文件的名称
- 以未排序的顺序将150个随机排序值从文件加载到数组中。打印出阵列以确保维持随机顺序。
- 将相同的150个随机排序数加载到二叉搜索树中。以前缀,中缀和后缀顺序打印树的遍历,以确保正确创建二叉树。
- 将相同的150个随机数序列号加载到数组中。使用您要编写的任何排序例程来按升序排序数字。打印出阵列以确保数字按升序排列。
- 醇>
使用计数循环要求用户输入10个数字 - 用户将输入列表中的5个数字和5个不在列表中的数字。
一个。搜索每个数据结构并计算查找值所需的比较次数,或确定该数字不在列表中。
我。未排序的数组 - 使用线性搜索
- II。二进制搜索树 - 二进制搜索
- III。排序数组 - 二进制搜索
湾以每种搜索的表格格式打印结果
- 我。值
- II。 “找到”/“找不到”
- III。线性搜索比较次数
- IV。比较二进制搜索树的数量
- 诉比较二进制搜索数组
℃。打印摘要
- 我。比较线性搜索总数
- II。二进制搜索树的比较总数
- III。二进制搜索数组的比较总数
代码,我知道我已经离开了:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
struct bintreenode {
int value;
struct bintreenode* l;
struct bintreenode* r;
} *root = NULL, *temp = NULL;
typedef struct bintreenode N;
void insert();
N* bt(int arr[], int, int);
N* new(int);
void infix(N* t);
void prefix(N* t);
void postfix(N* t);
void main() {
ifstream inputData;
ofstream outputData;
string fileName;
cout << "Enter the name of the input data file: " << endl;
//asks user to input filename
cin >> fileName; //inputs user input into fileName
return 1;
ifstream file("file.txt");
if (file.is_open()) {
string myArray[150];
for (int i = 0; i < 150; ++i) {
file >> myArray[i];
}
}
int ch, i, n;
int arr[] = {
1, 2, 3, 4, 136, 137, 138, 139, 56, 78, 9, 10,
16, 17, 18, 58, 59, 60, 61, 19, 20, 21, 22, 23,
24, 118, 119, 120, 121, 25, 26, 27, 28, 29, 128,
129, 130, 131, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 145, 146, 147, 148, 11, 12, 13,
14, 15, 47, 48, 49, 55, 56, 57, 62, 63, 64, 30, 31,
32, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 142, 143,
144, 75, 76, 77, 78, 79, 50, 51, 52, 53, 80, 81, 82,
83, 85, 91, 92, 96, 93, 94, 95, 97, 98, 99, 100, 101,
102, 103, 104, 105, 54, 106, 107, 108, 109, 110, 111,
112, 113, 114, 115, 116, 117, 122, 123, 124, 125, 126,
127, 132, 133, 84, 86, 87 88, 89, 90, 134, 135, 140, 141,
149, 150
};
n = sizeof(arr) / sizeof(arr[0]);
printf("\n1- infix\n");
printf("2 - postfix\n");
printf("\nEnter 10 numbers in the list and 10 numbers not in the list : ");
scanf("%d", &ch);
switch (ch) {
case 1:
root = bt(arr, 0, n - 1);
printf("Given infix traversal as input\n");
for (i = 0; i <= 6; i++)
printf("%d->", arr[i]);
printf("\nprefix traversal of tree\n");
prefix(root);
printf("\ninfix traversal of tree\n");
infix(root);
printf("\npostfix traversal of tree\n");
postfix(root);
break;
case 2:
insert();
printf("\nprefix traversal of tree\n");
prefix(root);
printf("\nInfix traversal of tree\n");
infix(root);
printf("\npostfix traversal of tree\n");
postfix(root);
break;
default:
printf("enter correct choice");
}
/* To create a binary search tree */
N* bt(int arr[], int first, int last) {
int mid;
N* root = (N*)malloc(sizeof(N));
if (first > last)
return NULL;
mid = (first + last) / 2;
root = new(arr[mid]);
root->l = bt(arr, first, mid - 1);
root->r = bt(arr, mid + 1, last);
return root;
}
/* to print infix of tree */
void infix(N* t) {
if (t->l != NULL)
infix(t->l);
printf("%d->", t->value);
if (t->r != NULL)
infix(t->r);
}
/* to print prefix traversal of tree */
void prefix(N* t) {
printf("%d->", t->value);
if (t->l != NULL)
infix(t->l);
if (t->r != NULL)
infix(t->r);
}
/* to print postfix traversal of tree */
void postfix(N* t) {
if (t->l != NULL)
infix(t->l);
if (t->r != NULL)
infix(t->r);
printf("%d->", t->value);
}
bool tree::search(int num) {
node* temp = head;
while (temp != NULL) {
if (temp->data == num)
break;
if (num > temp->data)
temp = temp->right;
else
if (num < temp->data)
temp = temp->left;
}
if (temp == NULL)
printf("Not Found");
if (temp->data == num)
printf("Found");
return false;
}
}
答案 0 :(得分:1)
以下是我发现的一些问题:
#include <stdio.h>
#include <iostream>
#include <fstream>
使用C或C ++流;更喜欢C ++流。如果您需要stdio.h
我们<cstdio>
的定义
请勿使用cout
和printf
。决定;非此即彼。
使用允许读者分隔标识符中隐藏名称的编码样式。 差:
struct bintreenode
更好:
struct bin_tree_node
struct binTreeNode
struct BinTreeNode
编码样式:名称不是单个字母
首选单个字母标识符的名称:
差:
struct bintreenode *l;
struct bintreenode *r;
更好:
struct bintreenode *left_subtree;
struct bintreenode *right_subtree;
使用更具描述性的标识符对您的可执行文件没有影响,对构建过程的影响可以忽略不计。它对阅读代码的人有很大的积极影响,包括你。
您提示用户输入文件名,但您需要硬编码:
cout << "Enter the name of the input data file: " << endl;
//asks user to input filename
cin >> fileName; //inputs user input into fileName
return 1;
ifstream file("file.txt");
此外,上面的return 1
将导致执行在此时停止。不再执行,因此永远不会打开文件。
不要在结构后命名变量。 差:
int arr[] = {1, /*...*/, 150};
n = sizeof(arr) / sizeof(arr[0]);
更好:
static const int test_values[] = {1, /* ... */, 150};
static const unsigned int quantity_test_values =
sizeof(test_values) / sizeof(test_values[0]);
如果不修改结构的内容,则更喜欢使用const
前缀
如果变量不是全局变量,则更喜欢将static
添加到声明中。
您的文字可能无法完全打印,因为某些文字可能位于缓冲区中。通常打印换行符(&#39; \ n&#39;)或std::endl
将刷新缓冲区并打印剩余的文本。
在发布之前使用&#34;为什么它不起作用&#34;问题,使用调试器并单步执行每个语句。检查变量的正确值
添加打印语句(a.k.a。cout
)以打印输出值。