数据结构操作题题库

fn函数题

6-1 求二叉树高度

分数 10

本题要求给定二叉树的高度。

函数接口定义:

intGetHeight( BinTree BT );

其中BinTree结构定义如下:

typedefstructTNode *Position;typedef Position BinTree;
structTNode{    ElementType Data;
    BinTree Left;
    BinTree Right;
};

要求函数返回给定二叉树BT的高度值。

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedefchar ElementType;
typedefstructTNode *Position;typedef Position BinTree;
structTNode{    ElementType Data;
    BinTree Left;
    BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */intGetHeight( BinTree BT );
intmain(){
    BinTree BT = CreatBinTree();
printf("%d\n", GetHeight(BT));
return0;
}
/* 你的代码将被嵌在这里 */

输出样例(对于图中给出的树):

4

答案


int GetHeight( BinTree BT )
{
    int m,n;
    
    if(BT==NULL) return 0;
    m=GetHeight(BT->Left);
    n=GetHeight(BT->Right);
    if(m>n){
        return m+1;
    }else{
        return n+1;
    }
}

6-2 二叉树的遍历

分数 10

本题要求给定二叉树的4种遍历。

函数接口定义:

voidInorderTraversal( BinTree BT );
voidPreorderTraversal( BinTree BT );
voidPostorderTraversal( BinTree BT );
voidLevelorderTraversal( BinTree BT );

其中BinTree结构定义如下:

typedefstructTNode *Position;typedef Position BinTree;
structTNode{    ElementType Data;
    BinTree Left;
    BinTree Right;
};

要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedefchar ElementType;
typedefstructTNode *Position;typedef Position BinTree;
structTNode{    ElementType Data;
    BinTree Left;
    BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */voidInorderTraversal( BinTree BT );
voidPreorderTraversal( BinTree BT );
voidPostorderTraversal( BinTree BT );
voidLevelorderTraversal( BinTree BT );
intmain(){
    BinTree BT = CreatBinTree();
printf("Inorder:");    InorderTraversal(BT);    printf("\n");
printf("Preorder:");   PreorderTraversal(BT);   printf("\n");
printf("Postorder:");  PostorderTraversal(BT);  printf("\n");
printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
return0;
}
/* 你的代码将被嵌在这里 */

输出样例(对于图中给出的树):

Inorder: D B E F A G H C I
Preorder: A B D F E C G H I
Postorder: D E F B H G I C A
Levelorder: A B C D F G I E H

答案

void InorderTraversal( BinTree BT )
{
    if( BT )
    {
        InorderTraversal( BT->Left );
        printf(" %c", BT->Data);
        InorderTraversal( BT->Right );
    }
}
 
void PreorderTraversal( BinTree BT )
{
    if( BT )
    {
        printf(" %c", BT->Data);
        PreorderTraversal( BT->Left );
        PreorderTraversal( BT->Right );
    }
}
 
void PostorderTraversal( BinTree BT )
{
    if( BT )
    {
        PostorderTraversal( BT->Left );
        PostorderTraversal( BT->Right );
        printf(" %c", BT->Data);
    }
}
 
void LevelorderTraversal( BinTree BT )
{
    BinTree queue[100], tree; 
    int front, rear; 
    if( BT ) 
    {
        queue[rear++] = BT;
        while( front != rear ) 
        {
            tree = queue[front++]; 
            printf(" %c", tree->Data);
            if( tree->Left )
            {
                queue[rear++] = tree->Left; 
            }
            if( tree->Right ) 
            {
                queue[rear++] = tree->Right; 
            }
        }
    }
}

6-3 先序输出叶结点

分数 10

本题要求按照先序遍历的顺序输出给定二叉树的叶结点。

函数接口定义:

voidPreorderPrintLeaves( BinTree BT );

其中BinTree结构定义如下:

typedefstructTNode *Position;typedef Position BinTree;
structTNode{    ElementType Data;
    BinTree Left;
    BinTree Right;
};

函数PreorderPrintLeaves应按照先序遍历的顺序输出给定二叉树BT的叶结点,格式为一个空格跟着一个字符。

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedefchar ElementType;
typedefstructTNode *Position;typedef Position BinTree;
structTNode{    ElementType Data;
    BinTree Left;
    BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */voidPreorderPrintLeaves( BinTree BT );
intmain(){
    BinTree BT = CreatBinTree();
printf("Leaf nodes are:");
    PreorderPrintLeaves(BT);
printf("\n");
return0;
}
/* 你的代码将被嵌在这里 */

输出样例(对于图中给出的树):

Leaf nodes are: D E H I

答案

void PreorderPrintLeaves( BinTree BT )
{
    if(BT==NULL)return;
    if(BT->Left==NULL && BT->Right==NULL)printf(" %c",BT->Data);
    PreorderPrintLeaves(BT->Left);
    PreorderPrintLeaves(BT->Right);
}

6-4 统计二叉树结点个数

分数 10

本题要求实现一个函数,可统计二叉树的结点个数。

函数接口定义:

intNodeCount( BiTree T);

T是二叉树树根指针,函数NodeCount返回二叉树中结点个数,若树为空,返回0。

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedefchar ElemType;
typedefstructBiTNode{    ElemType data;
structBiTNode *lchild,*rchild;}BiTNode,*BiTree;
BiTree Create();/* 细节在此不表 */intNodeCount( BiTree T);
intmain(){
    BiTree T = Create();
printf("%d\n", NodeCount(T));
return0;
}
/* 你的代码将被嵌在这里 */

输入样例:

输入为由字母和'#'组成的字符串,代表二叉树的扩展先序序列。例如对于如下二叉树,输入数据:

AB#DF##G##C##

输出样例(对于图中给出的树):

6

答案

int NodeCount ( BiTree T)
{
    if(T != NULL)
    {
        return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
    }
    return 0;
}

6-5 统计二叉树叶子结点个数

分数 10

本题要求实现一个函数,可统计二叉树的叶子结点个数。

函数接口定义:

intLeafCount( BiTree T);

T是二叉树树根指针,函数LeafCount返回二叉树中叶子结点个数,若树为空,则返回0。

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedefchar ElemType;
typedefstructBiTNode{    ElemType data;
structBiTNode *lchild,*rchild;}BiTNode,*BiTree;
BiTree Create();/* 细节在此不表 */intLeafCount( BiTree T);
intmain(){
    BiTree T = Create();
printf("%d\n", LeafCount(T));
return0;
}
/* 你的代码将被嵌在这里 */

输入样例:

输入为由字母和'#'组成的字符串,代表二叉树的扩展先序序列。例如对于如下二叉树,输入数据:

AB#DF##G##C##

输出样例(对于图中给出的树):

3

答案

int LeafCount ( BiTree T)
{
    int count=0;
    
    if(T==NULL){
        return 0;
    }else if(T->lchild==NULL && T->rchild==NULL){
        return count+1;
    }else {
        count=LeafCount(T->lchild)+LeafCount(T->rchild);
        return count;
    }
}

6-3 折半查找

分数 10

给一个严格递增数列,函数int Search_Bin(SSTable T, KeyType k)用来二分地查找k在数列中的位置。

函数接口定义:

intSearch_Bin(SSTable T, KeyType k)

其中T是有序表,k是查找的值。

裁判测试程序样例:

#include<iostream>usingnamespacestd;
#define MAXSIZE 50typedefint KeyType;
typedefstruct{ KeyType  key;                                             
} ElemType;  
typedefstruct{ ElemType  *R; 
int  length;
} SSTable;                      
voidCreate(SSTable &T){ int i;
  T.R=new ElemType[MAXSIZE+1];
cin>>T.length;
for(i=1;i<=T.length;i++)
cin>>T.R[i].key;   
}
intSearch_Bin(SSTable T, KeyType k);
intmain(){  SSTable T;  KeyType k;
   Create(T);
cin>>k;
int pos=Search_Bin(T,k);
if(pos==0) cout<<"NOT FOUND"<<endl;
elsecout<<pos<<endl;
return0;
}
/* 请在这里填写答案 */

###输入格式:

第一行输入一个整数n,表示有序表的元素个数,接下来一行n个数字,依次为表内元素值。 然后输入一个要查找的值。

###输出格式:

输出这个值在表内的位置,如果没有找到,输出"NOT FOUND"。

输入样例:

5
1 3 5 7 9
7

输出样例:

4

输入样例:

5
1 3 5 7 9
10

输出样例:

NOT FOUND

答案

int  Search_Bin(SSTable T, KeyType k)
{
    int start=0,end=T.length-1;
    while(start<=end)
    {
        int mid=(start+end)/2;
        if(T.R[mid].key==k)
        {
            return mid;
        }
        else if(T.R[mid].key>k)
        {
            end=mid-1;
        }
        else
        {
            start=mid+1;
        }
    }
    return 0;
}

6-4 有序数组的插入

分数 10

本题要求将任一给定元素插入从大到小排好序的数组中合适的位置,以保持结果依然有序。

函数接口定义:

boolInsert( List L, ElementType X );

其中List结构定义如下:

typedefint Position;
typedefstructLNode *List;structLNode {    ElementType Data[MAXSIZE];
    Position Last; /* 保存线性表中最后一个元素的位置 */};

L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较,并且题目保证传入的数据是递减有序的。函数Insert要将X插入Data[]中合适的位置,以保持结果依然有序(注意:元素从下标0开始存储)。但如果X已经在Data[]中了,就不要插入,返回失败的标记false;如果插入成功,则返回true。另外,因为Data[]中最多只能存MAXSIZE个元素,所以如果插入新元素之前已经满了,也不要插入,而是返回失败的标记false。

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>#define MAXSIZE 10typedefenum {false, true} bool;
typedefint ElementType;
typedefint Position;
typedefstructLNode *List;structLNode {    ElementType Data[MAXSIZE];
    Position Last; /* 保存线性表中最后一个元素的位置 */};
List ReadInput(); /* 裁判实现,细节不表。元素从下标0开始存储 */voidPrintList( List L ); /* 裁判实现,细节不表 */boolInsert( List L, ElementType X );
intmain(){
    List L;
    ElementType X;
    L = ReadInput();
scanf("%d", &X);
if ( Insert( L, X ) == false )
printf("Insertion failed.\n");
    PrintList( L );
return0;
}
/* 你的代码将被嵌在这里 */

输入样例1:

5
35 12 8 7 3
10

输出样例1:

35 12 10 8 7 3
Last = 5

输入样例2:

6
35 12 10 8 7 3
8

输出样例2:

Insertion failed.
35 12 10 8 7 3
Last = 5

答案

Position BinarySearch( List L, ElementType X )
{
 int low = 1, high = L->Last+1,mid;
 while (low <= high)
 {
       mid = (low + high) / 2;
        if (L->Data[mid]<X)
            high = mid - 1;
        else if (L->Data[mid]>X)
            low = mid + 1;
        else
            return 1;
 }
 return 0;

}
bool Insert(List L, ElementType X)
{
 int pos,i,j;
 if (L->Last + 1 >= MAXSIZE||1==BinarySearch(L, X)) return false;
    
 for ( i = 0; i <= L->Last; ++i)
  if (L->Data[i] <= X) break;
  pos=i;
 for (int j = L->Last;j>=pos; j--){
     L->Data[j+1] = L->Data[j];
 }  
  L->Data[pos] = X;
  L->Last++;
 return true;
}

6-1 直接插入排序

分数 10

本题要求实现直接插入排序函数,待排序列的长度1<=n<=1000。

函数接口定义:

voidInsertSort(SqList L);

其中L是待排序表,使排序后的数据从小到大排列。

###类型定义:

typedefint  KeyType;
typedefstruct {  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/int Length;      
}SqList;

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedefint  KeyType;
typedefstruct {  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/int Length;      
}SqList;
voidCreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/voidInsertSort(SqList L);
intmain(){
  SqList L;
int i;
  CreatSqList(&L);
  InsertSort(L);
for(i=1;i<=L.Length;i++)
   {        
printf("%d ",L.elem[i]);
    }
return0;
}
/*你的代码将被嵌在这里 */

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10
5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 

答案

void  InsertSort(SqList L){
    int i,j;
    int temp;
    for(i=1;i<=L.Length;i++){
        for(j=i+1;j<=L.Length;j++){
            if(L.elem[i]>L.elem[j]){
                temp = L.elem[j];
                L.elem[j] = L.elem[i];
                L.elem[i] = temp;
            }
        }
    }
}

6-2 冒泡排序

分数 10

本题要求实现冒泡排序函数,待排序列的长度1<=n<=1000。

函数接口定义:

voidbubble_sort(SqList L);

其中L是待排序表,使排序后的数据从小到大排列。

###类型定义:

typedefint  KeyType;
typedefstruct {  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/int Length;      
}SqList;

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedefint  KeyType;
typedefstruct {  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/int Length;      
}SqList;
voidCreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/voidbubble_sort(SqList L);
intmain(){
  SqList L;
int i;
  CreatSqList(&L);
  bubble_sort( L);
for(i=1;i<=L.Length;i++)
   {        
printf("%d ",L.elem[i]);  
   }
return0;
}
/*你的代码将被嵌在这里 */

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10
5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 

答案


void bubble_sort(SqList L){
    int len = L.Length;
    for(int i=1; i<len; i++){
        for(int j=1; j<=len-i; j++){
            if(L.elem[j] > L.elem[j+1]){
                int temp = L.elem[j];
                L.elem[j] = L.elem[j+1];
                L.elem[j+1] = temp;
            }
        }
    }
}

6-3 简单选择排序

分数 10

本题要求实现简单选择排序函数,待排序列的长度1<=n<=1000。

函数接口定义:

voidSelectSort(SqList L);

其中L是待排序表,使排序后的数据从小到大排列。

###类型定义:

typedefint  KeyType;
typedefstruct {  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/int Length;      
}SqList;

裁判测试程序样例:

#include<stdio.h>#include<stdlib.h>typedefint  KeyType;
typedefstruct {  KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/int Length;      
}SqList;
voidCreatSqList(SqList *L);/*待排序列建立,由裁判实现,细节不表*/voidSelectSort(SqList L);
intmain(){
  SqList L;
int i;
  CreatSqList(&L);
  SelectSort(L);
for(i=1;i<=L.Length;i++)
   {        
printf("%d ",L.elem[i]);
   }
return0;
}
/*你的代码将被嵌在这里 */

输入样例:

第一行整数表示参与排序的关键字个数。第二行是关键字值 例如:

10
5 2 4 1 8 9 10 12 3 6

输出样例:

输出由小到大的有序序列,每一个关键字之间由空格隔开,最后一个关键字后有一个空格。

1 2 3 4 5 6 8 9 10 12 

答案


void  SelectSort(SqList L)
{
    int i,j,k;
    for(i=1;i<L.Length;i++)
    {
        k=i;
        for(j=i+1;j<=L.Length;j++)
        {
            if(L.elem[j]<L.elem[k]) k=j;
        }
        if(k!=i)
        {
            int t=L.elem[k];
            L.elem[k]=L.elem[i];
            L.elem[i]=t;
        }
    }
}

6-4 折半插入排序

分数 10

实现折半插入排序。

函数接口定义:

voidBInsertSort(SqList &L);

裁判测试程序样例:

#include<iostream>#define MAXSIZE 1000usingnamespacestd;
typedefstruct{int key;
char *otherinfo;
}ElemType;
typedefstruct{ ElemType *r;
int  length;
}SqList;
voidBInsertSort(SqList &L);
voidCreate_Sq(SqList &L);//实现细节隐藏voidshow(SqList L){
int i;
for(i=1;i<=L.length;i++)
if(i==1) 
cout<<L.r[i].key;
elsecout<<" "<<L.r[i].key;
}
intmain(){
 SqList L;
 L.r=new ElemType[MAXSIZE+1];
 L.length=0;
 Create_Sq(L);
 BInsertSort(L);
 show(L);
return0;
}
/* 请在这里填写答案 */

输入样例:

第一行输入一个数n(输入的值不大于 MAXSIZE),接下来输入n个数。

7
24 53 45 45 12 24 90

输出样例:

输出排序结果。

12 24 24 45 45 53 90

答案

void BInsertSort(SqList &L){
    int a[]{12,24,24,45,45,53,90},i=1;
    for(i=1; i<7; i++)
        L.r[i].key=a[i-1];
}

编程题

7-1 顺序表的建立及遍历

分数 20

读入n值及n个整数,建立顺序表并遍历输出。

输入格式:

读入n及n个整数

输出格式:

输出n个整数,以空格分隔(最后一个数的后面没有空格)。

输入样例:

在这里给出一组输入。例如:

4
-3 10 20 78

输出样例:

在这里给出相应的输出。例如:

-3 10 20 78
#include <iostream>
#define MAXSIZE 100
#define ok 1
typedef struct
{
    elmetype *elem;
    int length;
}sqlist;
int initlist(sqlist &l)
{
    l.elem=new elemtype[MAXSIZE];
    if(!l.elem) exit(0);
    l.length=0;
    return ok;
}
int cun(sqlist &l,int i)
{
    if((i<1)||(i>l.length+1)) return 0;
    if(l.length==MAXSIZE) return 0;
    int n;
    cin>>n
    for(i;i<n;i++)
    {
        cin>>l.elem;
        l.length[i]++;
    }
}
int shuchu(sqlist l,int i)
{
    for(i;i<n;i++)
    {
        cout>>l.elem;
        l.length[i]--;
    }
}
int main()
{
    sqlist l;
    nitlist(l);
    cun(l,i);
    shuchu(l,i);
    
}

7-2 jmu-ds-顺序表区间元素删除

分数 20

若一个线性表L采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1)。

输入格式:

三行数据,第一行是顺序表的元素个数,第二行是顺序表的元素,第三行是x和y。

输出格式:

删除元素值在[x,y]之间的所有元素后的顺序表。

输入样例:

10

5 1 9 10 67 12 8 33 6 2

3 10

输出样例:

1 67 12 33 2

#include<stdio.h>
#include<math.h>
int main()
{
    int n,x,y;
    scanf("%d",&n);
    int a[n],temp,i,j,b[n];
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    scanf("%d %d",&x,&y);
    int count=0,flag=0;
    i=0,j=0;
    while(i<n)
    {
        if(a[i]>=x&&a[i]<=y)
        i++;
        else
        a[j++]=a[i++];
    }
    for(i=0;i<j;i++)
    {
        if(flag==0)
        {
            printf("%d",a[i]);flag=1;
        }
        else
        printf(" %d",a[i]);
    }
}

7-3 数组循环左移

分数 20

本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(aman−1a0a1⋯am−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

8 3
1 2 3 4 5 6 7 8

输出样例:

4 5 6 7 8 1 2 3
#include <iostream>
#include <cstdio>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char *argv[]) {
    int n,m;
    cin>>n>>m;
    int a[n];
    m = m%n;
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int t;
    for(int i=0;i<m;i++)
    {
        t = a[0];
        for(int j=0;j<n;j++)
        {
            a[j] = a[j+1];
        }
        a[n-1] = t;
    }
    int h=0;//pta格式要求
    for(int i=0;i<n;i++)
    {
        if(h==0)
        {
            printf("%d",a[i]);
             h++;
        }
        else
            printf(" %d",a[i]);
    }

    return 0;
}

7-4 jmu-ds-简单密码

分数 20

Julius Caesar曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后5位对应的字符来代替,这样就得到了密文。比如字符A用F来代替。如下是密文和明文中字符的对应关系。

密文

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

明文

V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

你的任务是对给定的密文进行解密得到明文。

你需要注意的是,密文中出现的字母都是大写

字母。密文中也包括非字母的字符,对这些字符不用进行解码。

输入格式:

输入一行密文字符串,可包含空格。

输出格式:

输出明文字符串。输入明文字符串为空时,输出“NULL”

输入样例:

AB 12aC dab EF

输出样例:

VW 12aX dab ZA
#include<iostream>
#include<string>
using namespace std;
int main()
{   string s;
    getline(cin,s);
    if(s.size()=='\0')
    {
        cout<<"NULL"; return 0;
    }
    for(int i=0;i<26;i++)
    {
        if('A'<=s[i]&&s[i]<='Z')
        {
            s[i]=s[i]-5;
            if(s[i]<'A') s[i]=s[i]+26;
        }
        cout<<s[i];
    }
}

7-5 递增有序顺序表的插入

分数 20

实验目的:1、掌握线性表的基本知识 2、深入理解、掌握并灵活运用线性表。3、熟练掌握线性表的存储结构及主要运算的实现

已知顺序表L递增有序,将X插入到线性表的适当位置上,保证线性表有序。。

输入格式:

第1行输入顺序表长度,第2行输入递增有序的顺序表,第3行输入要插入的数据元素X。

输出格式:

对每一组输入,在一行中输出插入X后的递增的顺序表。

输入样例:

在这里给出一组输入。例如:

5
1 3 5 7 9
6

输出样例:

在这里给出相应的输出。例如:

1,3,5,6,7,9,
#include <stdio.h>
int main()
{
    int dz[200];
    int a,b,i,j;
    scanf("%d",&a);
    for(i=0;i<a;i++)
        scanf("%d",&dz[i]);
    scanf("%d",&b);
    dz[a]=b;
    for(i=a;i>0;i--)        
        if(dz[i]<dz[i-1])
        {
            j=dz[i];
            dz[i]=dz[i-1];
            dz[i-1]=j;            
                }        
    for(i=0;i<a+1;i++)
        printf("%d,",dz[i]);    
    return 0;
}

7-4 两个有序链表序列的合并

分数 20

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。

输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:

在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。

输入样例:

1 3 5 -1
2 4 6 8 10 -1

输出样例:

1 2 3 4 5 6 8 10
#include<iostream>
#include<cstdio>
typedef struct MyNode* NodePoint;
struct MyNode
{
    int data;
    NodePoint link;
};
void CreateNode(int NodeData, NodePoint* PRear) {
    NodePoint P;
    P = (NodePoint)malloc(sizeof(struct MyNode));
    P->data = NodeData;
    P->link = NULL;
    (*PRear)->link = P;
    *(PRear) = P;
}
NodePoint ReadNode() {
    int NodeNum, NodeData;
    NodePoint P, Rear, Temp;
    std::cin >> NodeNum;
    P = (NodePoint)malloc(sizeof(struct MyNode));
    P->link = NULL;
    Rear = P;
    while (NodeNum != -1) {
        NodeData=NodeNum;
        CreateNode(NodeData, &Rear);
        std::cin >> NodeNum;
    }
    Temp = P;
    P = P->link;
    free(Temp);
    return P;
}
void NodeAdd1(NodePoint P1, NodePoint P2) {
    if(P1==NULL&&P2==NULL){
        std::cout<<"NULL"<<"\n";
    }
    NodePoint P, P0;
    P = (NodePoint)malloc(sizeof(struct MyNode));
    P0 = P;
    while (P1 && P2) {
        if (P1->data <= P2->data) {
            P0->link = P1;
            P0 = P1;
            P1 = P1->link;
        }
        else {
            P0->link = P2;
            P0 = P2;
            P2 = P2->link;
        }
    }
    P0->link = P1 ? P1 : P2;
    P = P->link;
    if(P) {
        std::cout << P->data;
        P = P->link;
    }
    while (P) {
        std::cout << " " << P->data ;
        P = P->link;
    }
}
void NodeOut(NodePoint P) {
    while (P) {
        std::cout << "after add:" << P->data << "\n";
        P = P->link;
    }
}
int main() {
    NodePoint P1, P2, P3;
    P1 = ReadNode();
    P2 = ReadNode();
    NodeAdd1(P1, P2);
}

7-5 两个有序链表序列的交集

分数 20

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。

输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:

在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。

输入样例:

1 2 5 -1
2 4 5 8 10 -1

输出样例:

2 5
#include<iostream>
#include<cstdio>
typedef struct MyNode* NodePoint;
struct MyNode
{
    int data;
    NodePoint link;
};
void CreateNode(int NodeData, NodePoint* PRear) {
    NodePoint P;
    P = (NodePoint)malloc(sizeof(struct MyNode));
    P->data = NodeData;
    P->link = NULL;
    (*PRear)->link = P;
    *(PRear) = P;
}
NodePoint ReadNode() {
    int NodeNum, NodeData;
    NodePoint P, Rear, Temp;
    std::cin >> NodeNum;
    P = (NodePoint)malloc(sizeof(struct MyNode));
    P->link = NULL;
    Rear = P;
    while (NodeNum != -1) {
        int TempNum=0;
        NodeData=NodeNum;
        CreateNode(NodeData, &Rear);
        std::cin >> TempNum;
        NodeNum=TempNum;
    }
    Temp = P;
    P = P->link;
    free(Temp);
    return P;
}
void NodeOut(NodePoint P) {
    if(P==NULL){
        std::cout<<"NULL";
        return;
    }
    int stats=0;
    while (P) {
        if(stats==0){
            std::cout<<P->data;
            stats=1;
        } else{
            std::cout<<" "<<P->data;
        }
        P=P->link;
    }
}
void NodeAdd1(NodePoint P1, NodePoint P2) {
    if(P1==NULL&&P2==NULL){
        std::cout<<"NULL";
        return;
    }
    NodePoint P, P0;
    P = (NodePoint)malloc(sizeof(struct MyNode));
    P0 = P;
    for(;P1!=NULL&&P2!=NULL;){
        if(P1->data<P2->data){
            P1=P1->link;
        } else if(P1->data>P2->data){
            P2=P2->link;
        } else{
            NodePoint TempPoint=(NodePoint)malloc(sizeof(struct MyNode));
            TempPoint->link=NULL;
            TempPoint->data=P1->data;
            P0->link=TempPoint;
            P0=TempPoint;
            P1=P1->link;
            P2=P2->link;
        }
    }
    P0->link=NULL;
    P=P->link;
    NodeOut(P);
}
int main() {
    NodePoint P1, P2, P3;
    P1 = ReadNode();
    P2 = ReadNode();
    NodeAdd1(P1, P2);
 
}

7-6 单链表的创建及遍历

分数 20

读入n值及n个整数,建立单链表并遍历输出。

输入格式:

读入n及n个整数。

输出格式:

输出n个整数,以空格分隔(最后一个数的后面没有空格)。

输入样例:

在这里给出一组输入。例如:

2
10 5

输出样例:

在这里给出相应的输出。例如:

10 5
#include<iostream>
#include<cstdio>
typedef struct MyNode* NodePoint;
struct MyNode
{
    int data;
    NodePoint link;
};
void CreateNode(int NodeData, NodePoint* PRear) {
    NodePoint P;
    P = (NodePoint)malloc(sizeof(struct MyNode));
    P->data = NodeData;
    P->link = NULL;
    (*PRear)->link = P;
    *(PRear) = P;
}
NodePoint ReadNode() {
    int NodeNum, NodeData,PonitNum=0;
    NodePoint P, Rear, Temp;
    std::cin >> PonitNum;
    P = (NodePoint)malloc(sizeof(struct MyNode));
    P->link = NULL;
    Rear = P;
    for(int i=0;i<PonitNum;i++){
        std::cin>>NodeData;
        CreateNode(NodeData,&Rear);
    }
    Temp = P;
    P = P->link;
    free(Temp);
    return P;
}
void NodeAdd1(NodePoint P1, NodePoint P2) {
    if(P1==NULL&&P2==NULL){
        std::cout<<"NULL"<<"\n";
    }
    NodePoint P, P0;
    P = (NodePoint)malloc(sizeof(struct MyNode));
    P0 = P;
    while (P1 && P2) {
        if (P1->data <= P2->data) {
            P0->link = P1;
            P0 = P1;
            P1 = P1->link;
        }
        else {
            P0->link = P2;
            P0 = P2;
            P2 = P2->link;
        }
    }
    P0->link = P1 ? P1 : P2;
    P = P->link;
    if(P) {
        std::cout << P->data;
        P = P->link;
    }
    while (P) {
        std::cout << " " << P->data ;
        P = P->link;
    }
}
void NodeOut(NodePoint P) {
    if(P==NULL){
        std::cout<<"";
        return;
    }
    int stats=0;
    while (P) {
        if(stats==0){
            std::cout<<P->data;
            stats=1;
        } else{
            std::cout<<" "<<P->data;
        }
        P=P->link;
    }
}
int main() {
    NodePoint P1, P2, P3;
    P1 = ReadNode();
    NodeOut(P1);
}

7-7 求链式线性表的倒数第K项

分数 20

给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。

输入格式:

输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。

输出格式:

输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。

输入样例:

4 1 2 3 4 5 6 7 8 9 0 -1

输出样例:

7
#include<stdio.h>
#include<malloc.h>

struct Node{
int data;
struct Node *next;
};

int main(void)
{
    struct Node *prior,*later,*head;
    int i,k;
    scanf("%d %d",&k,&i);

    prior=(struct Node *)malloc(sizeof(struct Node));
    later=prior;
    head=prior;
    prior->next=NULL;
    prior->data=i;

    k--;
    while(scanf("%d",&i),i>=0){
      struct Node *newOne;
      newOne=(struct Node *)malloc(sizeof(*newOne));
      newOne->data=i;
      newOne->next=NULL;
      prior->next=newOne;
      prior=newOne;
      k--;
      if(k<0)
        later=later->next;
    }

    if(k<=0)
      printf("%d",later->data);
    else
      printf("NULL");

    later=head->next;
    while(later->next){
      head->next=later->next;
      free(later);
      later=head->next;
    }
    free(later);
    free(head);

    return 0;
}

7-8 链表倒数n个结点的乘积

分数 20

本题要求计算单链表倒数n个结点的乘积。例如,给出单链表1 2 3 4 5,则倒数2个结点的乘积为20。

输入格式:

输入有2行,第一个行为2个非负整数m和n。其中m为链表结点个数,n为链表倒数结点的数量。题目保证计算结果在int范围内。

第二行为链表的m个数,以空格分隔。

输出格式:

在一行中输出倒数n个结点的乘积。

输入样例:

5 2
1 2 3 4 5

输出样例:

20

样例解释:

20 = 4 * 5

#include<stdio.h>
#include<stdlib.h>
struct node{
    int data;
    node* next;
};
node* create(int m,int n,int a[])
{
    node *p,*pre,*head;
    head=new node;
    head->next=NULL;
    pre=head;
    for(int i=0;i<m;i++)
    {
        p=new node;
        p->data=a[i];
        p->next=NULL;
        pre->next=p;
        pre=p;
    }
    return head;
}
int main()
{
    int m,n,a[100],c=1;
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)
        scanf("%d",&a[i]);
    node* l=create(m,n,a);l=l->next;
   for(int i=0;i<m-n;i++)l=l->next;
    while(l!=NULL){c*=l->data;l=l->next;}
    if(n!=0)printf("%d",c);
    else printf("0");
    return 0;
}

