王道C语言督学营OJ代码(初级中级高级)

初级

week4-day11作业

输入一个整型数,然后申请对应大小空间内存,然后读取一个字符串,字符串的输入长度小于最初输入的整型数大小,最后输出输入的字符串即可(无需考虑输入的字符串过长,超过了内存大小);

#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p;
int n;
char c;

scanf("%d",&n);

p=malloc(n);

scanf("%c",&c);//注意在scanf和gets中间使用scanf("%c",&c),去除换行

gets(p);

puts(p);

return 0;
}

week4 day12

假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?为便于读者理解题意,这里举例说明如下:假如有3个台阶,那么总计就有3种走法:第一种为每次上1个台阶,上3次;第二种为先上2个台阶,再上1个台阶;第三种为先上1个台阶,再上2个台阶。输入为n,输出为走到第n个台阶有几种走法

#include <stdio.h>
#include <stdlib.h>
int result (int n)
{
    if (n==1)
    {
        return 1;
    }
    else if (n==2)
    {
        return 2;
    }
    else
    {
        return (result(n-1) + result(n-2));
    }
}

int main()
{

int n;

scanf("%d",&n);

int a =result(n);

printf("%d",a);

return 0;
}

中级

day1

输入一个学生的学号,姓名,性别,用结构体存储,通过scanf读取后,然后再通过printf打印输出

#include <stdio.h>
#include <stdlib.h>
struct student{
    int sno;
    char sname[20];
    char sex[10];
};

int main()
{

struct student s;
scanf("%d%s%s",&s.sno,s.sname,s.sex);

printf("%d %s %s",s.sno,s.sname,s.sex);

return 0;
}

——————————————————————————————————————————

以下代码编译器都要选择C++

中级day2

使用C++的引用,注意提交时把代码选为C++;在主函数定义字符指针 char *p,然后在子函数内malloc申请空间,通过fgets读取字符串,然后在主函数中进行输出;要求子函数使用C++的引用,注意在C++中从标准输入读取字符串,需要使用fgets(p,100,stdin)

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void readp(char *&p)
{
    p = (char *)malloc(100);
    fgets(p,100,stdin);
}

int main()
{
    char *p;
    readp(p);
    puts(p);
    free(p);
    return 0;
}

day3

初始化顺序表(顺序表中元素为整型),里边的元素是1,2,3,然后通过scanf读取一个元素(假如插入的是6),插入到第2个位置,打印输出顺序表,每个元素占3个空格,格式为1  6  2  3,然后scanf读取一个整型数,是删除的位置(假如输入为1),然后输出顺序表  6  2  3,假如输入的位置不合法,输出false字符串。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define maxsize 50
using namespace std;

typedef int ElemType;

typedef struct{
     ElemType Data[maxsize];
     int length;
}SeqList;


bool InsertList(SeqList &L,int i,int n){

if((i<1)||(i>L.length+1))
{
    return false;
}
else if(L.length+1>maxsize){
    return false;
}
else{
    int j=0;
    for(j=L.length;j>i-1;j--){
        L.Data[j]=L.Data[j-1];
    }
    L.Data[i-1]=n;
    L.length++;
    return true;
}
}

bool DeleteList(SeqList &L,int n){

if((n<1)||(n>L.length)){
    return false;
}
else{
    int j =0;
    int e =0;
    e=L.Data[n-1];
    for(j=n;j<L.length;j++)
    {
        L.Data[j-1]=L.Data[j];
    }
    L.length--;
    return true;
}
}

void PrintList(SeqList L){

int i =0;
for(i=0;i<L.length;i++){
    printf("%3d",L.Data[i]);
}
    printf("\n");
}

int main()
{
    int n =0;
    bool ret;
    SeqList L;
    L.Data[0]=1;
    L.Data[1]=2;
    L.Data[2]=3;
    L.length=3;
    scanf("%d",&n);
    ret=InsertList(L,2,n);
    if(ret){
        PrintList(L);}
    else{
        printf("false");}
    scanf("%d",&n);
    ret=DeleteList(L,n);
    if(ret){
        PrintList(L);}
    else{
        printf("false");}
    return 0;
}

