1、试编写算法:将两个有序顺序表归并成一个有序顺序表
//c是假设已经建好的长度足够大的线性表
void mergeArry(int a[],int m,int b[],int n){ //归并两个线性表
int i = 0 , j = 0 ;
int k = 0 ;
//第一个循环执行完毕,至少有一恶搞线性表的值已经归并好了,好需要将另一个线性表剩下的值存到新的线性表
while (i<m && j < n){
if(a[i]<b[j]){
c[k] = a[i];
k++;
i++;
}else{
c[k] = b[i];
k++;
i++;
}
}
//假如是a还剩值没存完
while(i < m ){
c[k] = a[i];
k ++ ;
i ++ ;
}
while(j < n ){
c[k] = b[j];
k++;
j++;
}_
}
2、试编写算法:将两个带头结点的单链表按data域从小到大的顺序进行链接
Node * merge(Node * h1, Node * h2) {
if (h1 == NULL) return h2;
if (h2 == NULL) return h1;
Node * head;
if (h1->data>h2->data) {
head = h2; h2=h2->next;
} else {
head = h1; h1=h1->next;
}
Node * current = head;
while (h1 != NULL && h2 != NULL) {
if (h1 == NULL || (h2!=NULL && h1->data>h2->data)) {
current->next = h2; h2=h2->next; current = current->next;
} else {
current->next = h1; h1=h1->next; current = current->next;
}
}
current->next = NULL;
return head;
}
3、设采用二叉链表存储二叉树,每个节点含有4个域,分别为lchild,data,rchild,bal.其中lchild指向左孩子,data存放数据,rchild指向右孩子,bal存储相应结点的平衡因子,bal=左子树高度-右子树高度,试编写算法,求二叉树中每个节点的平衡因子,并存入相应结点的bal域中。
4、已知A为无序线性表,采用顺序存储结构。请设计算法,删除其中所有的负数(注意负数可能有多个)
// 传入线性表,因为要删除这个表改变他的值,所以用引用型
void delet(int &list[] , int n ){
int listTemp[n];//定义一个大小和list相同的线性表
int k = 0
for(int i = 0 ; i < n ; i ++) {
if(list[i] > 0 || list[i] == 0){
listTemp[k] = list[i] ;
}
}
list = listTemp;
}
5、已知字符串s采用单向链表结构,结点的数据域为字符型。模式串t采用顺序存储结构。请设计模式匹配算法,在s中查找t的起始地址。
6、已知二叉树的数据域为整数类型,其中只有一个结点的数据值最大。请设计算法,查找该结点的地址。
//遍历二叉树找到最大值
//传入用来遍历的结点p ,和用来得出最大值的结点max, maxKey为第一个结点的值
void r(BTNode* p , &BTNode* max , int maxKey){
if(p != NULL){
r(p-> lChild);
r(p-> rChild);
if(maxKey < p -> data){
max = p
}
}
}
7、请简述堆排序的算法思想,并给出对于下列关键字序列进行堆排序的过程{21,25,49,25,16,8}
8、试编写算法,从一个有序表中删除其值在给定值s和t(要求s小于t)之间的所有元素
void delet(int &list[] , int n ){
int listTemp[n];//定义一个大小和list相同的线性表
int k = 0
for(int i = 0 ; i < n ; i ++) {
if(list[i] > 0 || list[i] == 0){
listTemp[k] = list[i] ;
}
}
list = listTemp;
}
9、假定二叉树采用二叉链表存储结构,设计一个算法,在二叉树中查找关键值为key的结点的父结点
void r(BTNode* p , int key){
if(p != NULL){
r(p-> lChild);
r(p-> rChild);
if(key < p -> key){
return p
}
}
}