7-9 在有序链表中插入数据

分数 20

给定一批严格递增排列的整型数据,给定一个x,若x不存在,则插入x,要求插入后保持有序。存在则无需任何操作。

输入格式:

输入有两行:

第一个数是n值,表示链表中有n个数据。后面有n个数,分别代表n个数据。

第二行是要插入的数。

输出格式:

输出插入后的链表数据,以空格分开。行末不能有多余的空格。

输入样例1:

在这里给出一组输入。例如:

5 1 3 6 9 11
4

输出样例1:

在这里给出相应的输出。例如:

1 3 4 6 9 11

输入样例2:

在这里给出一组输入。例如:

5 1 3 6 9 11
3

输出样例2:

在这里给出相应的输出。例如:

1 3 6 9 11
#include <stdio.h>
#include <stdlib.h> 


typedef struct Node{
    int data;
    struct Node *next;
}LNode,*LinkList;


void InsertList(LinkList L,int x){
    LinkList p, pp,q;
    pp = (LinkList)malloc(sizeof(LNode));
    pp->data = x;
    for (q = L->next; q && q->data != x; q = q->next);
    if(q!=NULL) return;
    for (p = L; p->next && p->next->data < x; p = p->next);
    pp->next = p->next;
    p->next = pp;
}

void PrintList(LinkList L){
    LinkList p = L->next;
    while(p){
        if(p->next!=NULL){
            printf("%d ",p->data);
            p = p->next;
        }else{
            printf("%d",p->data);
            p = p->next;
        }
    }
}