中级day4

输入3 4 5 6 7 9999一串整数,9999代表结束,通过头插法新建链表,并输出,通过尾插法新建链表并输出

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef int ElemType;

typedef struct LNode{
     ElemType data;
     struct LNode *next;
}LNode,*LinkList;


void PrintList(LinkList L)
{
L=L->next;
while(L!=NULL)
{
printf("%d",L->data);///打印当前结点数据

L=L->next;///指向下一个结点

if(L!=NULL)
{
printf(" ");
}
}
printf("\n");
}

LinkList touInsertList(LinkList &L)
{
    LNode *p;
    int x;
    L = (LinkList) malloc(sizeof(LinkList));///*LinkList p = (*LinkList) malloc(10*sizeof(*LinkList));
    L->next=NULL;
    scanf("%d",&x);
    while(x!=9999)
    {
        p = (LinkList) malloc(sizeof(LinkList));
        p->data = x;
        p->next=L->next;///p指向l的下一个节点
        L->next=p;///l的下一个节点指向p
        scanf("%d",&x);
    }

    return L;

}

LinkList weiInsertList(LinkList &L)
{

    int x;
    L = (LinkList)malloc(sizeof(LinkList));
    LinkList p=L;///LinkList p;
    LinkList r=L;///LinkList r=NULL;
    ///L->next = r;
    scanf("%d",&x);
    while(x!=9999)
    {
        p=(LinkList)malloc(sizeof(LinkList));
        p->data=x;
        ///p->next=NULL;
        r->next=p;
        r=p;
        scanf("%d",&x);
    }
    r->next=NULL;
    return L;
}

int main()
{
    LinkList L;   
    touInsertList(L);
    PrintList(L);

    LinkList M;  
    weiInsertList(M);
    PrintList(M);
    return 0;
}

day6

新建一个栈,读取标准输入3个整数3 4 5,入栈3 4 5,依次出栈,打印 5 4 3,新建循环队列(Maxsize为5),读取标准输入3 4 5 6 7,入队7时,队满,打印false,然后依次出队,输出 3 4 5 6

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define maxsize 10
#define maxsize1 5

using namespace std;
///读取标准输入3个整数3 4 5,入栈3 4 5,依次出栈,打印 5 4 3
///新建循环队列(Maxsize为5,读取标准输入5个整数,入队7时,队满,打印false,然后依次出队,输出 3 4 5 6
typedef int ElemType;

typedef struct Sqtack{
     ElemType data[maxsize];
     int top;
}SqStack;
typedef struct SQueue{
     ElemType data[maxsize1];
     int rear,qfront;
}SqQueue;


void initSqStack(SqStack &s)
{
    s.top=-1;
}
void initSqQueue(SqQueue &s)
{
    s.qfront=s.rear=0;
}

bool push(SqStack &s,ElemType x)
 {
     if(s.top==maxsize)
     {
         return false;
     }
     s.data[++s.top]=x;
     return true;
 }
 bool insertQueue(SqQueue &s,ElemType x)
 {
    if(s.qfront==(s.rear+1)%maxsize1)
    {
        printf("false\n");
        return false;
    }
     s.data[s.rear]=x;
     s.rear=(s.rear+1)%maxsize1;

     return true;
 }
 bool pop(SqStack &s,ElemType &x)
 {
     if(s.top==-1)
     {
         return false;
     }
     x=s.data[s.top--];
     return true;
 }
 bool DeQueue(SqQueue &s,ElemType &x)
 {
     if(s.qfront==s.rear)
     {
         return false;
     }
     x=s.data[s.qfront];
     s.qfront=(s.qfront+1)%maxsize1;
     return true;
 }
