没有合适的资源?快使用搜索试试~ 我知道了~
c语言编程笔试题大全.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 67 浏览量
2023-07-29
10:39:17
上传
评论
收藏 115KB DOC 举报
温馨提示
试读
32页
可靠,放心下载
资源推荐
资源详情
资源评论
c 语言编程笔试题大全
2007 年 03 月 19 日 星期一 00:15
1、线形表 a、b 为两个有序升序的线形表,编写一程序,使两个有序线形表合并成一个有序升序线形表
答案在 请化大学 严锐敏《数据结构第二版》第二章例题,数据结构当中,这个叫做:两路归并排序
Linklist *unio(Linklist *p,Linklist *q){
linklist *R,*pa,*qa,*ra;
pa=p;
qa=q;
R=ra=p;
while(pa->next!=NULL&&qa->next!=NULL){
if(pa->data>qa->data){
ra->next=qa;
qa=qa->next;
}
else{
ra->next=pa;
pa=pa->next;
}
}
if(pa->next!=NULL)
ra->next=pa;
if(qa->next!=NULL)
ra->next==qa;
return R;
}
2.单连表的建立,把'a'--'z'26 个字母插入到连表中,还要打印!
node *p=NULL;
node *head=(node*)malloc(sizeof(node));
head->next=NULL;
p=head;
int longth='a'-'z';
int i;
while(i<=longth)
{
node *temp;
temp = (node *)malloc(sizeof(node));
temp->data = i+'a';temp->next=NULL;p=temp;
p->next=p;
i++;
}
return head;
print(head);
3、约瑟夫环:
约瑟夫环问题的一种描述是:编号为 1.2.3…….n 的 n 个人按顺时针方向围坐一圈,每人手持一个密码(正整
数),开始任意选一个整数作为报数上限值,从第一 个人开始顺时针自 1 开始顺序报数,报到 m 时停止报数。
报 m 的人出列,将他的密码作为新的 m 值,从他顺时针下一个人开始重新从 1 开始报数,如此下去直到所有 的人
全部都出列为止。试设计程序实现。
要求:利用循环链表存储结构模拟此过程,按照出列的顺序打印各人的编号。
测试数据:m 的值初始为 20:密码 3 ,1,7,2,4,8,4。
正确的结果:6,1,4,7,2,3,5。
提示:程序运行后首先要求用户指定初始报数上限。然后读取各人的密码。设 n<30
******算法思想:利用循环链表*******
******问题的规模是 n 个人,每次杀掉第 m
******个人,n 和 m 由用户输入,程序输出最后
******一个活着的人的编号*************/
#include <iostream>
using namespace std;
/*****约瑟夫问题的节点*******/
typedef struct node
{
int number;
node * next;
}yuesefu_node;
/**********建立 n 个人的循环链表*******/
yuesefu_node * create_chink(int n)
{
yuesefu_node *head; //头指针
yuesefu_node * p=new yuesefu_node; //p 是第一个约瑟夫节点
head=p;
p->number=1;
p->next=NULL;
int i=2;
while(i<=n)
{
yuesefu_node *q=new yuesefu_node; //新增一个约瑟夫节点
q->number=i;
if (i==n)
{
q->next=head;
}
else
{
q->next=NULL;
}
p->next=q;
p=q;
i++;
}
return head;
}
void out_chink(yuesefu_node *head)
{
yuesefu_node *p=head;
while(p->next!=head)
{
cout<<p->number<<" ";
p=p->next;
}
cout<<p->number<<endl;
}
void kill_out(yuesefu_node *head,int n,int m)
{
if (n<m)
{
cout<<"************************"<<endl;
cout<<"最后活着的人的编号为: ";
out_chink(head);
return;
}
yuesefu_node *p=head;
int count=1;
while(count<m-1)
{
p=p->next;
count++;
}
yuesefu_node *p_pre=p; //记住要删除节点的前一个指针
p=p->next;
cout<<"本次杀掉的人的编号为:"<<p->number<<endl;
p_pre->next=p->next;
delete(p);
head=p_pre->next;//指定刚被杀的人的下一个人为下一轮的第一个
cout<<"本轮后活着的人的编号为: ";
out_chink(head);
kill_out(head,n-1,m);
}
void main()
{
int n,m;
cout<<"please input n 和 m:"<<endl;
cin>>n>>m;
yuesefu_node *head=create_chink(n);
kill_out(head,n,m);
}
4、二叉树的遍历及实现
所谓前根遍历,就是根结点最先遍历,其次左子树,最后右子树。
1.递归遍历
前根遍历二叉树的递归遍历算法描述为:
若二叉树为空,则算法结束;
否则
(1)输出根结点;
(2)前根遍历左子树;
(3)前根遍历右子树;
算法如下:
void preorder(bitree *root)
{ bitree *p;
p=root;
if(p!=NULL)
{cout<<p->data<<" ";
preorder(p->lchild);
preorder (p->rchild);}
}
2.非递归遍历
利用一个一维数组作为栈,来存储二叉链表中结点,算法思想为:
从二叉树根结点开始,沿左子树一直走到末端(左孩子为空)为止,在走的过程中,访问所遇结点,并
依次把所遇结点进栈,当左子树为空时,从栈顶退出某结点,并将指针指向该结点的右孩子。如此重复,直到栈
为空或指针为空止。
算法如下:
void preorder1(bitree *root)
{ bitree *p,*s[100];
int top=0; //top 为栈顶指针
p=root;
while((p!=NULL)||(top>0))
{ while(p!=NULL)
{cout<<p->data<<" ";
s[++top]=p; p=p->lchild; }
p=s[top--]; p=p->rchild;
}
}
中根遍历
所谓中根遍历,就是根在中间,先左子树,然后根结点,最后右子树。
1.递归遍历
算法如下:
中根遍历二叉树的递归遍历算法描述为:
若二叉树为空,则算法结束;
否则
⑴中根遍历左子树;
⑵输出根结点;
⑶中根遍历右子树。
void inorder(biteee *root)
{ bitree *p;
p=root;
if (p!=NULL)
{ inorder(p->lchild);
cout<<p->data<<" ";
inorder(p->rchild);
}
}
2.非递归遍历
同样利用一个一维数组作栈,来存贮二叉链表中结点,算法思想为:
从二叉树根结点开始,沿左子树一直走到末端(左孩子为空)为止,在走的过程中,把依次遇到的结点进栈,待左
子树为空时,从栈中退出结点并访问,然后再转向它的右子树。如此重复,直到栈空或指针为空止。
算法如下:
void inorder1( bitree *root)
{ bitree *p,*s[100]; //s 为一个栈
int top=0;
p=root;
while((p!=NULL)||(top>0))
{ while(p!=NULL)
{s[++top]=p;p=p->lchild;}
p=s[top--];
cout<<p->data<<" ";
p=p->rchild;
}
}
后根遍历
所谓后根遍历,就是根在最后,即先左子树,然后右子树,最后根结点。
1.递归遍历
后根遍历二叉树的递归遍历算法描述为:
若二叉树为空,则算法结束;
否则
(1)后根遍历左子树:
(2)后根遍历历子树;
(3)访问根结点。
算法如下:
void postorder( bitree *root)
{ bitree *p;
p=root;
if (p!=NULL)
{ postorder (p->lchild);
postorder (p->rchild);
cout<<p->data<<" ";
}
}
2.非递归遍历
利用栈来实现二叉树的后序遍历要比前序和中序遍历复杂得多,在后序遍历中,当搜索指针指向某一个结点时,
不能马上进行访问,而先要遍历左子树,所以此结点应先进栈保存,当遍历完它的左子树后,再次回到该结点,
还不能访问它,还需先遍历其右子树,所以该 结点还必须再次进栈,只有等它的右子树遍历完后,再次退栈时,
才能访问该结点。为了区分同一结点的两次进栈,引入一个栈次数的标志,一个元素第一次进栈标志为 0,第二
剩余31页未读,继续阅读
资源评论
折竹丶
- 粉丝: 1w+
- 资源: 740
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 3层独栋别墅图纸编号D093-三层-13.90&20.70米-施工图.dwg
- IIS多站点管理工具,可支持同时运行多个IIS服务
- 装备换元宝-3.txt
- 三层别墅图纸编号D092-三层-17.70&19.65米-建施图.dwg
- 三层别墅图纸编号D091-三层-09.30&11.70米-建施图.dwg
- 三层别墅图纸编号D090-三层-12.00&12.70米-施工图.dwg
- 3层独栋别墅图纸编号D089-三层-11.50&14.50米- 施工图.dwg
- 3层独栋别墅建筑高度9.38米D088-三层-11.86&09.26米-施工图.dwg
- 三层别墅图纸编号D087-三层-22.00&10.50米-施工图.dwg
- maven-resources-production java.lang.NegativeArraySizeException
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功