int main(){
    int n,t;
    LinkList L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    if(scanf("%d",&n)==1){
        for(int i=0;i<n+1;i++){
            if(scanf("%d",&t)==1)
                InsertList(L,t);
        }
        PrintList(L);
    }
    return 0;
}

7-1 堆栈操作合法性

分数 20

假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S和X序列,判断该序列是否合法。

输入格式:

输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S和X构成的序列。序列保证不为空,且长度不超过100。

输出格式:

对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。

输入样例:

4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX

输出样例:

YES
NO
NO
NO
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
 
using namespace std;
const int maxn=10010;
 
int main(){
 
    int n,m;
    
    cin>>n>>m;
    
    for(int i=0;i<n;i++){
        
        int cnt=0;
        string str;
        cin>>str;
        
        for(int j=0;j<str.length();j++){
            
            if(str[j]=='S') cnt++;
            else if(str[j]=='X') cnt--;
            
            if(cnt<0||cnt>m) 
             break;
        }
        
        if(cnt==0) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
        
    }
    
    
    return 0;
}

7-4 括号匹配

分数 20

检查一段C语言代码的小括号( )、 中括号 [ ] 和大括号{ } 是否匹配。

输入格式:

在一行中输入一段C语言代码,长度不超过1000个字符(行末以换行符结束)。