int main()
{
    ElemType x=1,e;
    int i;
    SqStack s;
    initSqStack(s);
    for(i=0;i<3;i++)
    {
      scanf("%d",&e);
      push(s,e);
    }
      for(i=0;i<3;i++)
    {
      pop(s,x);
      printf("%2d",x);
    }
    printf("\n");
    SqQueue m;
    initSqQueue(m);

    for(i=0;i<5;i++)
    {
      scanf("%d",&e);
      insertQueue(m,e);
    }
    while(m.qfront!=m.rear)
    {
      DeQueue(m,e);
      printf("%2d",e);
    }
    printf("\n");
    return 0;
}

day7

读取字符串abcdefghij,然后层次建树建立一颗二叉树,然后前序遍历输出abdhiejcfg,注意不要打印前序遍历几个汉字

#include <stdio.h>
#include <stdlib.h>
//#include<string>///不是#include<string.h>
//using namespace std;///不加这一句会报错: 'str' was not declared in this scope
//#define MaxSize 100
typedef char BiElemType;
typedef int ElemType;
typedef struct BiTNode{

    BiElemType data;
    struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

typedef struct tag{
    BiTree p;///树的某一个节点的地址值
    struct tag *pnext;
}tag,*tag_t;

typedef struct LinkNode{
    ElemType qdata;
    struct LinkNode *next;

}LinkNode;
typedef struct LinkQueue{

    LinkNode *pfront,*prear;
}LinkQueue;

void InitQueue(LinkQueue &Q)
{
    Q.pfront=(LinkNode*)malloc(sizeof(LinkNode));
    Q.prear=(LinkNode*)malloc(sizeof(LinkNode));
    Q.pfront->next=NULL;
}

bool isEmpty(LinkQueue Q)
{
    if(Q.pfront==Q.prear)
        return true;
    else
        return false;
}

void EnQueue(LinkQueue &Q,ElemType x)
{
    LinkNode *p=(LinkNode*)malloc(sizeof(LinkNode));
    p->qdata=x;
    p->next=NULL;
    Q.prear->next=p;
    Q.prear=p;
}
bool DeQueue(LinkQueue &Q,ElemType &x)
{
    if(isEmpty(Q))
        return false;
    else{
        LinkNode *p=Q.pfront->next;
        x=p->qdata;
        Q.pfront->next=p->next;
        if (Q.prear == p)
		Q.prear = Q.pfront;
	free(p);
	return true;

    }
}
void PreOrder(BiTree T)
{
    if(T!=NULL)
    {
        putchar(T->data);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }

}

///读取字符串abcdefghij,然后层次建立一颗二叉树,然后前序遍历输出abdhiejcfg,注意不要打印前序遍历几个汉字

int main() {
	/*char s[50]; ///元素自动定为空字符(即'\0' )
    //gets(s);
    for(int i=0;s[i]=='\0';i++)///s[i]!="0","0"是字符串的首地址,ISO C++ forbids comparison between pointer and integer
    {
       printf("a");
    }
    //puts(s);
    char str[50] = {0};
    scanf("%s", str);
    int i = 0;
    BiTree root = creatTree(str, &i);
    preprint(root);*/
  BiTree pnew;
	char c;
    BiTree tree = NULL;///树根
	tag_t phead = NULL, ptail = NULL, listpnew, pcur;///phead就是队列头,ptail就是队列尾
    while(scanf("%c",&c)!=EOF)///c可以将读入的字符串拆成一个一个的
    {
        if(c=='\n')
        {
            break;
        }
            pnew = (BiTree)calloc(1, sizeof(BiTNode));///sizeof(BiTNode)错.calloc申请空间并对空间进行初始化,赋值为0
            pnew->data = c;///数据放进去
            listpnew = (tag_t)calloc(1, sizeof(tag_t));///给队列结点申请空间
            listpnew->p= pnew;
		if (NULL == tree)
		{
			tree = pnew;///树的根
			phead = listpnew;///队列头
			ptail = listpnew;///队列尾
			pcur = listpnew;
			continue;
		}
		else {
			ptail->pnext = listpnew;///新结点放入链表,通过尾插法
			ptail = listpnew;///ptail指向队列尾部
		}///pcur始终指向要插入的结点的位置
		if (NULL == pcur->p->lchild)///如何把新结点放入树
		{
			pcur->p->lchild = pnew;///把新结点放到要插入结点的左边
		}
		else if (NULL == pcur->p->rchild)
		{
			pcur->p->rchild = pnew;///把新结点放到要插入结点的右边
			pcur = pcur->pnext;///左右都放了结点后,pcur指向队列的下一个
		}
	}
	PreOrder(tree);

}

day8

读取字符串abcdefghij,然后层次建树建立一颗二叉树,然后中序遍历输出 hdibjeafcg,后序遍历输出 hidjebfgca,层序遍历输出abcdefghij,注意不要输出汉字

#include <stdio.h>
#include <stdlib.h>
using namespace std;

///读取字符串abcdefghij,然后层次建树建立一颗二叉树,然后中序遍历输出 hdibjeafcg,后序遍历输出 hidjebfgca,层序遍历输出abcdefghij,注意不要输出汉字
typedef char BiElemType;


typedef struct BiTNode{

    BiElemType data;
    struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

typedef BiTree ElemType;

typedef struct tag{
    BiTree p;///树的某一个节点的地址值
    struct tag *pnext;
}tag,*tag_t;

typedef struct LinkNode{
    ElemType qdata;
    struct LinkNode *next;

}LinkNode;
typedef struct {

    LinkNode *pfront,*prear;
}LinkQueue;

void InitQueue(LinkQueue &Q)
{
    Q.pfront=Q.prear=(LinkNode*)malloc(sizeof(LinkNode));
    Q.pfront->next=NULL;
}

bool isEmpty(LinkQueue Q)
{
    if(Q.pfront==Q.prear)
        return true;
    else
        return false;
}

void EnQueue(LinkQueue &Q,ElemType x)
{
    LinkNode *p=(LinkNode*)malloc(sizeof(LinkNode));
    p->qdata=x;
    p->next=NULL;
    Q.prear->next=p;
    Q.prear=p;
}
bool DeQueue(LinkQueue &Q,ElemType &x)
{
    if(isEmpty(Q))
        return false;
    else{
        LinkNode *p=Q.pfront->next;
        x=p->qdata;
        Q.pfront->next=p->next;
        if (Q.prear == p)
		Q.prear = Q.pfront;
	free(p);
	return true;

    }
}
void PreOrder(BiTree T)
{
    if(T!=NULL)
    {
        putchar(T->data);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }

}
void InOrder(BiTree T)
{
    if(T!=NULL)
    {

        InOrder(T->lchild);
        putchar(T->data);
        InOrder(T->rchild);
    }

}
void PostOrder(BiTree T)
{
    if(T!=NULL)
    {

        PostOrder(T->lchild);
        PostOrder(T->rchild);
        putchar(T->data);
    }

}
void LevelOrder(BiTree T)
{
    LinkQueue Q;
    InitQueue(Q);
    BiTree p;
    EnQueue(Q,T);
   while(!isEmpty(Q))
    {
        DeQueue(Q,p);
        putchar(p->data);
        if(p->lchild!=NULL)
            EnQueue(Q,p->lchild);
        if(p->rchild!=NULL)
            EnQueue(Q,p->rchild);

    }

}
///读取字符串abcdefghij,然后层次建立一颗二叉树,然后前序遍历输出abdhiejcfg,注意不要打印前序遍历几个汉字

int main() {
	/*char s[50]; ///元素自动定为空字符(即'\0' )
    //gets(s);
    for(int i=0;s[i]=='\0';i++)///s[i]!="0","0"是字符串的首地址,ISO C++ forbids comparison between pointer and integer
    {
       printf("a");
    }
    //puts(s);
    char str[50] = {0};
    scanf("%s", str);
    int i = 0;
    BiTree root = creatTree(str, &i);
    preprint(root);*/
  BiTree pnew;
	char c;
    BiTree tree = NULL;///树根
	tag_t phead = NULL, ptail = NULL, listpnew, pcur;///phead就是队列头,ptail就是队列尾
    while(scanf("%c",&c)!=EOF)///c可以将读入的字符串拆成一个一个的。
    {
        if(c=='\n')
        {
            break;
        }
            pnew = (BiTree)calloc(1, sizeof(BiTNode));///sizeof(BiTNode)错.calloc申请空间并对空间进行初始化,赋值为0
            pnew->data = c;///数据放进去
            listpnew = (tag_t)calloc(1, sizeof(tag_t));///给队列结点申请空间
            listpnew->p= pnew;
		if (NULL == tree)
		{
			tree = pnew;///树的根
			phead = listpnew;///队列头
			ptail = listpnew;///队列尾
			pcur = listpnew;
			continue;
		}
		else {
			ptail->pnext = listpnew;///新结点放入链表,通过尾插法
			ptail = listpnew;///ptail指向队列尾部
		}///pcur始终指向要插入的结点的位置
		if (NULL == pcur->p->lchild)///如何把新结点放入树
		{
			pcur->p->lchild = pnew;///把新结点放到要插入结点的左边
		}
		else if (NULL == pcur->p->rchild)
		{
			pcur->p->rchild = pnew;///把新结点放到要插入结点的右边
			pcur = pcur->pnext;///左右都放了结点后,pcur指向队列的下一个
		}
	}
	//PreOrder(tree);
    InOrder(tree);
    printf("\n");
    PostOrder(tree);
    printf("\n");
    LevelOrder(tree);
    printf("\n");
}

day9

读取10个元素 87  7 60 80 59 34 86 99 21  3,然后建立二叉查找树,中序遍历输出3  7 21 34 59 60 80 86 87 99,针对有序后的元素,存入一个长度为10的数组中,通过折半查找找到21的下标(下标为2),然后输出2

#include <stdio.h>
#include <stdlib.h>
using namespace std;
///读取10个元素 87  7 60 80 59 34 86 99 21  3,然后建立二叉查找树,
///中序遍历输出3  7 21 34 59 60 80 86 87 99,针对有序后的元素,存入一个长度为10的数组中,
///通过折半查找找到21的下标(下标为2),然后输出2
typedef int ElemType;

typedef struct BiTNode{

    ElemType key;
    struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

int Insert_Tree(BiTree &T,int key)
{
    if(T==NULL)
    {
        T=(BiTNode*)malloc(sizeof(BiTNode));
        T->key=key;
        T->lchild=NULL;
        T->rchild=NULL;
        return 1;
    }
    else if(T!=NULL&&key>T->key)
    {
        Insert_Tree(T->rchild,key);
        return 1;
    }
    else if(T!=NULL&&key<T->key)
       {
          Insert_Tree(T->lchild,key);
          return 1;
       }
    else
        return 0;
}

void InOrder(BiTree T,int* b,int &j)
{
    if(T!=NULL)
    {
        InOrder(T->lchild,b,j);
        printf("%3d",T->key);
        b[j]=T->key;
        j++;
        InOrder(T->rchild,b,j);
    }

}

int BinarySearch(int *b,int key)
{
    int low=0,hight=9,mid;
    while(low<=hight){
      mid=(low+hight)/2;
    if(key==b[mid])
    {
        return mid;
    }
    else if(key>b[mid])
    {
        low = mid +1 ;
    }
     else if(key<b[mid])
    {
        hight = mid - 1 ;
    }

    }
    return -1;
}

int main() {
	int a[10],i,b[10]={0},j=0,pos=-1;
	BiTree T = NULL;
	for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<10;i++)
    {
       Insert_Tree(T,a[i]);
    }
    InOrder(T,b,j);
    printf("\n");
    pos=BinarySearch(b,21);
    printf("%d",pos);
    return 0;
}

day11

读取10个整型数据12 63 58 95 41 35 65  0 38 44,然后通过冒泡排序,快速排序,插入排序,分别对该组数据进行排序,输出3次有序结果,每个数的输出占3个空格

#include <stdio.h>
#include <stdlib.h>
using namespace std;
///day11 读取10个整型数据12 63 58 95 41 35 65  0 38 44,然后通过冒泡排序,快速排序,插入排序,
///分别对该组数据进行排序,输出3次有序结果,每个数的输出占3个空格

void InsertSort(int *a,int n)
{
    int i,j,temp;
    for(i=1;i<n;i++)
    {
        if(a[i]<a[i-1])
        {
            temp=a[i];
            for(j=i-1;j>=0&&a[j]>temp;--j){/// for(j=i-1;j>=0&&a[j]>a[i];--j)错 ,为什么呢
                a[j+1]=a[j];
            }
            a[j+1]=temp;
        }
    }
}

int partitionsort(int *a,int low,int high)
{
    int data=a[low];
    while(low<high)
    {
        while((low<high)&&(data<=a[high]))///while((low<high)&&(a[low]<=a[high]))错
            --high;///high--;错
            a[low]=a[high];
        while((low<high)&&(a[low]<=data))///while((low<high)&&(a[low]<=a[high]))错
            ++low;///++low;错
            a[high]=a[low];
    }
    a[low]=data;

    return low;
}

void quickSort(int *a,int low,int high)
{
    if(low<high)
    {
        int pos=partitionsort(a,low,high);
        quickSort(a,low,pos-1);
        quickSort(a,pos+1,high);
    }
}

void BubbleSort(int *a,int n)
{
    int i,j;
    for(i=0;i<n-1;i++)
    {
        int flag=0;
        for(j=n-1;j>i;j--)
        {
            if(a[j-1]>a[j])
            {
                int temp;
                temp=a[j-1];
                a[j-1]=a[j];
                a[j]=temp;
                flag=1;
            }
        }
        if(flag==0)
            return;
    }
}

int main() {
    int a[10]={12,63,58,95,41,35,65,0,38,44};
    BubbleSort(a,10);
    for(int i =0;i<10;i++)
    {
      printf("%3d",a[i]);
    }
    printf("\n");
    int b[10]={12,63,58,95,41,35,65,0,38,44};
    quickSort(b,0,9);
    for(int i =0;i<10;i++)
    {
      printf("%3d",b[i]);
    }
    printf("\n");
    int c[10]={12,63,58,95,41,35,65,0,38,44};
    InsertSort(c,10);
    for(int i =0;i<10;i++)
    {
      printf("%3d",c[i]);
    }
    return 0;
}

day12

读取10个整型数据12 63 58 95 41 35 65  0 38 44,然后通过选择排序,堆排序,分别对该组数据进行排序,输出2次有序结果,每个数的输出占3个空格

#include <stdio.h>
#include <stdlib.h>
using namespace std;
///day11 读取10个整型数据12 63 58 95 41 35 65  0 38 44,然后通过选择排序,堆排序,
///分别对该组数据进行排序,输出2次有序结果,每个数的输出占3个空格

void SelectSort(int a[],int n)
{
    int i,j;
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[j]<a[i])
                {
                int temp=a[i];
                a[i]=a[j];
                a[j]=temp;
                }
        }
    }
}

