数据结构上机考试(楷神版)

插入排序

#include<cstdio>

using namespace std;

const int maxn = 1111;

int array1[maxn];

int array2[maxn];

//1 2 4 7 -1

void insert(int v){

for(int i = 0;i <= v; i++){

if(i == v){ //如果需要插入到最后一个位置

array2[i] = array1[v];

return;

}

if(array2[i] > array1[v]){ //找到插入位置

//将位置空出来,也就是从这里开始的元素全部后移一位

for(int j = v; j > i; j--)

array2[j] = array2[j - 1];

array2[i] = array1[v];

return;

}

}

}

int main(){

int n;

printf("请输入带排序元素的个数:");

scanf("%d",&n);

printf("请输入集合元素的值:");

for(int i = 0; i < n; i++)

scanf("%d",&array1[i]);

//选择排序

array2[0] = array1[0];

for(int i = 1; i < n; i++)

insert(i); //将元素array1[i]进行插入

printf("排序之后的元素为:");

for(int i = 0; i < n; i++)

printf("%d ",array2[i]);

return 0;

}

二叉树操作

#include<cstdio>

#include<algorithm>

using namespace std;

struct Node{

int value;      //节点值

Node *left;     //左孩子结点

Node *right;    //右孩子结点

};

int n;

int num = 0;//叶子结点个数

int num2 = 0;//树的深度

Node* BuildTree(int m){

if(m > n) return NULL;

printf("请输入%d/%d号结点的值:",m,n);

Node *node = (Node*)malloc(sizeof(Node));

int v;

scanf("%d",&v);

node -> value = v;

node -> left  = BuildTree(m * 2);

node -> right = BuildTree(m * 2 + 1);

return node;

}

void Pre(Node *node){ //前序遍历

if(node == NULL)

return;

printf("%d ",node -> value);

Pre(node -> left);

Pre(node -> right);

return;

}

void Mid(Node *node){ //中序遍历

if(node == NULL)

return;

Mid(node -> left);

printf("%d ",node -> value);

Mid(node -> right);

return;

}

void End(Node *node){ //后序遍历

if(node == NULL)

return;

Mid(node -> left);

Mid(node -> right);

printf("%d ",node -> value);

return;

}

void count_num(Node *node){

int son = 0;

if(node -> left == NULL) son++;

else count_num(node -> left);

if(node -> right == NULL) son++;

else count_num(node -> right);

if(son == 2)

num++;

return;

}

void count_deep(Node *node,int deep){

num2 = deep > num2 ? deep : num2;

if(node -> left != NULL)

count_deep(node -> left,deep + 1);

if(node -> right != NULL)

count_deep(node -> right,deep + 1);

return;

}

int main(){

printf("请输入二叉树的结点个数:"); scanf("%d",&n);

Node *root;

printf("请按照前序遍历的顺序输入节点值:\n");

root = BuildTree(1);

printf("前序遍历结果:");Pre(root);printf("\n");

printf("中序遍历结果:");Mid(root);printf("\n");

printf("后序遍历结果:");End(root);printf("\n");

count_num(root); //统计叶子结点个数

printf("二叉树的叶子结点个数为:");

printf("%d\n",num);

count_deep(root,1); //统计树的深度

printf("二叉树的深度为:");

printf("%d\n",num2);

}

冒泡排序

#include<cstdio>

using namespace std;

const int maxn = 1111l;

int main(){

int array[maxn];

int n;

printf("输入待排序元素的个数:");

scanf("%d",&n);

printf("请输入%d个集合元素:",n);

for(int i = 0; i < n; i++)

scanf("%d",&array[i]);

for(int i = 0; i < n; i++)

for(int j = 0; j < n - i - 1; j++){

if(array[j] > array[j + 1]){

int temp = array[j];

array[j] = array[j + 1];

array[j +1] = temp;

}

}

printf("排序之后集合元素为:");

for(int i = 0; i < n; i++)

printf("%d ",array[i]);

}

选择排序

#include<cstdio>

using namespace std;

const int maxn = 1111;

int array[maxn];

int main(){

int n,min;

printf("请输入集合的元素个数:");

scanf("%d",&n);

printf("请输入%d个集合元素的值:",n);

for(int i = 0; i < n; i++)

scanf("%d",&array[i]);

//进行选择排序

for(int i = 0; i < n; i++){

min = i;

for(int j = i + 1; j < n; j++){

if(array[j] < array[min])

min = j;

}

if(min != i){

int temp = array[i];

array[i] = array[min];

array[min] = temp;

}

}

printf("排序之后的集合为:");

for(int i = 0 ;i < n; i++)

printf("%d ",array[i]);

printf("\n");

}

有序链表的建立、插入、合并、删除指定结点

#include<cstdio>

#include<algorithm>

using namespace std;

/**************************

Shukai Han

[有序链表的建立、插入、

合并、删除指定结点]

**************************/