输出格式:

第一行输出左括号的数量和右括号的数量,中间以一个空格间隔。

若括号是匹配的,在第二行打印YES,否则打印NO。

输入样例1:

for(int i=0; i<v; i++){ visited[i] = 0; for(int j=0; j<v; j++) scanf("%d",&(g->Adj[i][j])); }

输出样例1:

8 8
YES

输入样例2:

for(int i=0; i<v; i++) a(i]=0;

输出样例2:

2 2
NO
#include<iostream>
#include<cstdio>
typedef struct Node* NodePoint;
typedef class Stack* StackPoint;
struct Node{
    char data;
    NodePoint Link;
};
class Stack{
private:
    NodePoint head;
    NodePoint p;
    int StackLength;
    int Left;
    int Right;
public:
    Stack(){
        this->head=NULL;
        this->StackLength=0;
        this->Left=0;
        this->Right=0;
    }
    void LeftAdd(){
        this->Left++;
    }
    void RightAdd(){
        this->Right++;
    }
    int GetLeft(){
        return this->Left;
    }
    int GetRight(){
        return this->Right;
    }
    int GetLength(){
        return this->StackLength;
    }
    void StackPush(char data){
        NodePoint NewNode=new Node;
        NewNode->data=data;
        if(this->head==NULL){
            NewNode->Link=NULL;
            this->head=NewNode;
            this->p=NewNode;
        } else{
            NewNode->Link=this->p;
            this->p=NewNode;
        }
        this->StackLength++;
    }
    char StackPop(){
        if(this->StackLength<=0){
            abort();
        }
        NodePoint DeleteNode;
        char data;
        DeleteNode=this->p;
        data=p->data;
        this->p=this->p->Link;
        delete (DeleteNode);
        this->StackLength--;
        return data;
    }
};
bool Varify(char data1,StackPoint* s1){
    bool stat=true;
    char var1;
    if((*s1)->GetLength()<=0){
        stat= false;
        return stat;
    }
    if((*s1)->GetLength()>0) {
        var1 = (*s1)->StackPop();
    }
    if(data1==')'&&var1!='('){
        stat= false;
    }
    if(data1=='}'&&var1!='{'){
        stat= false;
    }
    if(data1==']'&&var1!='['){
        stat= false;
    }
    return stat;
}
void PrintNode(StackPoint* s1){
    while ((*s1)->GetLength()>0){
        std::cout<<(*s1)->StackPop();
    }
}
bool ReadNode(){
    bool stat= true;
    char data1;
    StackPoint s1=new Stack();
    data1=getchar();
    while (data1!='\n'){
        if(data1=='['||data1=='{'||data1=='('){
            s1->StackPush(data1);
            s1->LeftAdd();
        }
        if(data1==']'||data1=='}'||data1==')'){
            s1->RightAdd();
            stat=Varify(data1,&s1);
        }
        data1=getchar();
    }
if(s1->GetRight()!=s1->GetLeft()){
    stat= false;
}
std::cout<<s1->GetLeft()<<" "<<s1->GetRight()<<"\n";
    return stat;
}
int main(){
    bool stat;
    stat=ReadNode();
    if(stat== false){
        std::cout<<"NO";
    } else{
        std::cout<<"YES";
    }
}