void AdjustHeap(int a[],int k,int len)
{
    int temp=a[k];
    for(int i=2*k;i<len;i*=2)
    {
        if(i<len-1&&a[i]<a[i+1])
        {
            i++;
        }
        if(temp>=a[i])
            break;

        else{
            a[k]=a[i];
            k=i;
        }
    }
    a[k]=temp;
}

void BuildHeap(int a[],int len)
{
    for(int i=(len-1)/2;i>=0;i--)
    {
        AdjustHeap(a,i,len);
    }
}

void HeapSort(int a[],int len)
{
    BuildHeap(a,len);
    for(int i=len-1;i>0;i--)
    {
        int temp = a[i];
        a[i]=a[0];
        a[0]=temp;
        AdjustHeap(a,0,i);
    }
}

int main() {
    int a[10]={12,63,58,95,41,35,65,0,38,44};
    SelectSort(a,10);
    for(int i =0;i<10;i++)
    {
      printf("%3d",a[i]);
    }
    printf("\n");
    int b[10]={12,63,58,95,41,35,65,0,38,44};
    HeapSort(b,10);
    for(int i =0;i<10;i++)
    {
      printf("%3d",b[i]);
    }

    return 0;
}

高级day1

读取10个整型数据12 63 58 95 41 35 65  0 38 44,然后通过归并排序,对该组数据进行排序,输出有序结果,每个数的输出占3个空格