struct Node{                        //结点结构体

int value;

Node *next;

};

void insert(Node *head,int value){ //向有序链表插入元素

Node *p = head -> next;

Node *q = head;

while(p != NULL){

if(p -> value > value){

Node *tmp = (Node*)malloc(sizeof(Node));

tmp -> value = value;

q -> next = tmp;

tmp -> next  = p;

return;

}

p = p -> next;

q = q -> next;

}

//如果需要在链表最后插入

Node *tmp = (Node*)malloc(sizeof(Node));

tmp -> value = value; tmp -> next = NULL;

q -> next = tmp;

}

Node *CreateList(int n){

Node *head = (Node*)malloc(sizeof(Node)); //头结点内存申请

head -> next = NULL;

Node *q = head;

int v; //节点值

printf("请输入%d个链表元素的值:",n);

for(int i = 0; i < n; i++){

scanf("%d",&v);

insert(head,v);

}

return head;

}

void print(Node *head){ //链表的遍历

Node *now = head -> next;

printf("该链表的元素为: ");

while(now != NULL){

printf("%d ",now -> value);

now = now -> next;

}

printf("\n");

}

Node* combine(Node *head1,Node *head2){ //合并链表,储存在一条新的链表里返回

Node *head = (Node*)malloc(sizeof(Node));

head -> next = NULL;

Node *p = head1 -> next , *q = head2 -> next;

while(p != NULL){

insert(head,p -> value);

p = p -> next;

}

while(q != NULL){

insert(head,q -> value);

q = q -> next;

}

return head;

}

void Delete(Node *head,int pos){ //删除指定位置的链表结点

int now = 1;

Node *p = head;

Node *q = head -> next;

while(q != NULL){

if(now == pos){

p -> next = q -> next;

free(q);

return;

}

q = q -> next;

p = p -> next;

now++;

}

printf("删除错误!\n");

}

int main(){

int n1,n2;

Node *head1,*head2,*head;

printf("请输入链表1的元素个数:");

scanf("%d",&n1);

head1 = CreateList(n1);//创建链表函数

print(head1);

printf("请输入链表1的元素个数:");

scanf("%d",&n2);

head2 = CreateList(n2);//创建链表函数

print(head2);

head = combine(head1,head2); //链表的合并

print(head);

printf("请输入删除该链表的第几个元素:");

int k;

scanf("%d",&k);

Delete(head,k);

print(head);

}

有序顺序表的操作

#include<cstdio>

using namespace std;

const int maxn = 11111;

int List[maxn],L = 0;

int List2[maxn],L2 = 0;

void insert(int *_List,int &L,int v){ //将值为v的元素插入到长度为L顺序表_List

for(int i = 0; i <= L; i++){

if(i == L){ //如果是插入到最后

_List[L++] = v;

return;

}

if(_List[i] > v){

//从i开始的元素全部右移,腾出空位放置v

for(int j = L; j > i; j--)

_List[j] = _List[j - 1];

_List[i] = v;

L++; //顺序表加长

return;

}

}

}

void Delete(int *_List,int &L,int pos){ //删除长度为L顺序表中第pos个元素

if(pos <= 0 || pos > L){

printf("Error!\n");

return;

}

for(int i = pos - 1; i < L - 1; i++) //位置pos除的元素全部前移一位,覆盖

_List[i] = _List[i + 1];

L--; //链表缩短

printf("删除成功!\n");

return;

}

void combine(int *List1,int *List2,int &L1,int &L2){

//实现表的合并,结果储存在表1中,表2自动删除

for(int i = 0; i < L2 ; i++)    //就是将表2的元素按顺序插入表1

insert(List1,L1,List2[i]);

while(L2 != 0)                  //删除表2

Delete(List2,L2,1);

}

void print(int *_List,int L){       //遍历顺序表

for(int i = 0 ;i < L; i++)

printf("%d ",_List[i]);

printf("\n");

}

int main(){

int n,pos;

//输入第一个顺序表

printf("请输入顺序表(1)元素个数:");

scanf("%d",&n);

printf("请输入%d个顺序表元素:",n);

for(int i = 0; i < n; i++){

int x;

scanf("%d",&x);

insert(List,L,x);

}

printf("顺序表中的元素为:");

print(List,L);

//输入第二个顺序表,操作同上

printf("请输入顺序表(2)元素个数:");

scanf("%d",&n);

printf("请输入%d个顺序表元素:",n);

for(int i = 0; i < n; i++){

int x;

scanf("%d",&x);

insert(List2,L2,x);

}

printf("顺序表中的元素为:");

print(List2,L2);

//删除操作测试,对表(1)进行删除操作

printf("请输出需要删除的位置:");

scanf("%d",&pos);

Delete(List,L,pos);

print(List,L);

combine(List,List2,L,L2);

print(List,L);

printf("表(2)的长度为: %d",L2);

return 0;

}

二分查找

#include<cstdio>