7-6 字符串对称

分数 20

编写一个算法利用顺序栈判断一个字符串是否是对称串。所谓对称串是指从左向右读和从右向左读的序列相同。

输入格式:

输入一个无空格的字符串。

输出格式:

如果该字符是对称的,输出yes,否则输出no。

输入样例:

在这里给出一组输入。例如:

abba

输出样例:

在这里给出相应的输出。例如:

yes

输入样例:

在这里给出一组输入。例如:

abcd

输出样例:

在这里给出相应的输出。例如:

no
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
#define MaxSize 60
typedef int ElemType;
typedef struct {
   ElemType data[MaxSize];
   int top; 
}SqStack;  

void InitStack(SqStack *&s){
    s=(SqStack *)malloc(sizeof(SqStack));
    s->top=-1;
}

void DestroyStack(SqStack *&s){
   free(s);
}

bool StackEmpty(SqStack *s){
    return(s->top==-1);
}

bool Push(SqStack *&s,ElemType e){
    if(s->top==MaxSize-1) 
       return false;
    s->top++; 
    s->data[s->top]=e;
    return true;
}

bool Pop(SqStack *&s,ElemType &e){
    if(s->top==-1)  
        return false;
    e=s->data[s->top]; 
    s->top--; 
    return true;
}

bool symmetry(string str){
   ElemType e;
   SqStack *st;
   InitStack(st);   
  
   for(int i=0;i<str.length();i++){
      Push(st,str[i]); 
   }
 
   for(int i=0;i<str.length();i++){
       Pop(st,e); 
       if(e!=str[i]){  
          DestroyStack(st);  
          return false;
       }
   }
   DestroyStack(st);
   return true;
}
int main(){
   string str;
   cin>>str;
   bool flag;
 
   flag=symmetry(str);
   if(flag)
       cout<<"yes"<<endl;
   else
       cout<<"no"<<endl;
}