#include <stdio.h>
#include <stdlib.h>
using namespace std;
///day11 读取10个整型数据12 63 58 95 41 35 65  0 38 44,然后通过选择排序,堆排序,
///分别对该组数据进行排序,输出2次有序结果,每个数的输出占3个空格

void SelectSort(int a[],int n)
{
    int i,j;
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[j]<a[i])
                {
                int temp=a[i];
                a[i]=a[j];
                a[j]=temp;
                }
        }
    }
}

void AdjustHeap(int a[],int k,int len)
{
    int temp=a[k];
    for(int i=2*k;i<len;i*=2)
    {
        if(i<len-1&&a[i]<a[i+1])
        {
            i++;
        }
        if(temp>=a[i])
            break;

        else{
            a[k]=a[i];
            k=i;
        }
    }
    a[k]=temp;
}

void BuildHeap(int a[],int len)
{
    for(int i=(len-1)/2;i>=0;i--)
    {
        AdjustHeap(a,i,len);
    }
}

void HeapSort(int a[],int len)
{
    BuildHeap(a,len);
    for(int i=len-1;i>0;i--)
    {
        int temp = a[i];
        a[i]=a[0];
        a[0]=temp;
        AdjustHeap(a,0,i);
    }
}
int *b=(int *)malloc(sizeof(int*));