using namespace std;

/*************************

在一个有序序列中

查找一个数,判断其位置

*************************/

int main(){

int array[] = {1,2,3,4,5,6,7,8,9,100,200,300}; //集合

int L = 12; //表长度

int n,v;

printf("有序序列为:");

for(int i = 0; i < L; i++)

printf("%d ",array[i]);

printf("\n请输入需要查找的元素值:");

scanf("%d",&v);

int l = 0,r = L - 1,ok = 0;

while(l <= r){

int mid = (l + r) / 2;

if(array[mid] == v){

printf("%d为第%d个元素",v,mid + 1);

ok = 1; //标记为查找到了

break;

}

else if(array[mid] > v) r = mid;

else l = mid + 1;

}

if(!ok) printf("没有查找到指定元素\n");

}

时间: 2024-11-07 06:52:23

数据结构上机考试(楷神版)的相关文章

2015数据结构上机考试题解

#include<cstdio> #define inf 0x3f3f3f3f const int maxn=10000; using namespace std; int n,m,q; int a[maxn+10]; int bs(int x){ int l=0,r=n-1; while(l<=r){ int mid=(l+r)>>1; if(a[mid]==x) return 1; else if(a[mid]>x) r=mid-1; else l=mid+1; }

华南农业大学数据结构上机考试

8576 顺序线性表的基本操作 时间限制:1000MS  内存限制:1000K提交次数:9027 通过次数:2456 题型: 编程题   语言: G++;GCC Description 编写算法,创建初始化容量为LIST_INIT_SIZE的顺序表T,并实现插入.删除.遍历操作.本题目给出部分代码,请补全内容. #include<stdio.h> #include<malloc.h> #define OK 1 #define ERROR 0 #define LIST_INIT_SI

石家庄XX大学2017年java基础上机考试

石家庄XX大学 2017 年秋季 2016 级本科班期末上机考试试卷(A) 课程名称: JAVA 语言程序设计 任课教师: XXX考试时间: 150 分钟 学号: 姓名: 班级: 考试性质(学生填写):正常考试( )缓考( )补考( )重修( )提前修读( ) 题 号 一 二 三 四 五 六 七 总分 满 分 10 40 50 得 分 阅卷人 试卷说明: 一. 本试卷为 2016 级 JAVA 语言程序设计上机考试试卷: 二. 注意编程规范: (4 分) (1) 通过 Eclipse 添加类的方

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

数据结构 -- 图的最短路径 Java版

作者版权所有,转载请注明出处,多谢.http://www.cnblogs.com/Henvealf/p/5574455.html 上一篇介绍了有关图的表示和遍历实现.数据结构 -- 简单图的实现与遍历 (Java)现在就来看看关于求图的最短路径的问题: 注意:本人学习图的时候看的书是: <<数据结构与算法 Java语言版>> (美)Adam Drozdek/著 周翔/译 机械工业出版社出版 由于要仔细讲解内容过多并且本人水平有限,推荐大家找出这本书来看,本篇文章主要是对其中Dijk

HDU 1234 (浙大计算机研究生复试上机考试-2005年) 开门人和关门人 (水)

开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11133    Accepted Submission(s): 5667 Problem Description 每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签 到.签离记录,请根据记录找出当天开门和关门的人. Input 测试输入的第一

hdu 4416 水题 浙大计算机研究生复试上机考试-2005年 可是发现自己写代码有问题

Spring3与Hibernate4整合时出现了nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider. hibernate3的时候,用spring来控制sessionfactory用的可以是org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean,因为用的是hibernate4所以照猫画

数据结构技能考试系统

通过一个月的努力,终于把数据结构技能考试系统用C++的语言实现(其中有C语言的穿插),系统的最大优点是可以检测学生答题时是否插入了U盘,打开了word及记事本等辅助工具.此系统分为两部分,一部分是学生端,一部分是教师端. 学生端主要是学生输入学号及姓名(对此进行检测),根据学号的后四位对应的ASCII码模8求值,达到抽题的效果(也可适当改进改为IP读题),在题库中抽取两道题,随机答一道题即可,在完成作答后选择所作的试题,避免了选题后不会做的情况.抽题时显示倒计时,时间为60分钟,如若超时,允许的

java web程序 上机考试登陆界面设计实现

今天是java web上机.做一个登陆注册的界面.要求:jsp.mysql数据库,js做一个美观的界面.功能.可以添加 更多啊.我做的界面被老师狠狠的扣了分.问题在于.当用户没有输入任何信息(没有输入用户名和密码)就直接提交的 时候,页面显示500错误,这里改正的方案2点.我是这么想的.1.要么是提交时弹出一个对话框.显示用户名和密码为空!.这里 要注意的是,弹出的对话框不能阻止用户输入信息,弹出后,依然让用户输入.2.要么是提交按钮后依然跳转到本页面.因为一个form表单 只能跳转到一个页面,