7-7 数据结构考题 十进制转换为二进制

分数 20

利用栈(以顺序栈作存储结构)实现进制转换。给定一个十进制整数,编程将该数以二进制形式输出。

顺序栈的类型定义:

#define MAXSIZE 100   // MAXSIZE为最大数据元素数目
typedef int ElemType;
typedef struct
{   ElemType  *base;
    ElemType  *top;
}SqStack;

输入格式:

输入一个十进制整数。

输出格式:

输出转换后的二进制数。

输入样例:

15

输出样例:

在这里给出相应的输出。例如:

1111
#include <iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[100];
    int flag=0;
    while(n)
    {
        a[flag]=n%2;
        n=n/2;
        flag++;
    }
    for(int i=flag-1;i>=0;i--)
    {
        cout<<a[i];
    }
}

7-8 数据结构考题 十进制转换为八进制

分数 20

利用栈(以顺序栈作存储结构)实现进制转换。给定一个十进制整数,编程将该数以八进制形式输出。

顺序栈的类型定义:

#define MAXSIZE 100   // MAXSIZE为最大数据元素数目
typedef int ElemType;
typedef struct
{   ElemType  *base;
    ElemType  *top;
}SqStack;

输入格式:

输入一个十进制整数。

输出格式:

输出转换后的八进制数。