void MergeAB(int a[],int low,int mid,int high)
{
    for(int k=low;k<=high;k++)
    {
        b[k]=a[k];
    }
    int i =low;int j=mid+1;int k=low;
    for(;i<=mid&&j<=high;k++)
    {
        if(b[i]<=b[j])
            a[k]=b[i++];
        else
            a[k]=b[j++];

    }
    while(i<=mid)
            a[k++]=b[i++];
    while(j<=high)
        a[k++]=b[j++];

}

void MergeSort(int a[],int low,int high)
{
    if(low<high)
    {
        int mid=(low+high)/2;
        MergeSort(a,low,mid);
        MergeSort(a,mid+1,high);
        MergeAB(a,low,mid,high);
    }
}

int main() {

    int a[10]={12,63,58,95,41,35,65,0,38,44};
    MergeSort(a,0,9);
    for(int i =0;i<10;i++)
    {
      printf("%3d",a[i]);
    }

    return 0;
}

高级day2

图的顶点和边如下,直接初始化好,无需读取标准输入,完成有向图的邻接表初始化,完成深度优先遍历,广度优先遍历

char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};

char edges[][2] = {

{'A', 'B'},

{'B', 'C'},

{'B', 'E'},

{'B', 'F'},

{'C', 'E'},

{'D', 'C'},

{'E', 'B'},

{'E', 'D'},

{'F', 'G'}};

