首页 > 代码库 > 数据结构上机考试(楷神版)
数据结构上机考试(楷神版)
插入排序
#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 = http://www.mamicode.com/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 = http://www.mamicode.com/value;
q -> next = tmp;
tmp -> next = p;
return;
}
p = p -> next;
q = q -> next;
}
//如果需要在链表最后插入
Node *tmp = (Node*)malloc(sizeof(Node));
tmp -> value = http://www.mamicode.com/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");
}
数据结构上机考试(楷神版)