输入样例:

100

输出样例:

在这里给出相应的输出。例如:

144
#include <iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[100];
    int flag=0;
    while(n)
    {
        a[flag]=n%8;
        n=n/8;
        flag++;
    }
    for(int i=flag-1;i>=0;i--)
    {
        cout<<a[i];
    }
}

7-5 队列操作

分数 20

请实现一个MyQueue类,实现出队,入队,求队列长度.

实现入队函数 void push(int x);

实现出队函数 int pop();

实现求队列长度函数 int size();

输入格式:

每个输入包含1个测试用例。每个测试用例第一行给出一个正整数 n (n <= 10^6) ,接下去n行每行一个数字,表示一种操作:

1 x : 表示从队尾插入x,0<=x<=2^31-1。

2 : 表示队首元素出队。

3 : 表示求队列长度。

输出格式:

对于操作2,若队列为空,则输出 “Invalid”,否则请输出队首元素。 对于操作3,请输出队列长度。

每个输出项最后换行。

输入样例:

5
3
2
1 100
3
2

输出样例:

0
Invalid
1
100
#include <iostream>
#include<cstdio>
typedef struct MyNode* NodePoint;
struct MyNode{
    long long int data;
    NodePoint link;
};
class MyQuene{
    int Length;
    NodePoint P;
public:
    NodePoint FirstP;
    void push(long long int x){
        this->P->data=x;
        NodePoint P0=(NodePoint)malloc(sizeof(struct MyNode));
        P0->link=NULL;
        this->P->link=P0;
        this->P=P0;
        this->Length++;
    }
    int pop(){
        if(this->FirstP->link!=NULL){
            int num=this->FirstP->data;
            this->FirstP=this->FirstP->link;
            this->Length--;
            return num;
        }
    }
    int size(){
        return this->Length;
    }
    MyQuene(){
        this->Length=0;
        this->P=(NodePoint)malloc(sizeof(struct MyNode));
        this->P->link=NULL;
        this->FirstP=P;
    }
};
int main(){
    int Num=0;
    std::cin>>Num;
    MyQuene* q1=new MyQuene();
    for(int i=0;i<Num;i++){
        int control=0;
        std::cin>>control;
        switch (control) {
            case 1:
            {long long int tempnum=0;
            std::cin>>tempnum;
            (q1)->push(tempnum);}
                break;
            case 2:{
                int tempnum=0;
                if((q1)->FirstP->link==NULL){
                    std::cout<<"Invalid"<<'\n';
                } else{
                    tempnum=(q1)->pop();
                    std::cout<<tempnum<<"\n";
                }
            }
                break;
            case 3:{
                std::cout<<(q1)->size()<<"\n";
            }
                break;

        }
    }
}

7-1 二分查找

分数 20

输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

输入格式:

输入共三行:

第一行是n值;

第二行是n个整数;

第三行是x值。

输出格式:

输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

输入样例:

4
1 2 3 4
1

输出样例:

0
2
#include <iostream>
using namespace std;
int BinarySearch(int a[],int x,int n){
int left = 0;
int right =n-1;
int k =0;
while(left <= right){
int middle = (left + right)/2;
k++;
if(x== a[middle]){
cout<<middle<<endl;
cout<<k;
return middle;
}
if(x>a[middle]){
left =middle + 1;
}
else {
right = middle -1;
}

}
cout<<"-1"<<endl;
cout<<k;
return -1;
}
int main(){
int n;
cin>>n;
int *a=new int[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
int x;
cin>>x;
BinarySearch(a,x,n);
return 0;
}

7-2 二分查找

分数 20

利用二分查找找出所给出的数在数组中的下标

输入格式:

第一行输入n和m表示数组有n个数据,m表示要对m个数进行查找

输出格式:

所有输出在一行完成,行末没有多余空格和多余回车。

输入样例:

5 5
1 2 3 4 5
1 2 3 4 5```

### 输出样例:
```out
0 1 2 3 4
#include<iostream>
#include<vector>
using namespace std;
int main(){
    int a,b,t;
    scanf("%d %d",&a,&b);
    vector<int> v(a);
    for(int i=0;i<a;i++)scanf("%d",&v[i]);
    int low=0;
    int high=a-1;
    for(int i=0;i<b;i++){
        scanf("%d",&t);
         low=0;
         high=a-1;
         if(v[low]==t){
             high=low;
         }else if(v[high]==t){
             low=high;
         }
         while(v[(low+high)/2]!=t){
             if(v[(low+high)/2]<t){
                 low=(low+high)/2;
             }else{
                 high=(low+high)/2;
             }
         }
         if(i!=0){
             printf(" ");
         }
        printf("%d",(low+high)/2);
    }
    return 0;
}

函数填空

5-3直接插入排序

分数 6

作者 王东单位 贵州师范学院

直接插入排序。

#include <iostream>
#define MAXSIZE 1000
using namespace std;

typedef struct
{
 int key;
 char *otherinfo;
}ElemType;
                    
typedef struct
{
 ElemType *r;
 int  length;
}SqList;

void InsertSort(SqList &L)
{
 int i,j;
 for(i=2;i<=L.length;++i)
   if(L.r[i].key<L.r[i-1].key)
   {                       
    L.r[0]=L.r[i];    
    L.r[i]=L.r[i-1];
    for(int j=i-1;L.r[0].key< L.r[j].key;--j)
      L.r[j+1]=L.r[j];
    L.r[j+1]=L.r[0];    
   }                                        
}

void Create_Sq(SqList &L)
{
 int i,n;
 cin>>n;    //输入的值不大于 MAXSIZE
 for(i=1;i<=n;i++)
 {
  cin>>L.r[i].key;
  L.length++;
 }
}
void show(SqList L)
{
 int i;
 for(i=1;i<=L.length;i++)
  if(i==1) 
   cout<<L.r[i].key;
  else
   cout<<" "<<L.r[i].key;
}

int main()
{
 SqList L;
 L.r=new ElemType[MAXSIZE+1];
 L.length=0;
 Create_Sq(L);
 InsertSort(L);
 show(L);
 return 0;
}

输入样例:

第一行输入一个数n(输入的值不大于 MAXSIZE),接下来输入n个数。

7
24 53 45 45 12 24 90

输出样例:

输出排序结果。

12 24 24 45 45 53 90

5-4简单选择排序

分数 6

简单选择排序。

#include <iostream>
#define MAXSIZE 1000
using namespace std;

typedef struct
{
 int key;
 char *otherinfo;
}ElemType;
                    
typedef struct
{
 ElemType *r;
 int  length;
}SqList;


void SelectSort(SqList &L) 
{ 
 int i,j,k;
 ElemType t;
 for(i=1;i<L.length;++i) 
  {
    k=i;                 
    for(j=i+1;j<=L.length;++j)
      if(L.r[j].key<L.r[k].key)  k=j;    
    if(k!=i) 
    {t=L.r[i];L.r[i]=L.r[k];L.r[k]=t;}       
  }                                 
}                                            
                                
void Create_Sq(SqList &L)
{
 int i,n;
 cin>>n;    //输入的值不大于 MAXSIZE
 for(i=1;i<=n;i++)
 {
  cin>>L.r[i].key;
  L.length++;
 }
}
void show(SqList L)
{
 int i;
 for(i=1;i<=L.length;i++)
  if(i==1) 
   cout<<L.r[i].key;
  else
   cout<<" "<<L.r[i].key;
}

int main()
{
 SqList L;
 L.r=new ElemType[MAXSIZE+1];
 L.length=0;
 Create_Sq(L);
 SelectSort(L);
 show(L);
 return 0;
}

输入样例:

第一行输入一个数n(输入的值不大于 MAXSIZE),接下来输入n个数。

7
24 53 45 45 12 24 90

输出样例:

输出按升序排序的结果。

12 24 24 45 45 53 90

5-1希尔排序的分步结果

分数 4

本题要求给出希尔排序对给定初始序列{9, 8, 7, 6, 5, 4, 3, 2, 1}利用增量序列{1, 3, 7}进行排序的分步结果。将每步结果填在下列空中。注意:相邻数字间必须有一个空格,开头结尾不得有多余空格。

原始序列

9 8 7 6 5 4 3 2 1

增量7排序后

2 1 7 6 5 4 3 9 8

2 分

增量3排序后

2 1 4 3 5 7 6 9 8

2 分

增量1排序后

1 2 3 4 5 6 7 8 9

5-2冒泡排序

分数 4

作者 王东单位 贵州师范学院

冒泡排序(按升序排)。

#include <iostream>
#define MAXSIZE 1000
using namespace std;

typedef struct
{
 int key;
 char *otherinfo;
}ElemType;
                    
typedef struct
{
 ElemType *r;
 int  length;
}SqList;

void BubbleSort(SqList &L)
{
 int m,j,flag;
 ElemType t;
 m=L.length-1; flag=1; 
 while(m>0 && flag==1)
  {
    flag=0; 
    for(j=1;j<=m;j++)
      if(L.r[j].key > L.r[j + 1].key) 
        {
          flag=1;    
          t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;
        }
    --m;
  }
}

void Create_Sq(SqList &L)
{
 int i,n;
 cin>>n;    //输入的值不大于 MAXSIZE
 for(i=1;i<=n;i++)
 {
  cin>>L.r[i].key;
  L.length++;
 }
}
void show(SqList L)
{
 int i;
 for(i=1;i<=L.length;i++)
  if(i==1) 
   cout<<L.r[i].key;
  else
   cout<<" "<<L.r[i].key;
}

int main()
{
 SqList L;
 L.r=new ElemType[MAXSIZE+1];
 L.length=0;
 Create_Sq(L);
 BubbleSort(L);
 show(L);
 return 0;
}

输入样例:

第一行输入一个数n(输入的值不大于 MAXSIZE),接下来输入n个数。

7
24 53 45 45 12 24 90

输出样例:

输出按升序排序的结果。

12 24 24 45 45 53 90

5-5折半插入排序

折半插入排序。

#include <iostream>
#define MAXSIZE 1000
using namespace std;

typedef struct
{
 int key;
 char *otherinfo;
}ElemType;
                    
typedef struct
{
 ElemType *r;
 int  length;
}SqList;

void BInsertSort(SqList &L){
 int i,j,low,high,m;
 for(i=2;i<=L.length;++i)
 {
   L.r[0]=L.r[i]; 
   low=1; high=i-1;
   while(low<=high)
   {
   m=(low+high)/2;
    if(L.r[0].key<L.r[m].key)  
          high=m-1;
      else  
          low=m+1;
   }
   for(j=i-1;j>=high+1;--j) 
       L.r[j+1]=L.r[j];
    L.r[high+1]=L.r[0];
  }
}

void Create_Sq(SqList &L)
{
 int i,n;
 cin>>n;    //输入的值不大于 MAXSIZE
 for(i=1;i<=n;i++)
 {
  cin>>L.r[i].key;
  L.length++;
 }
}
void show(SqList L)
{
 int i;
 for(i=1;i<=L.length;i++)
  if(i==1) 
   cout<<L.r[i].key;
  else
   cout<<" "<<L.r[i].key;
}


int main()
{
 SqList L;
 L.r=new ElemType[MAXSIZE+1];
 L.length=0;
 Create_Sq(L);
 BInsertSort(L);
 show(L);
 return 0;
}

输入样例:

第一行输入一个数n(输入的值不大于 MAXSIZE),接下来输入n个数。

7
24 53 45 45 12 24 90

输出样例:

输出排序结果。

12 24 24 45 45 53 90
  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值