#include <stdio.h>
#include <stdlib.h>
#include <cstring>
using namespace std;
#define Maxsize 20
/*图的顶点和边如下,直接初始化好,无输入,完成有向图的邻接表初始化,完成深度优先遍历,广度优先遍历
char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char edges[][2] = {
{'A', 'B'},
{'B', 'C'},
{'B', 'E'},
{'B', 'F'},
{'C', 'E'},
{'D', 'C'},
{'E', 'B'},
{'E', 'D'},
{'F', 'G'}};
输出内容如下(注意每个字母占两个字符位置%2d):
A B C E D F G
A B C E F D G
*/
typedef struct arcNode{//边邻接表结构体

    int ivex;//边指向的节点的位置
    struct arcNode* next;//节点的下一条边

}arcNode;
typedef struct VNode//顶点邻接表结构体
{
    char data;//节点存的信息
    arcNode* first;//节点指向的第一条边
}VNode,AdjList[Maxsize];
typedef struct Graph//图的结构体
{
    AdjList LGraph;//图的邻接表
    int vexnum,arcnum;//顶点数,边数
}Graph;
static int getposition(Graph g,char ch)
{
    for(int i=0;i<g.vexnum;i++)
    {
        if(g.LGraph[i].data==ch)
            return i;
    }
    return -1;
}
Graph* create()
{
    char c1,c2;
    char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
    char edges[][2] = {
    {'A', 'B'},
    {'B', 'C'},
    {'B', 'E'},
    {'B', 'F'},
    {'C', 'E'},
    {'D', 'C'},
    {'E', 'B'},
    {'E', 'D'},
    {'F', 'G'}};
    int lvex=(sizeof(vexs)/sizeof(vexs[0]));///获取长度
    int ledge=(sizeof(edges)/sizeof(edges[0]));///获取行数,求数组列数: sizeof(a[0])/sizeof(int)
    int p1,p2;
    arcNode * node1;
    Graph *G;
    if((G=(Graph*)malloc(sizeof(Graph)))==NULL)
        return NULL;
    memset(G,0,sizeof(Graph));///将申请的内存单元的值都置为0
    G->arcnum=ledge;
    G->vexnum=lvex;
    for(int i=0;i<G->vexnum;i++)///初始化顶点邻接表
    {
        G->LGraph[i].data=vexs[i];
        G->LGraph[i].first=NULL;
    }
    for(int i =0;i<G->arcnum;i++)
    {
        c1=edges[i][0];
        c2=edges[i][1];
        p1=getposition(*G,c1);
        p2=getposition(*G,c2);

    node1=(arcNode*)calloc(1,sizeof(arcNode));
    node1->ivex=p2;
    if(G->LGraph[p1].first==NULL)
    {
        G->LGraph[p1].first=node1;
    }
    else
    {
        arcNode* node3= G->LGraph[p1].first;
       while(node3->next)
        {node3=node3->next;}
       node3->next=node1;

        }
    }
    return G;
}
void printGraph(Graph G)
{
    int i;
    arcNode* node;
    for(i=0;i<G.vexnum;i++)
    {
        printf("%d(%c)   ",i,G.LGraph[i].data);
        node=G.LGraph[i].first;
        while(node!=NULL)
        {
            printf("%d(%c)",node->ivex,G.LGraph[node->ivex].data);
            node=node->next;
        }
    printf("\n");
    }

}

