C++ Exercises(十八)
下了份《46家公司笔试题》做做,好久没接触这些基本知识了,熟悉下
1.完成下列程序
*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......*.......
#include <iostream>
using namespace std;
const int ROWS = 8;//行数
void DoPrint()
{
int i,j,k;
for(i=1;i<=ROWS;++i)
{
for(j=1;j<=i;++j)
{
cout<<"*";
for(k=1;k<=i-1;++k)cout<<".";
}
cout<<endl;
}
}
int main()
{
DoPrint();
return 0;
}
using namespace std;
const int ROWS = 8;//行数
void DoPrint()
{
int i,j,k;
for(i=1;i<=ROWS;++i)
{
for(j=1;j<=i;++j)
{
cout<<"*";
for(k=1;k<=i-1;++k)cout<<".";
}
cout<<endl;
}
}
int main()
{
DoPrint();
return 0;
}
2.完成程序,实现对数组的降序排序
#include <iostream>
using namespace std;
void printArray(int a[],int n)
{
for(int i=0;i<n;++i)
cout<<a[i]<<"\t";
cout<<endl;
}
int partion(int a[],int left,int right)
{//分割
int temp = a[left];
while (left<right)
{
while (left<right && a[right]<=temp)--right;
a[left] = a[right];
while (left<right && a[left]>=temp)++left;
a[right] = a[left];
}
a[left] = temp;
return left;
}
void quicksort(int a[],int left,int right)
{//快速排序
if(left>=right)
return;
int pivotloc;
pivotloc = partion(a,left,right);
quicksort(a,left,pivotloc-1);
quicksort(a,pivotloc+1,right);
}
int main()
{
int array[] = {45,56,76,234,1,34,23,2,3};
int size = sizeof(array)/sizeof(array[0]);
quicksort(array,0,size-1);
printArray(array,size);
return 0;
}
using namespace std;
void printArray(int a[],int n)
{
for(int i=0;i<n;++i)
cout<<a[i]<<"\t";
cout<<endl;
}
int partion(int a[],int left,int right)
{//分割
int temp = a[left];
while (left<right)
{
while (left<right && a[right]<=temp)--right;
a[left] = a[right];
while (left<right && a[left]>=temp)++left;
a[right] = a[left];
}
a[left] = temp;
return left;
}
void quicksort(int a[],int left,int right)
{//快速排序
if(left>=right)
return;
int pivotloc;
pivotloc = partion(a,left,right);
quicksort(a,left,pivotloc-1);
quicksort(a,pivotloc+1,right);
}
int main()
{
int array[] = {45,56,76,234,1,34,23,2,3};
int size = sizeof(array)/sizeof(array[0]);
quicksort(array,0,size-1);
printArray(array,size);
return 0;
}
3,费波那其数列,1,1,2,3,5……编写程序求第十项。可以用递归,也可以用其他
方法,但要说明你选择的理由。
#include <iostream>
using namespace std;
int Pheponatch(int N)
{//返回斐波那契数列第N项
int a[100]={1,1};
for (int i=2;i<N;++i)
{
a[i] = a[i-1]+a[i-2];
}
return a[N-1];
}
int main()
{
cout<<Pheponatch(4)<<endl;
return 0;
}
using namespace std;
int Pheponatch(int N)
{//返回斐波那契数列第N项
int a[100]={1,1};
for (int i=2;i<N;++i)
{
a[i] = a[i-1]+a[i-2];
}
return a[N-1];
}
int main()
{
cout<<Pheponatch(4)<<endl;
return 0;
}
4,错误原因:指针未初始化,
改正后的代码:
#include <stdio.h>
#include <malloc.h>
#include <iostream>
using namespace std;
struct TNode
{
TNode* left;
TNode* right;
int value;
};
TNode* root=NULL;
void append(int N)
{
TNode* NewNode=(TNode *)malloc(sizeof(TNode));
NewNode->value=N;
NewNode->left = NULL;
NewNode->right = NULL;
if(root==NULL)
{
root=NewNode;
return;
}
else
{
TNode* temp;
temp=root;
while((N>=temp->value && temp->left!=NULL) || (N<temp->value && temp->right!=NULL))
{
while(N>=temp->value && temp->left!=NULL)
temp=temp->left;
while(N<temp->value && temp->right!=NULL)
temp=temp->right;
}
if(N>=temp->value)
temp->left=NewNode;
else
temp->right=NewNode;
return;
}
}
void printTree(TNode* t)
{
if (t!=NULL)
{
printf("%d\n",t->value);
printTree(t->left);
printTree(t->right);
}
}
int main()
{
append(63);
append(45);
append(32);
append(77);
append(96);
append(21);
append(17); // Again, 数字任意给出
printTree(root);
return 0;
}
#include <malloc.h>
#include <iostream>
using namespace std;
struct TNode
{
TNode* left;
TNode* right;
int value;
};
TNode* root=NULL;
void append(int N)
{
TNode* NewNode=(TNode *)malloc(sizeof(TNode));
NewNode->value=N;
NewNode->left = NULL;
NewNode->right = NULL;
if(root==NULL)
{
root=NewNode;
return;
}
else
{
TNode* temp;
temp=root;
while((N>=temp->value && temp->left!=NULL) || (N<temp->value && temp->right!=NULL))
{
while(N>=temp->value && temp->left!=NULL)
temp=temp->left;
while(N<temp->value && temp->right!=NULL)
temp=temp->right;
}
if(N>=temp->value)
temp->left=NewNode;
else
temp->right=NewNode;
return;
}
}
void printTree(TNode* t)
{
if (t!=NULL)
{
printf("%d\n",t->value);
printTree(t->left);
printTree(t->right);
}
}
int main()
{
append(63);
append(45);
append(32);
append(77);
append(96);
append(21);
append(17); // Again, 数字任意给出
printTree(root);
return 0;
}
5,设计函数 int atoi(char *s) 。
#include <iostream>
using namespace std;
int my_aoti(char* s)
{//字符串转化为整数
int len = strlen(s);
int result = 0;
for (int i=0;i<len;++i)
{
result = result*10+s[i]-'0';
}
return result;
}
int main()
{
char* str = "123";
int num = my_aoti(str);
cout<<num<<endl;
return 0;
}
using namespace std;
int my_aoti(char* s)
{//字符串转化为整数
int len = strlen(s);
int result = 0;
for (int i=0;i<len;++i)
{
result = result*10+s[i]-'0';
}
return result;
}
int main()
{
char* str = "123";
int num = my_aoti(str);
cout<<num<<endl;
return 0;
}
6,实现双向链表删除一个节点P,在节点P 后插入一个节点,写出这两个函数
//双向链表节点
struct DbLinkNode
{
struct DbLinkNode* prev;//前一个节点
struct DbLinkNode* next;//后一个节点
int value;
};
bool Delete(DbLinkNode* head,int num)
{//在双向链表(带头节点)中删除第一个值为num的节点
if (head->next!=NULL)
{//表中有节点存在
struct DbLinkNode* pre = head,p = head->next;
while (p!=NULL&&p->value!=num)
{
pre = p;
p = p->next;
}
if (p==NULL)
{//没找到
return false;
}
else if (p->next==NULL)
{//待删除的是最后一个节点
pre->next = NULL;
delete p;
p = NULL;
}
else
{//待删除的不是最后一个
pre->next = p->next;
p->next->prev = pre;
delete p;
p = NULL;
}
return true;
}
else
{
return false;
}
}
bool Insert(struct DbLinkNode* head,int target,int num)
{//在节点target后插入节点num
if (head->next!=NULL)
{//表中有节点存在
struct DbLinkNode* p = head->next;//指向第一个节点
struct DbLinkNode* newNode = (struct DbLinkNode*)malloc(sizeof(DbLinkNode));
newNode->value = num;
newNode->next = NULL;
newNode->prev = NULL;
while (p!=NULL && p->value!=num)
{
p = p->next;
}
if (p==NULL)
{
free(newNode);
newNode = NULL;
return false;
}
else if (p->next==NULL)
{//目标节点是最后一个节点,新节点插入为尾节点
p->next = newNode;
newNode->prev = p;
}
else
{//目标节点不是最后一个
newNode->next = p->next;
p->next->prev = newNode;
p->next = newNode;
newNode->prev = p;
}
return true;
}
else
{
return false;
}
}
struct DbLinkNode
{
struct DbLinkNode* prev;//前一个节点
struct DbLinkNode* next;//后一个节点
int value;
};
bool Delete(DbLinkNode* head,int num)
{//在双向链表(带头节点)中删除第一个值为num的节点
if (head->next!=NULL)
{//表中有节点存在
struct DbLinkNode* pre = head,p = head->next;
while (p!=NULL&&p->value!=num)
{
pre = p;
p = p->next;
}
if (p==NULL)
{//没找到
return false;
}
else if (p->next==NULL)
{//待删除的是最后一个节点
pre->next = NULL;
delete p;
p = NULL;
}
else
{//待删除的不是最后一个
pre->next = p->next;
p->next->prev = pre;
delete p;
p = NULL;
}
return true;
}
else
{
return false;
}
}
bool Insert(struct DbLinkNode* head,int target,int num)
{//在节点target后插入节点num
if (head->next!=NULL)
{//表中有节点存在
struct DbLinkNode* p = head->next;//指向第一个节点
struct DbLinkNode* newNode = (struct DbLinkNode*)malloc(sizeof(DbLinkNode));
newNode->value = num;
newNode->next = NULL;
newNode->prev = NULL;
while (p!=NULL && p->value!=num)
{
p = p->next;
}
if (p==NULL)
{
free(newNode);
newNode = NULL;
return false;
}
else if (p->next==NULL)
{//目标节点是最后一个节点,新节点插入为尾节点
p->next = newNode;
newNode->prev = p;
}
else
{//目标节点不是最后一个
newNode->next = p->next;
p->next->prev = newNode;
p->next = newNode;
newNode->prev = p;
}
return true;
}
else
{
return false;
}
}
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。
posted on 2009-02-18 20:21 Phinecos(洞庭散人) 阅读(908) 评论(0) 编辑 收藏 举报