• 7、c++版,在大学学的编程基础知识


    1、各种排序

    #include<iostream>
    using namespace std;
    //-------直接插入排序
    void InsertSort(ElemType A[],int n)
    {
        ElemType x;
        int i,j;
        for(i=1;i<n;i++)
        {
            x=A[i];
            for(j=i-1;j>=0;j--)
                if(x.stn<A[j].stn) A[j+1]=A[j];
                else break;
            A[j+1]=x;
        }
    }
    //----------------------
    //-------希尔排序-----
    void ShellSort(ElemType A[],int n)
    {
        ElemType x;
        int i,j,d;
        for(d=n/2;d>=1;d/=2)
        {
            for(i=d;i<n;i++)
            {
                x=A[i];
                for(j=i-d;j>=0;j-=d)
                {
                    if(x.stn<A[j].stn) A[j+d]=A[j];
                    else break;
                }
                A[j+d]=x;
            }
        }
    }
    ///-----直接选择排序--
    void SelectSort(ElemType A[],int n)
    {
        ElemType x;
        int i,j,k;
        for(i=1;i<=n-1;i++)
        {
            k=i-1;
            for(j=i;j<=n-1;j++)
            {
                if(A[j].stn<A[k].stn) k=j;
            }
            if(k!=i-1)
            {
                x=A[i-1];A[i-1]=A[k];A[k]=x;
            }
        }
    }
    //---------冒泡排序----------
    void BubbleSort(ElemType A[],int n)
    {
        ElemType x;
        int i,j,flag;
        for(i=1;i<=n-1;i++)
        {
            flag=0;
            for(j=n-1;j>=i;j--)
                if(A[j].stn<A[j-1].stn)
                {
                    x=A[j-1];A[j-1]=A[j];A[j]=x;
                    flag=1;
                }
            if(flag==0) return;
        }
    }
    int main()
    {
        
        return 0;
        }
     

    2、邻接矩阵,外加克鲁斯卡尔,弗洛伊德,普里姆等算法,进行图的遍历,和最小生成树的处理

    #include<iostream.h>
    #include<stdlib.h>
    #include<strstrea.h>
    typedef int VertexType;
    typedef int WeightType;
    const int MaxEdgeNum=10;
    const int MaxVertexNum=10;
    const WeightType MaxValue=1000;
    typedef VertexType vexlist[MaxVertexNum];
    typedef int adjmatrix[MaxVertexNum][MaxVertexNum];
    struct edgenode
    {
        int adjvex;
        WeightType weight;
        edgenode*next;
    };
    typedef edgenode*adjlist[MaxVertexNum];
    struct edge
    {
        int fromvex;
        int endvex;
        WeightType  weight;
    };
    typedef edge edgeset[MaxEdgeNum];
    //#include"4_01栈的顺序存储.cpp"
    void PATH(edgenode*path[],int m,int j)
    {
        edgenode *p,*q,*s;
        p=path[j];
        while(p!=NULL)
        {
            path[j]=p->next;
            delete p;
            p=path[j];
        }
        p=path[m];
        while(p!=NULL)
        {
            q=new edgenode;
            q->adjvex=p->adjvex;
            if(path[j]==NULL) path[j]=q;
            else s->next=q;
            s=q;
            p=p->next;
        }
        q=new edgenode;
        q->adjvex=j;
        q->next=NULL;
        s->next=q;
    }
    void Dijkstra(adjmatrix GA, int dist[],edgenode* path[], int i, int n)
    {
        int j,k,w,m;
        bool* s=new bool[n];
        //分别给s,dist和path数组赋初值
        for(j=0; j<n; j++) {
            if(j==i) s[j]=true; else s[j]=false;
            dist[j]=GA[i][j];
            if(dist[j]<MaxValue && j!=i) {
                edgenode* p1=new edgenode;
                edgenode* p2=new edgenode;
                p1->adjvex=i; p2->adjvex=j; p2->next=NULL;
                p1->next=p2; path[j]=p1;
            }
            else
                path[j]=NULL;
        }
        for(k=1; k<=n-2; k++)
        {
            //求出第k个终点m
            w=MaxValue; m=i;
            for(j=0; j<n; j++)
                if(s[j]==false && dist[j]<w) {
                    w=dist[j]; m=j;
                }
                if(m!=i) s[m]=true;
                else break;
                for(j=0; j<n; j++)
                    if(s[j]==false && dist[m]+GA[m][j]<dist[j]) {
                        dist[j]=dist[m]+GA[m][j];
                        PATH(path, m, j);
                    }
        }
    }
    
    void Floyed(adjmatrix GA,adjmatrix A,int n)
    {
        int i,j,k;
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                A[i][j]=GA[i][j];
        for(k=0;k<n;k++)
            for(i=0;i<n;i++)
                for(j=0;j<n;j++){
                    if(i==k || j==k || i==j) continue;
                    if(
                        A[i][k]+A[k][j]<A[i][j])
                        A[i][j]=A[i][k]+A[k][j];
                }
    }
    
    void Prim(adjmatrix GA,edgeset CT,int n)
    {
        int i,j,k,min,t,m,w;
        for(i=0;i<n-1;i++)
        {
            CT[i].fromvex=0;
            CT[i].endvex=i+1;
            CT[i].weight=GA[0][i+1];
        }
        for(k=1;k<n;k++)
        {
            min=MaxValue;
            m=k-1;
            for(j=k-1;j<n-1;j++)
                if(CT[j].weight<min)
                {
                    min=CT[j].weight;
                    m=j;
                }
                edge temp=CT[k-1];
                CT[k-1]=CT[m];
                CT[m]=temp;
                j=CT[k-1].endvex;
                for(i=k;i<n-1;i++)
                {
                    t=CT[i].endvex;
                    w=GA[j][t];
                    if(w<CT[i].weight)
                    {
                        CT[i].weight=w;
                        CT[i].fromvex=j;
                    }
                }
        }
    }
    void Kruskal(edgeset GE,edgeset CT,int n)
    {
        int i,j;
        bool**s=new bool*[n];
        for(i=0;i<n;i++)
            s[i]=new bool[n];
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
                if(i==j) s[i][j]=true;
                else s[i][j]=false;
        }
        int k=1;
        int d=0;
        int m1,m2;
        while(k<n)
        {
            for(i=0;i<n;i++)
            {
                if(s[i][GE[d].fromvex]==true) m1=i;
                if(s[i][GE[d].endvex]==true) m2=i;
            }
            if(m1!=m2)
            {
                CT[k-1]=GE[d];
                k++;
                for(j=0;j<n;j++)
                {
                    s[m1][j]=s[m1][j]||s[m2][j];
                    s[m2][j]=false;
                }
            }
            d++;
        }
        for(i=0;i<n;i++)
            delete[]s[i];
        delete[]s;
    }
    //边集数组
    
    void InitArray(edgeset GE)
    {
        for(int i=0;i<MaxEdgeNum;i++)
        {
            GE[i].fromvex=GE[i].endvex=-1;
            GE[i].weight=MaxValue;
        }
    }
    void CreateArray(edgeset GE,int n,char*s,int k)
    {
        istrstream sin(s);
        char c1,c2,c3;
        int i,j,c=0;
        WeightType w;
        sin>>c1;
        if(k==0){
            do{
                sin>>c1>>i>>c2>>j>>c3;
                GE[c].fromvex=i;
                GE[c].endvex=j;
                GE[c].weight=1;
                c++;
                sin>>c1;
            }while(c1==',');
        }
        else{
            do{
                sin>>c1>>i>>c2>>j>>c3>>w;
                GE[c].fromvex=i;
                GE[c].endvex=j;
                GE[c].weight=w;
                c++;
                sin>>c1;
            }while(c1==',');
        }
    }
    void Arry(edgeset GE,int i,int n,bool*visited)
    {
        int j=i,k=0;
        while(k!=n)
        {
            for(int t=0;GE[t].fromvex!=-1;t++)
            {
                if(GE[t].fromvex==j&&!visited[j])
                {
                    cout<<j<<" ";
                    visited[j]=true;
                    j=GE[t].endvex;
                    k++;
                    break;
                }
            }
            if(GE[t].fromvex==-1)
            {
                cout<<j<<" ";
                k++;
            }
        }
    }
    void Arry2(edgeset GE,int i,int n,bool*visited)
    {
        int j=i,k=1;
        int q[10];
        int front=0,rear=0;
        cout<<j<<" ";
        while(k!=n)
        {
            for(int t=0;GE[t].fromvex!=-1;t++)
            {
                if(GE[t].fromvex=j&&!visited[j])
                {
                    cout<<GE[t].endvex<<" ";
                    k++;
                    q[rear]=GE[t].endvex;
                    rear=(rear+1)%10;
                }
                else 
                {
                    visited[j]=true;
                    j=q[front];
                    front=(front+1)%10;
                    break;
                }
            }
        }
    }
    
    
    void InitAdjoin(adjlist GL)
    {
        for(int i=0;i<MaxVertexNum;i++)
            GL[i]=NULL;
    }
    void CreateAdjoin(adjlist GL,int n,char*s,int k1,int k2)
    {
        istrstream sin(s);
        char c1,c2,c3;
        int i,j;
        WeightType w;
        edgenode*p;
        sin>>c1;
        if(k2==0){
            do{
                sin>>c1>>i>>c2>>j>>c3;
                p=new edgenode;
            
                p->adjvex=j;p->weight=1;
                p->next=GL[i];
                GL[i]=p;
                if(k1==0){
                    p=new edgenode;
                    p->adjvex=i;p->weight=1;
                    p->next=GL[j];
                    GL[j]=p;
                }
                sin>>c1;
            }while(c1==',');
        }
        else{
            do{
                sin>>c1>>i>>c2>>j>>c3>>w;
                p=new edgenode;
                p->adjvex=j;p->weight=w;
                p->next=GL[i];
                GL[i]=p;
                if(k1==0)
                {
                    p=new edgenode;
                    p->adjvex=i;p->weight=w;
                    p->next=GL[j];
                    GL[j]=p;
                }
                sin>>c1;
            }while(c1==',');
        }
    }
    
    void InitMatrix(adjmatrix GA,int k)
    {
        int i,j;
        for(i=0;i<MaxVertexNum;i++)
            for(j=0;j<MaxVertexNum;j++)
                if(i==j) GA[i][j]=0;
                else if(k) GA[i][j]=MaxValue;
                else GA[i][j]=0;
    }
    void CreateMatrix(adjmatrix GA,int n,char*s,int k1,int k2)
    {
        istrstream sin(s);
        char c1,c2,c3;
        int i,j;
        WeightType w;
        sin>>c1;
        if(k1==0&&k2==0)
            do{
                sin>>c1>>i>>c2>>j>>c3;
                GA[i][j]=GA[j][i]=1;
                sin>>c1;
                if(c1==')')break;
            }while(1);
        else if(k1==0&&k2!=0)
            do{
                sin>>c1>>i>>c2>>j>>c3>>w;
                GA[i][j]=GA[j][i]=w;
                sin>>c1;
                if(c1==')')break;
            }while(1);
            else if(k1!=0 && k2==0)
                do{
                    sin>>c1>>i>>c2>>j>>c3;
                    GA[i][j]=1;
                    sin>>c1;
                    if(c1==')')break;
                }while(1);
                else if(k1!=0 && k2!=0)
                    do{
                        sin>>c1>>i>>c2>>j>>c3>>w;
                        GA[i][j]=w;
                        sin>>c1;
                        if(c1==')')break;
                    }while(1);
    }
    void dfsMatrix(adjmatrix GA,int i,int n,bool*visited)
    {
        Stack M;
        InitStack(M);
        int j=i;
        visited[i]=true;
        cout<<j<<" ";
        Push(M,j);
        while(j!=n||M.top!=0)
        {
            if(j==n+1)
            {
                j=M.stack[M.top];
                M.top--;
            }
            if(GA[M.stack[M.top]][j]!=0&&!visited[j])
            {
                visited[j]=true;
                Push(M,j);
                cout<<j<<" ";
                j=0;
            }
            else
                j++;
        }
    }
    
    /*void dfsAdjoin(adjlist GL,int i,int n,bool*visited)
    {
        cout<<i<<" ";
        visited[i]=true;
        edgenode*p=GL[i];
        while(p!=NULL)
        {
            int j=p->adjvex;
            if(!visited[j])
                dfsAdjoin(GL,j,n,visited);
            p=p->next;
        }
    }*/
    void dfsAdjoin(adjlist GL,int i,int n,bool*visited)
    {
        Stack M;
        InitStack(M);
        cout<<i<<" ";
        Push(M,i);
        visited[i]=true;
        edgenode*p=GL[i];
        while(p!=NULL||M.top!=0)
        {
            if(p==NULL)
            {
                M.top--;
                p=GL[M.stack[M.top]];
            }
            int j=p->adjvex;
            
            
            if(!visited[j])
            {
                visited[j]=true;
                cout<<j<<" ";
                Push(M,j);
                p=GL[M.stack[M.top]];
            }
            else
            {
                p=p->next;
            }
        }
    }
                
    
    
    
    
    int main()
    {
        int i,n,k1,k2;
        cout<<"输入待处理图的顶点数:";
        cin>>n;
        cout<<"输入图的有向和有无权选择(0为无,非0为有):";
        cin>>k1>>k2;
        bool*visited=new bool[n];
        adjmatrix ga;
        InitMatrix(ga,k2);
        cout<<"输入图的边集;";
        char*a=new char[100];
        cin>>a;
        CreateMatrix(ga,n,a,k1,k2);
        cout<<"按图的邻接矩阵得到的深度优先遍历序列:"<<endl;
        for(i=0;i<n;i++) 
            visited[i]=false;
        dfsMatrix(ga,0,n,visited);
        cout<<endl;
        cout<<"按图的邻接表得到的深度优先遍历序列:"<<endl;
        adjlist ka;
        InitAdjoin(ka);
        CreateAdjoin(ka,n,a,k1,k2);
        for(i=0;i<n;i++) 
            visited[i]=false;
        dfsAdjoin(ka,0,n,visited);
        cout<<endl;
        for(i=0;i<n;i++) 
            visited[i]=false;
        edgeset ke;
        InitArray(ke);
        CreateArray(ke,n,a,0);
        //Arry(ke,0,n,visited);
        //cout<<endl;
        //for(i=0;i<n;i++) 
            visited[i]=false;
        //Arry2(ke,0,n,visited);
    
    
        return 0;
    }

    3、栈的顺序存储

    //typedef int ElemType;
    /*struct Stack
    {
        ElemType *stack;
        int top;
        int MaxSize;
    };*/
    
    //1. 初始化栈S为空
    void InitStack(Stack& S)
    {
        //初始设置栈空间大小为10
        S.MaxSize=100;
        //动态存储空间分配
        S.stack=new ElemType[S.MaxSize];
        if(!S.stack){
            cout<<"动态存储分配失败!"<<endl;
            exit(1);
        }
        //初始置栈为空
        S.top=-1;
    }
    //2. 元素item进栈,即插入到栈顶
    void Push(Stack& S, ElemType item)
    {
        //若栈空间用完则自动扩大2倍空间,原有栈内容不变
        if(S.top==S.MaxSize-1) {
            int k=sizeof(ElemType);  //计算每个元素存储空间的长度
            S.stack=(ElemType*)realloc(S.stack, 2*S.MaxSize*k);
            S.MaxSize=2*S.MaxSize;   //把栈空间大小修改为新的长度
        }
        //栈顶指针后移一个位置
        S.top++;
        //将新元素插入到栈顶
        S.stack[S.top]=item;
    }
    //3. 删除栈顶元素并返回
    ElemType Pop(Stack& S)
    {
        //若栈空则退出运行
        if(S.top==-1) {
            cout<<"栈空,退出运行!"<<endl; 
            exit(1);
        }
        //栈顶指针减1表示退栈
        S.top--;
        //返回原栈顶元素的值
        return S.stack[S.top+1];
    }
    //4. 读取栈顶元素的值
    ElemType Peek(Stack& S)
    {
        //若栈空则退出运行
        if(S.top==-1) {
            cout<<"Stack is empty!"<<endl; 
            exit(1);
        }
        //返回栈顶元素的值
        return S.stack[S.top];
    }
    //5. 判断栈是否为空
    bool EmptyStack(Stack& S)
    {
        return S.top==-1;
    }
    //6. 清除栈中的所有元素并释放动态存储空间
    void ClearStack(Stack& S)
    {
        if(S.stack) {
            delete []S.stack;
            S.stack=0;
        }
        S.top=-1;
        S.MaxSize=0;
    }

    4、边集数组深度优先搜索

    void Arry(edgeset GE,int i,int n,bool*visited)
    {
        int j=i,k=0;
        while(k!=n)
        {
            for(int t=0;GE[t].fromvex!=-1;t++)
            {
                if(GE[t].fromvex==j&&!visited[j])
                {
                    cout<<j<<" ";
                    visited[j]=true;
                    j=GE[t].endvex;
                    k++;
                    break;
                }
            }
            if(GE[t].fromvex==-1)
            {
                cout<<j<<" ";
                k++;
            }
        }
    }

    5、非递归邻接表

    void dfsAdjoin(adjlist GL,int i,int n,bool*visited)
    {
        Stack M;
        InitStack(M);
        cout<<i<<" ";
        Push(M,i);
        visited[i]=true;
        edgenode*p=GL[i];
        while(p!=NULL||M.top!=0)
        {
            if(p==NULL)
            {
                M.top--;
                p=GL[M.stack[M.top]];
            }
            int j=p->adjvex;
            
            
            if(!visited[j])
            {
                visited[j]=true;
                cout<<j<<" ";
                Push(M,j);
                p=GL[M.stack[M.top]];
            }
            else
            {
                p=p->next;
            }
        }
    }

    6、非递归链接矩阵

    void dfsMatrix(adjmatrix GA,int i,int n,bool*visited)
    {
        Stack M;
        InitStack(M);
        int j=i;
        visited[i]=true;
        cout<<j<<" ";
        Push(M,j);
        while(j!=n||M.top!=0)
        {
            if(j==n+1)
            {
                j=M.stack[M.top];
                M.top--;
            }
            if(GA[M.stack[M.top]][j]!=0&&!visited[j])
            {
                visited[j]=true;
                Push(M,j);
                cout<<j<<" ";
                j=0;
            }
            else
                j++;
        }
    }

    7、哈夫曼编码

    #include<iostream>
    using namespace std;
    #include<stdlib.h>
    #include<fstream>
    #include<string>
    typedef int ElemType;
    struct save
    {
        char a2[10];
        int lenth;
    };
    save minma[26];
    struct BTreeNode
    {
        ElemType data;
        BTreeNode*left;
        BTreeNode*right;
    };
    int count=0;
    BTreeNode*CreateHuffman(ElemType a[],int n)
    {
        BTreeNode**b,*q;
        b=new BTreeNode*[n];
        int i,j;
        for(i=0;i<n;i++)
        {
            b[i]=new BTreeNode;
            b[i]->data=a[i];b[i]->left=b[i]->right=NULL;
        }
        for(i=1;i<n;i++)
        {
            int k1=-1,k2;
            for(j=0;j<n;j++)
            {
                if(b[j]!=NULL&&k1==-1) {k1=j;continue;}
                if(b[j]!=NULL) {k2=j;break;}
            }
            for(j=k2;j<n;j++)
            {
                if(b[j]!=NULL)
                {
                    if(b[j]->data<b[k1]->data) {k2=k1;k1=j;}
                    else if(b[j]->data<b[k2]->data) k2=j;
                }
            }
            q=new BTreeNode;
            q->data=b[k1]->data+b[k2]->data;
            q->left=b[k1];q->right=b[k2];
            b[k1]=q;b[k2]=NULL;
        }
        delete []b;
        return q;
    }
    void HuffManCoding(BTreeNode*FBT,int len)
    {
        static char a[10];
        if(FBT!=NULL)
        {
            if(FBT->left==NULL&&FBT->right==NULL)
            {
                for(int i=0;i<len;i++)
                {
                    minma[count].a2[i]=a[i];
                }
                minma[count].lenth=len;
                count++;
            }
            else{
                a[len]=0;HuffManCoding(FBT->left,len+1);
                a[len]=1;HuffManCoding(FBT->right,len+1);
            }
        }
    }
    int main()
    {
        BTreeNode *m;
        char a1[26];
        for(int i=0;i<26;i++)
        {
            a1[i]=65+i;
        }
        int a3[26];
        ifstream f1("新建文本文档.txt",ios::out);
        int j;
        i=0;
        while(!f1.eof())
            if(f1>>j) a3[i++]=j;
        m=CreateHuffman(a3,26);
        HuffManCoding(m,0);
        int total=0;
        cout<<"请输入一串字符"<<endl;
        char s1[100];
        cin>>s1;
        cout<<"它们所对应的密文分别是"<<endl;
        char *q=s1;
        while(q[total]!='')
            total++;
        for(i=0;i<total;i++)
        {
            for(j=0;j<26;j++)
            {
                if(s1[i]==a1[j]) 
                {
                    for(int k=0;k<minma[j].lenth;k++)
                        cout<<(int)minma[j].a2[k]<<" ";
                    cout<<endl;
                }
            }
    
        }
        
        return 0;
    }
    "新建文本文档.txt"
    23 45 12 87 103 54 99 46 97 82 98 65 38 84 56 55 78 77 47 73 91 86 4 5 40 3

    8、邻接矩阵与邻接表
    #include<iostream.h>
    #include<stdlib.h>
    #include<strstrea.h>
    typedef int VertexType;
    typedef int WeightType;
    const int MaxEdgeNum=10;
    const int MaxVertexNum=10;
    const WeightType MaxValue=1000;
    typedef VertexType vexlist[MaxVertexNum];
    typedef int adjmatrix[MaxVertexNum][MaxVertexNum];
    #include"4_01栈的顺序存储.cpp"
    void Prim(adjmatrix GA,edgest CT,int n)
    {
        int i,j,k,min,t,m,w;
        for(i=0;i<n-1;i++)
        {
            CT[i].fromvex=0;
            CT[i].endvex=i+1;
            CT[i].weight=GA[0][i+1];
        }
        for(k=1;k<n;k++)
        {
            min=MaxValue;
            m=k-1;
            for(j=k-1;j<n-1;j++)
                if(CT[j].weight<min)
                {
                    min=CT[j].weight;
                    m=j;
                }
                edge temp=CT[k-1];
                CT[k-1]=CT[m];
                CT[m]=temp;
                j=CT[k-1].endvex;
                for(i=k;i<n-1;i++)
                {
                    t=CT[i].endvex;
                    w=GA[j][t];
                    if(w<CT[i].weight)
                    {
                        CT[i].weight=w;
                        CT[i].fromvex=j;
                    }
                }
        }
    }
    void Kruskal(edgeset GE,edgeset CT,int n)
    {
        int i,j;
        bool**s=new bool*[n];
        for(i=0;i<n;i++)
            s[i]=new bool[n];
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
                if(i==j) s[i][j]=true;
                else s[i][j]=false;
        }
        int k=1;
        int d=0;
        int m1,m2;
        while(k<n)
        {
            for(i=0;i<n;i++)
            {
                if(s[i][GE[d].fromvex]==true) m1=i;
                if(s[i][GE[d].endvex]==true) m3=i;
            }
            if(m1!=m2)
            {
                CT[k-1]=GE[d];
                k++;
                for(j=0;j<n;j++)
                {
                    s[m1][j]=s[m1][j]||s[m2][j];
                    s[m2][j]=false;
                }
            }
            d++;
        }
        for(i=0;i<n;i++)
            delete[]s[i];
        delete[]s;
    }
    //边集数组
    struct edge
    {
        int fromvex;
        int endvex;
        WeightType  weight;
    };
    typedef edge edgeset[MaxEdgeNum];
    void InitArray(edgeset GE)
    {
        for(int i=0;i<MaxEdgeNum;i++)
        {
            GE[i].fromvex=GE[i].endvex=-1;
            GE[i].weight=MaxValue;
        }
    }
    void CreateArray(edgeset GE,int n,char*s,int k)
    {
        istrstream sin(s);
        char c1,c2,c3;
        int i,j,c=0;
        WeightType w;
        sin>>c1;
        if(k==0){
            do{
                sin>>c1>>i>>c2>>j>>c3;
                GE[c].fromvex=i;
                GE[c].endvex=j;
                GE[c].weight=1;
                c++;
                sin>>c1;
            }while(c1==',');
        }
        else{
            do{
                sin>>c1>>i>>c2>>j>>c3>>w;
                GE[c].fromvex=i;
                GE[c].endvex=j;
                GE[c].weight=w;
                c++;
                sin>>c1;
            }while(c1==',');
        }
    }
    void Arry(edgeset GE,int i,int n,bool*visited)
    {
        int j=i,k=0;
        while(k!=n)
        {
            for(int t=0;GE[t].fromvex!=-1;t++)
            {
                if(GE[t].fromvex==j&&!visited[j])
                {
                    cout<<j<<" ";
                    visited[j]=true;
                    j=GE[t].endvex;
                    k++;
                    break;
                }
            }
            if(GE[t].fromvex==-1)
            {
                cout<<j<<" ";
                k++;
            }
        }
    }
    void Arry2(edgeset GE,int i,int n,bool*visited)
    {
        int j=i,k=1;
        int q[10];
        int front=0,rear=0;
        cout<<j<<" ";
        while(k!=n)
        {
            for(int t=0;GE[t].fromvex!=-1;t++)
            {
                if(GE[t].fromvex=j&&!visited[j])
                {
                    cout<<GE[t].endvex<<" ";
                    k++;
                    q[rear]=GE[t].endvex;
                    rear=(rear+1)%10;
                }
                else 
                {
                    visited[j]=true;
                    j=q[front];
                    front=(front+1)%10;
                    break;
                }
            }
        }
    }
    
    struct edgenode
    {
        int adjvex;
        WeightType weight;
        edgenode*next;
    };
    typedef edgenode*adjlist[MaxVertexNum];
    void InitAdjoin(adjlist GL)
    {
        for(int i=0;i<MaxVertexNum;i++)
            GL[i]=NULL;
    }
    void CreateAdjoin(adjlist GL,int n,char*s,int k1,int k2)
    {
        istrstream sin(s);
        char c1,c2,c3;
        int i,j;
        WeightType w;
        edgenode*p;
        sin>>c1;
        if(k2==0){
            do{
                sin>>c1>>i>>c2>>j>>c3;
                p=new edgenode;
            
                p->adjvex=j;p->weight=1;
                p->next=GL[i];
                GL[i]=p;
                if(k1==0){
                    p=new edgenode;
                    p->adjvex=i;p->weight=1;
                    p->next=GL[j];
                    GL[j]=p;
                }
                sin>>c1;
            }while(c1==',');
        }
        else{
            do{
                sin>>c1>>i>>c2>>j>>c3>>w;
                p=new edgenode;
                p->adjvex=j;p->weight=w;
                p->next=GL[i];
                GL[i]=p;
                if(k1==0)
                {
                    p=new edgenode;
                    p->adjvex=i;p->weight=w;
                    p->next=GL[j];
                    GL[j]=p;
                }
                sin>>c1;
            }while(c1==',');
        }
    }
    
    void InitMatrix(adjmatrix GA,int k)
    {
        int i,j;
        for(i=0;i<MaxVertexNum;i++)
            for(j=0;j<MaxVertexNum;j++)
                if(i==j) GA[i][j]=0;
                else if(k) GA[i][j]=MaxValue;
                else GA[i][j]=0;
    }
    void CreateMatrix(adjmatrix GA,int n,char*s,int k1,int k2)
    {
        istrstream sin(s);
        char c1,c2,c3;
        int i,j;
        WeightType w;
        sin>>c1;
        if(k1==0&&k2==0)
            do{
                sin>>c1>>i>>c2>>j>>c3;
                GA[i][j]=GA[j][i]=1;
                sin>>c1;
                if(c1==')')break;
            }while(1);
        else if(k1==0&&k2!=0)
            do{
                sin>>c1>>i>>c2>>j>>c3>>w;
                GA[i][j]=GA[j][i]=w;
                sin>>c1;
                if(c1==')')break;
            }while(1);
            else if(k1!=0 && k2==0)
                do{
                    sin>>c1>>i>>c2>>j>>c3;
                    GA[i][j]=1;
                    sin>>c1;
                    if(c1==')')break;
                }while(1);
                else if(k1!=0 && k2!=0)
                    do{
                        sin>>c1>>i>>c2>>j>>c3>>w;
                        GA[i][j]=w;
                        sin>>c1;
                        if(c1==')')break;
                    }while(1);
    }
    void dfsMatrix(adjmatrix GA,int i,int n,bool*visited)
    {
        Stack M;
        InitStack(M);
        int j=i;
        visited[i]=true;
        cout<<j<<" ";
        Push(M,j);
        while(j!=n||M.top!=0)
        {
            if(j==n+1)
            {
                j=M.stack[M.top];
                M.top--;
            }
            if(GA[M.stack[M.top]][j]!=0&&!visited[j])
            {
                visited[j]=true;
                Push(M,j);
                cout<<j<<" ";
                j=0;
            }
            else
                j++;
        }
    }
    
    /*void dfsAdjoin(adjlist GL,int i,int n,bool*visited)
    {
        cout<<i<<" ";
        visited[i]=true;
        edgenode*p=GL[i];
        while(p!=NULL)
        {
            int j=p->adjvex;
            if(!visited[j])
                dfsAdjoin(GL,j,n,visited);
            p=p->next;
        }
    }*/
    void dfsAdjoin(adjlist GL,int i,int n,bool*visited)
    {
        Stack M;
        InitStack(M);
        cout<<i<<" ";
        Push(M,i);
        visited[i]=true;
        edgenode*p=GL[i];
        while(p!=NULL||M.top!=0)
        {
            if(p==NULL)
            {
                M.top--;
                p=GL[M.stack[M.top]];
            }
            int j=p->adjvex;
            
            
            if(!visited[j])
            {
                visited[j]=true;
                cout<<j<<" ";
                Push(M,j);
                p=GL[M.stack[M.top]];
            }
            else
            {
                p=p->next;
            }
        }
    }
                
    
    
    
    
    int main()
    {
        int i,n,k1,k2;
        cout<<"输入待处理图的顶点数:";
        cin>>n;
        cout<<"输入图的有向和有无权选择(0为无,非0为有):";
        cin>>k1>>k2;
        bool*visited=new bool[n];
        adjmatrix ga;
        InitMatrix(ga,k2);
        cout<<"输入图的边集;";
        char*a=new char[100];
        cin>>a;
        CreateMatrix(ga,n,a,k1,k2);
        cout<<"按图的邻接矩阵得到的深度优先遍历序列:"<<endl;
        for(i=0;i<n;i++) 
            visited[i]=false;
        dfsMatrix(ga,0,n,visited);
        cout<<endl;
        cout<<"按图的邻接表得到的深度优先遍历序列:"<<endl;
        adjlist ka;
        InitAdjoin(ka);
        CreateAdjoin(ka,n,a,k1,k2);
        for(i=0;i<n;i++) 
            visited[i]=false;
        dfsAdjoin(ka,0,n,visited);
        cout<<endl;
        for(i=0;i<n;i++) 
            visited[i]=false;
        edgeset ke;
        InitArray(ke);
        CreateArray(ke,n,a,0);
        Arry(ke,0,n,visited);
        cout<<endl;
        for(i=0;i<n;i++) 
            visited[i]=false;
        Arry2(ke,0,n,visited);
    
    
        return 0;
    }

    9、迷宫程序

    #include<iostream>
    #include <windows.h>
    #include<ctime>
    #include<cstdlib>
    #include<string>
    using namespace std;
    const int m=8,n=8;
    char maze[m+2][n+2];
    char mark[m+2][n+2];
    int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
    struct position
    {
        int a;
        int b;
    };
    typedef position ElemType;
    struct Stack
    {
        ElemType *stack;
        int top;
        int MaxSize;
    };
    #include"4_01栈的顺序存储.cpp"
    void output(ElemType &t)
    {
        cout<<"("<<t.a<<" "<<t.b<<")"<<endl;
    }
    bool SeekPath(int x,int y)
    {
        Stack M;
        InitStack(M);
        int i,j,k=0,t;
        ElemType item1,item2;
        int g=x,h=y;
        item1.a=g;
        item1.b=h;
        Push(M,item1);
        mark[g][h]=1;
        while((g!=m)||(h!=n))
        {
            item1.a=g;
            item1.b=h;
            k=0;
            for(i=0;i<4;i++)
            {
                g=g+move[i][0];h=h+move[i][1];
                if((maze[g][h]==0)&&(mark[g][h]==0))
                {
                    maze[g][h]=2;
                    for(i=0;i<m+2;i++)
                    {
                        for(j=0;j<n+2;j++)
                        {
                            cout<<maze[i][j]<<" ";
                        }
                        cout<<endl;
                    }
                    Sleep(1000);
                    system("cls");
                    Sleep(50);
                    mark[g][h]=1;
                    item2.a=g;
                    item2.b=h;
                    Push(M,item2);break;
                }
                else
                {
                    k++;
                    g=item1.a;
                    h=item1.b;
                }
            }
            
            if((g==1)&&(h==1)&&(k==4))
            {
                cout<<"失败"<<endl;
                t=0;
                break;
            }
            if(k==4)
            {
                g=M.stack[M.top-1].a;
                h=M.stack[M.top-1].b;
                M.top--;
            }
        }
        if(t!=0)
        {    
            while(M.top!=-1)
            {
                output(M.stack[M.top]);
                M.top--;
            }
            return true;
        }
        else
            return false;
    }        
    int main()
    {
        int i,j;
        for(i=0;i<m+2;i++)
            maze[0][i]=1;
        for(j=0;j<n+2;j++)
            maze[j][i-1]=1;
        for(i=0;i<m+2;i++)
            maze[j-1][i]=1;
        for(j=1;j<m+1;j++)
            maze[j][0]=1;
        srand(unsigned(time(0)));
        for(i=1;i<m+1;i++)
        {
            for(j=1;j<n+1;j++)
            {
                double some=(rand()%10)/10.0;
                if(some>0.25)
                    maze[i][j]=0;
                else
                    maze[i][j]=1;
            }
        }
        maze[m][n]=0;
        for(i=0;i<m+2;i++)
        {
            for(j=0;j<n+2;j++)
                mark[i][j]=0;
        }
        mark[1][1]=1;
        for(i=0;i<m+2;i++)
        {
            for(j=0;j<n+2;j++)
            {
                cout<<maze[i][j]<<" ";
            }
            cout<<endl;
        }
        SeekPath(1,1);
        return 0;
    }

    10、图实现教学楼的寻找

    #include<iostream>
    #include<strstrea.h>
    #include<fstream>
    #include<string>
    using namespace std;
    typedef int VertexType;
    typedef int WeightType; 
    const int MaxVertexNum=8;
    const int MaxEdgeNum=24;
    const WeightType MaxValue=100;
    typedef VertexType vexlist[MaxVertexNum];
    typedef int adjmatrix[MaxVertexNum][MaxVertexNum];
    
    void InitMatrix(adjmatrix GA,int k)
    {
        int i,j;
        for(i=0;i<MaxVertexNum;i++)
            for(j=0;j<MaxVertexNum;j++)
                if(i==j) GA[i][j]=0;
                else if(k) GA[i][j]=MaxValue;
                else GA[i][j]=0;
    }
    void CreateMatrix(adjmatrix GA,int n,char*s,int k1,int k2)
    {
        istrstream sin(s);
        char c1,c2,c3;
        int i,j;
        WeightType w;
        sin>>c1;
        if(k1==0&&k2==0)
            do{
                sin>>c1>>i>>c2>>j>>c3;
                GA[i][j]=GA[j][i]=1;
                sin>>c1;
                if(c1==')') break;
            }while(1);
        else if(k1==0&&k2!=0)
            do{
                sin>>c1>>i>>c2>>j>>c3>>w;
                    GA[i][j]=GA[j][i]=w;
                    sin>>c1;
                    if(c1==')') break;
            }while(1);
        else if(k1!=0&&k2==0)
            do{
                sin>>c1>>i>>c2>>j>>c3;
                GA[i][j]=1;
                sin>>c1;
                if(c1==')') break;
            }while(1);
        else if(k1!=0 &&k2!=0)
            do{
                sin>>c1>>i>>c2>>j>>c3>>w;
                GA[i][j]=w;
                sin>>c1;
                if(c1==')') break;
            }while(1);
    }
    void dfsMatrix(adjmatrix GA,int i,int n,bool*visited,string a[])
    {
        std::cout<<a[i]<<" ";
        visited[i]=true;
        for(int j=0;j<n;j++)
            if(GA[i][j]!=0 && GA[i][j]!=MaxValue && !visited[j])
                dfsMatrix(GA,j,n,visited,a);
    }
    void Prim(adjmatrix GA,edgeset CT,int n)
    {
        int i,j,k,min,t,m,w;
        for(i=0;i<n-1;i++)
        {
            CT[i].fromvex=0;
            CT[i].endvex=i+1;
            CT[i].weight=GA[0][i+1];
        }
        for(k=1;k<n;k++}
        {
            min=MaxValue;
            m=k-1;
            for(j=k-1;j<m-1;j++)
            {
                if(CT[j].weight<min)
                {
                    min=CT[j].weight;
                    m=j;
                }
            edge temp=CT[k-1];
            CT[k-1]=CT[m];
            CT[m]=temp;
            j=CT[k-1].endvex;
            for(i=k;i<n-1;i++)
            {
                t=CT[i].endvex;
                w=GA[j][t];
                if(w<CT[i].weight)
                {
                    CT[i].weight=w;
                    CT[i].fromvex=j;
                }
            }
        }
    }
    
    
    
    
    int main()
    {
        
        string a[8];
        int i=0;
        adjmatrix A;
        ifstream f1("新建文本文档 (2).txt",ios::out);
        if(!f1)
        {
            std::cout<<"新建文本文档 (2).txt do not found";
            exit(1);
        }
        string s;
        while(!f1.eof())
            if(f1>>s) a[i++]=s;
        InitMatrix(A,1);
        char *s1;
        s1=new char [100];
        ifstream f2("新建文本文档 (3).txt",ios::out);
        if(!f2)
        {
            std::cout<<"新建文本文档 (3).txt do not found";
            exit(1);
        }
        char m;
        i=0;
        while(!f2.eof())
            if(f2>>m) s1[i++]=m;
        /*for(i=0;i<62;i++)
            std::cout<<s1[i];*/
        CreateMatrix(A,8,s1,0,1);
        bool *visited=new bool [8];
        for(i=0;i<8;i++)
            visited[i]=false;
        dfsMatrix(A,0,8,visited,a);
        
    
    
        return 0;
    }

    新建文本文档(2)

    主楼 博雅楼 知行楼 三舍 图书馆 致远楼 新华楼 中和楼 

    新建文本文档(3)

    ( ( 0 , 6 ) 2 ,( 0 , 2 ) 4 ,( 0 , 5 ) 1 ,( 0 , 3 ) 1 ,( 1 , 5 ) 2 ,( 1 , 7 ) 1 ,( 2 , 4 ) 3 ,( 3 , 6 ) 2 ,( 6 , 7 ) 3 )

    11、拓补排序

    void Toposort(adjlilst GL,int n)
    {
        int i,j,k,top,m=0;
        edgenode*p;
        int *d=new int[n];
        for(i=0;i<n;i++)
            d[i]=0;
        for(i=0;i<n;i++)
        {
            p=GL[i];
            while(p!=NULL)
            {
                j=p->adjvex;d[j]++;p=p->next;
            }
        }
        top=-1;
        for(i=0;i<n;i++)
            if(d[i]==0) {d[i]=top;top=i;}
        while(top!=-1)
        {
            j=top;
            top=d[top];
            cout<<j<<" ";
            m++;
            p=GL[j];
            while(p!=NULL)
            {
                k=p->adjvex;
                d[k]--;
                if(d[k]==0)
                {
                    d[k]=top;top=k;
                }
                p=p->next;
            }
        }
        cout<<endl;
        if(m<n) cout<<"The network has a cycle!"<<endl;
        delete []d;
    }

    12、稀疏矩阵的转置乘法与加法

    #include<iostream>
    using namespace std;
    typedef int ElemType;
    struct Triple
    {
        int row,col;
        ElemType val;
    };
    struct SMatrix
    {
        int m,n,t;
        Triple sm[100];
    };
    void InitMatrix(SMatrix & M)
    {
        M.m=0;
        M.n=0;
        M.t=0;
    }
    void InputMatrix(SMatrix &M,int m,int n)
    {
        M.m=m;
        M.n=n;
        int row,col,val;
        int k=0;
        cin>>row>>col>>val;
        while(row!=0)
        {
            k++;
            M.sm[k].row=row;
            M.sm[k].col=col;
            M.sm[k].val=val;
            cin>>row>>col>>val;
        }
        M.t=k;
    }
    SMatrix FastTranspose(SMatrix &M)
    {
        SMatrix S;
        InitMatrix(S);
        S.m=M.n;  S.n=M.m;  S.t=M.t;
        if(S.t==0) return S;
        int* num=new int[M.n+1];
        int* pot=new int[M.n+1];
        int col,i;
        for(col=1;col<=M.n;col++)
            num[col]=0;
        for(i=1;i<=M.t;i++)
        {
            int j=M.sm[i].col;
            num[j]++;
        }
        pot[1]=1;
        for(col=2;col<=M.n;col++)
            pot[col]=pot[col-1]+num[col-1];
        for(i=1;i<=M.t;i++)
        {
            int j=M.sm[i].col;
            int k=pot[j];
            S.sm[k].row=j;
            S.sm[k].col=M.sm[i].row;
            S.sm[k].val=M.sm[i].val;
            pot[j]++;
        }
        delete[] num;
        delete[] pot;
        return S;
    }
    void output(SMatrix &M)
    {
        int k=1;
        for(int i=1;i<=M.m;i++)
        {
            for(int j=1;j<=M.n;j++)
            {
                if((M.sm[k].row==i)&&(M.sm[k].col==j))
                {
                    cout<<M.sm[k].val<<"    ";
                        k++;
                }
                else
                    cout<<"0"<<"    ";
            }
            cout<<endl;
        }
    }
    SMatrix Add(SMatrix& M1,SMatrix& M2)
    {
        SMatrix M;
        InitMatrix(M);
        if((M1.m!=M2.m)||(M1.n!=M2.n))
        {
            cout<<"两矩阵规格不一样"<<endl;
            exit(1);
        }
        M.m=M1.m;M.n=M1.n;
        if((M1.t==0)&&(M2.t==0))
            return M;
        int k,t=1;
        for(k=1;k<=M1.t;k++)
        {
            if((M1.sm[k].row==M2.sm[k].row)&&(M1.sm[k].col=M2.sm[k].col))
            {
                M.sm[t].row=M1.sm[k].row;
                M.sm[t].col=M1.sm[k].col;
                M.sm[t].val=M1.sm[k].val+M2.sm[k].val;
                t++;
            }
            else 
            {
                if(M1.sm[k].val==0)
                {
                    M.sm[t].row=M1.sm[k].row;
                    M.sm[t].col=M1.sm[k].col;
                    M.sm[t].val=M2.sm[k].val;
                }
                else
                {
                    if(M2.sm[k].val==0)
                    {
                        M.sm[t].row=M2.sm[k].row;
                        M.sm[t].col=M2.sm[k].col;
                        M.sm[t].val=M1.sm[k].val;
                    }
                }
                t++;
            }
            M.t=t;
        }
        return M;
    }
    SMatrix chengfa(SMatrix &M1,SMatrix &M2)
    {
        SMatrix M3;
        InitMatrix(M3);
        M3.n=M1.m;
        M3.m=M2.n;
        if(M1.n!=M2.m)
            cout<<"两矩阵不能相乘"<<endl;
        else
        {
            int h=0;
            for(int i=1;i<=M1.m;i++)
            {
                for(int j=1;j<=M2.n;j++)
                {
                    int sum=0;
                    for(int t=1;t<=M1.t;t++)
                    {
                        for(int k=1;k<=M2.t;k++)
                        {
                            if((M1.sm[t].row==i)&&(M2.sm[k].col==j))
                                if(M2.sm[k].row==M1.sm[t].col)
                                    sum+=M1.sm[t].val*M2.sm[k].val;
                                else
                                    sum+=0;
                            else
                                sum+=0;
                        }
                    }
                    h++;
                    M3.sm[h].val=sum;
                    M3.sm[h].row=i;
                    M3.sm[h].col=j;
                }    
            }
            M3.t=h;        
        }
        return M3;
    }
    int main()
    {
        cout<<"请选择操作序号"<<endl;
        cout<<"1 转质 2 加法 3 乘法"<<endl;
        char a;
        cin>>a;
        switch(a)
        {
        case '1':
            {
                SMatrix p;
                InitMatrix(p);
                int m,n;
                cout<<"请输入稀疏矩阵的行数和列数"<<endl;
                cin>>m>>n;
                cout<<"请输入非零元素所在行数 列数 元素值 输入完后以 0 0 0结束"<<endl;
                InputMatrix(p,m,n);
                output(FastTranspose(p));
            };break;
        case '2':
            {
                SMatrix a,b;
                InitMatrix(a);
                cout<<"请输入稀疏矩阵1的行数和列数"<<endl;
                int m1,n1;
                cin>>m1>>n1;
                cout<<"请输入稀疏矩阵1非零元素所在的行 列 值  输入完后以 0 0 0结束"<<endl;
                InputMatrix(a,m1,n1);
                InitMatrix(b);
                cout<<"请输入稀疏矩阵2的行数和阶数"<<endl;
                int m2,n2;
                cin>>m2>>n2;
                cout<<"请输入稀疏矩阵2中非零元素的行 列 值  输入完后以 0 0 0结束 "<<endl;
                InputMatrix(b,m2,n2);
                output(Add(a,b));
            };break;
        case '3':
            {
                SMatrix a,b;
                InitMatrix(a);
                cout<<"请输入稀疏矩阵1的行数和列数"<<endl;
                int m1,n1;
                cin>>m1>>n1;
                cout<<"请输入稀疏矩阵1非零元素所在的行 列 值  输入完后以 0 0 0结束"<<endl;
                InputMatrix(a,m1,n1);
                InitMatrix(b);
                cout<<"请输入稀疏矩阵2的行数和阶数"<<endl;
                int m2,n2;
                cin>>m2>>n2;
                cout<<"请输入稀疏矩阵2中非零元素的行 列 值   输入完后以 0 0 0结束"<<endl;
                InputMatrix(b,m2,n2);
                output(chengfa(a,b));
            };break;
        }
        return 0;
    }

    最后说一句,以上都是扯淡,都是扯淡,能挣着钱才是王道呀!!!!!!

    孩子我还是太幼稚

  • 相关阅读:
    2019牛客暑期多校训练营(第七场)
    2019 Multi-University Training Contest 6
    2019 Multi-University Training Contest 5
    SDU暑期集训排位(4)
    2019牛客暑期多校训练营(第六场)
    poj3252 Round Numbers(数位dp)
    hdu3555 Bomb(数位dp)
    BM求线性递推模板(杜教版)
    hdu3746 Cyclic Nacklace(kmp)
    kmp next数组的模板
  • 原文地址:https://www.cnblogs.com/weizhen/p/5823885.html
Copyright © 2020-2023  润新知