static void DFS(Graph G,int i,int* visited)
{
    arcNode* node;
    visited[i]=1;
    printf("%2c",G.LGraph[i].data);
    node=G.LGraph[i].first;
    while(node!=NULL)
    {
        if(visited[node->ivex]==0)
    {
        DFS(G,node->ivex,visited);
    }//注意加括弧的位置
    node=node->next;
    }

}
void DFSTraverse(Graph G)
{
    int i;
    int visited[Maxsize];
    for(i=0;i<G.vexnum;i++)
    {
        visited[i]=0;
    }
    for(i=0;i<G.vexnum;i++)
    {
        if(visited[i]==0)
        {
            DFS(G,i,visited);
        }
    }
    printf("\n");
}

void BFS(Graph G)///图的广度优先遍历
{

    int head=0,rear=0;
    int sequeue[Maxsize];///辅助队列是数组
    int visit[Maxsize];
    int i,j,k;
    arcNode * node;
    //每个顶点未被访问

    for(i = 0;i<G.vexnum;i++)
    {
        visit[i]=0;
    }

    for(i=0;i<G.vexnum;i++)
    {
        if(visit[i]==0)
        {
            visit[i]=1;
            printf("%2c",G.LGraph[i].data);
            sequeue[rear++]=i;
        }

        while(head!=rear)
        {
            k=sequeue[head++];
            node=G.LGraph[k].first;
            while(node!=NULL)
            {
                j=node->ivex;
                if(visit[j]==0)
                {
                    visit[j]=1;
                    printf("%2c",G.LGraph[j].data);
                    sequeue[rear++]=j;
                }
                node=node->next;
            }

        }
    }
    printf("\n");
}

int main() {
    Graph *G;///定义成结构体malloc完后会释放掉
    G=create();
    ///printGraph(*G);
    DFSTraverse(*G);
    BFS(*G);
    return 0;
}

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值