zoukankan      html  css  js  c++  java
  • 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    
    
     1 //归并排序递归方法实现
     2 #include <iostream>
     3 #include <cstdio>
     4 using namespace std;
     5 #define maxn 1000005
     6 int a[maxn], temp[maxn];
     7 long long ans;
     8 void MergeSort(int a[], int l, int mid, int r)
     9 {
    10     int k=0;
    11     int i = l, n = mid, j = mid, m = r;
    12     while ( i<n && j<m )
    13     {
    14         if (a[i] <= a[j])
    15         {
    16             temp[k++] = a[i++];
    17         }
    18         else
    19         {
    20             ans += n-i;
    21             temp[k++] = a[j++];
    22         }
    23     }
    24     while (i<n)
    25         temp[k++] = a[i++];
    26     while (j<m)
    27         temp[k++] = a[j++];
    28     for (int t = 0; t<k; ++t)
    29         a[l+t] = temp[t];
    30 }
    31 void Sort(int a[], int l, int r)
    32 {
    33     if (r-l<=1)
    34         return ;
    35     int mid = (l+r)>>1;
    36     Sort(a, l, mid);
    37     Sort(a, mid, r);
    38     MergeSort(a, l, mid, r);
    39 }
    
    
    


    //快速排序
    1
    #include<iostream> 2 #include<cstdio> 3 #define MAXSIZE 100 4 using namespace std; 5 int partition(int a[],int low,int high) 6 { 7 int i,j; 8 int x; 9 x=a[low]; 10 i=low; 11 j=high; 12 while(i<j) 13 { 14 while(i<j&&a[j]>=x) j--; 15 if(i<j) a[i++]=a[j]; 16 while(i<j&&a[i]<=x) i++; 17 if(i<j) a[j--]=a[i]; 18 } 19 a[i]=x; 20 return i; 21 } 22 void quicksort(int r[],int low ,int high) 23 { 24 25 int mid; 26 if(low<high) 27 { 28 29 mid = partition(r,low,high); 30 quicksort(r,low,mid-1); 31 quicksort(r,mid+1,high); 32 } 33 } 34 int main() 35 { 36 37 int R[MAXSIZE]={63,12,52,77,65,45,32,58,26}; 38 int len =9; 39 quicksort(R,0,len-1); 40 for(int i=0;i<len-1;i++) 41 { 42 43 cout<<R[i]<<" "; 44 } 45 }
    //最小生成树prim算法
     1 #include<iostream>
     2 #include<cstdio>
     3 #define MAXSIZE 101
     4 #define MAX 9999
     5 using namespace std;
     6 struct Graph{
     7     int data[MAXSIZE][MAXSIZE];
     8     int vexnum,arcnum;
     9 };
    10 int  prim3(Graph G)
    11 {
    12     int min,i,j,pos;
    13     int visited[MAXSIZE];
    14     int low[MAXSIZE];
    15     int result;
    16     pos=1;
    17     visited[1]=1;
    18     for(i=2;i<=G.vexnum;i++)
    19     {
    20         visited[i]=0;
    21         if(i!=pos)
    22         low[i]=G.data[pos][i];
    23     }
    24     for(i=2;i<=G.vexnum;i++)
    25     {
    26         int min=MAX;
    27         for(j=2;j<=G.vexnum;j++)
    28         {
    29             if(visited[j]==0&&min>low[j])
    30             {
    31                 min=low[j];
    32                 pos=j;
    33             }
    34         }
    35         result+=min;
    36         visited[pos]=1;
    37         for(j=2;j<=G.vexnum;j++)
    38         {
    39             if(visited[j]==0&&low[j]>G.data[pos][j])
    40             {
    41                 low[j]=G.data[pos][j];
    42             }
    43         }
    44     }
    45     return result;
    46 }
    
    
    


    1
    ///链队列 2 struct LQueue 3 { 4 int data; 5 LQueue *next; 6 7 }; 8 9 struct Queue 10 { 11 LQueue *front,*rear;///队头队尾不存元素 12 }; 13 int EnQueue(Queue *qu,int x) 14 { 15 LQueue *p; 16 p = (LQueue *)malloc(sizeof(LQueue)); 17 if(!p) return ERROR; 18 else 19 { 20 p->data=x; 21 qu->rear->next = p; 22 qu->rear=p; 23 return OK; 24 } 25 26 } 27 int OutQueue(Queue *qu) 28 { 29 LQueue *p; 30 if(qu->front==qu->rear) 31 { 32 return ERROR; 33 } 34 else 35 { 36 p=qu->front->next; 37 qu->front->next=p->next; 38 if(p->next==NULL) 39 { 40 qu->front=qu->rear; 41 } 42 free(p); 43 return OK; 44 } 45 }

    //图的建立和遍历
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #define MAXSIZE 1000
    #define MAX 100
    #include<queue>
    using namespace std;
    bool visit[MAXSIZE];
    
    struct AdjLink
    {
        int data;
        AdjLink *next;
    };
    struct Graph
    {
        int vexNum,arcNum;
        AdjLink *Head[MAXSIZE];
        int kind;
    
    };
    void DFS(Graph G,int i);
    int FirstAdjLink(Graph G,int i);
    int NextAdjLink(Graph G,int i,int w);
    void BFSTraverse(Graph G);
    void CreatGraph(Graph &G)
    {
        int Start,End;
        AdjLink *p;
        for(int i=1;i<=G.vexNum;i++) G.Head[i]=NULL;
        for(int i=1;i<=G.arcNum;i++)
        {
            cout<<"请输入起点和终点:"<<endl;
            cin>>Start>>End;
    
            p=(AdjLink*)malloc(sizeof(AdjLink));
            p->next=G.Head[Start];
            p->data=End;
            G.Head[Start]=p;
    
        }
    }
    void DFSTraverse(Graph G)
    {
        for(int i=1;i<=G.vexNum;i++)  visit[i]=false;
        for(int i=1;i<=G.vexNum;i++)
            if(!visit[i]) DFS(G,i);
            cout<<"\b\b  \n";
    }
    void DFS(Graph G,int i)
    {
        int w;
        visit[i]=true;
        cout<<i<<"->";
       for(w=FirstAdjLink(G,i);w;w=NextAdjLink(G,i,w))
           if(!visit[w])
               DFS(G,w);
    
    }
    int FirstAdjLink(Graph G,int i)
    {
        if(!G.Head[i]) return 0;
        else
        {
            return G.Head[i]->data;
        }
    }
    int NextAdjLink(Graph G,int i,int w)
    {
       AdjLink *p;
       p=G.Head[i];
       while(p->data!=w) p=p->next;
       if(p->next==NULL) return 0;
       else return p->next->data;
    }
    int main()
    {
        Graph G;
        cout<<"请输入结点数和边数:"<<endl;
        cin>>G.vexNum>>G.arcNum;
        CreatGraph(G);
        DFSTraverse(G);
        BFSTraverse(G);
    }
    void BFSTraverse(Graph G)
    {
        queue<int> q;
        for(int i=1;i<=G.vexNum;i++) visit[i]=false;
        for(int i=1;i<=G.vexNum;i++)
        {
            if(!visit[i])
            {
                visit[i]=true;
                cout<<i<<"->";
                q.push(i);
                while(!q.empty())
                {
                    int u=q.front();
                    q.pop();
                    for(int w=FirstAdjLink(G,u);w;w=NextAdjLink(G,u,w))
                    {
                        if(!visit[w])
                        {
                            visit[w]=true;
                            cout<<w<<"->";
                            q.push(w);
                        }
                    }
                }
            }
    
        }
        cout<<"\b\b  \n";
    }
    
    
    
    //线性表
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    ///都用c语言写的
    ///建议从主函数开始看
    int sequence_map[100005];                            ///顺序表的数组
    int total_sequence=0,total_list=0;                   ///定义两个全局变量用来计算顺序表与链表长度,初始值为0
    struct List                                          ///当对顺序表和链表操作时对于相应长度值进行改变
    {
        int num;
        List *next;
    };                                                   ///定义结构体表示链表中的各个元素
    List *head=NULL,*p=NULL,*list_temp=NULL,*pback=NULL,*insert_temp=NULL;
    void init_print()                                               ///一级菜单操作界面
    {
        printf("*                                *\n");
        printf("*     请输入对应序号进行操作     *\n");
        printf("*          1.顺序表操作          *\n");
        printf("*           2.链表操作           *\n");
        printf("*             3.退出             *\n");
        printf("**********************************\n");
        printf("请输入对应序号进行操作:");
    }
    void init_sequence()                                            ///二级菜单中顺序表的操作界面
    {
        printf("*                                *\n");
        printf("*     请输入对应序号进行操作     *\n");
        printf("*         1.顺序表的建立         *\n");
        printf("*         2.顺序表的插入         *\n");
        printf("*         3.顺序表的输出         *\n");
        printf("*         4.顺序表的删除         *\n");
        printf("*         5.顺序表的长度         *\n");
        printf("*         6.返回上一层           *\n");
        printf("**********************************\n");
        printf("请输入对应序号进行操作:");
    }
    void init_pointlist()                                              ///二级菜单中链表的操作界面
    {
        printf("*                                *\n");
        printf("*     请输入对应序号进行操作     *\n");
        printf("*         1.链表的建立           *\n");
        printf("*         2.链表的插入           *\n");
        printf("*         3.链表的输出           *\n");
        printf("*         4.链表的删除           *\n");
        printf("*         5.链表的长度           *\n");
        printf("*         6.返回上一层           *\n");
        printf("**********************************\n");
        printf("请输入对应序号进行操作:");
    }
    void establish_sequence()                                           ///建立顺序表
    {
        system("cls");
        memset(sequence_map,0,sizeof(sequence_map));                    ///初始化数组为0
        printf("请输入顺序表数据组数:");
        int group;
        scanf("%d",&group);                                             ///首先输入数据的组数
        total_sequence=group;
        printf("请分别输入%d组数据,用空格或回车隔开:\n",group);
        for(int i=0; i<group; i++)                                      ///在输入数据的同时进行排序
        {
            int sequence_temp;
            bool flag=false;                                            ///bool变量用来记录数据是否被插入当前数组
            scanf("%d",&sequence_temp);
            for(int j=0; j<i; j++)                                      ///在已经输入的数据中循环找是否有比当前元素大的元素
            {
                if(sequence_temp<sequence_map[j])                       ///如果存在比当前值更大的元素
                {                                                       ///使bool变量变成true,表示数据被插入数组
                    flag=true;
                    for(int k=i-1; k>=j; k--)                           ///把当前顺序表中比这个元素大的元素都后移一位
                        sequence_map[k+1]=sequence_map[k];
                    sequence_map[j]=sequence_temp;                      ///将这个元素插入顺序表
                    break;
                }
            }
            if(!flag)                                                   ///如果循环没有找到比当前元素大的元素
                sequence_map[i]=sequence_temp;                          ///说明当前元素为最大值,直接加到数组最后一位
        }
        printf("创建顺序表成功!");
        system("pause");
        system("cls");
        init_sequence();
    }
    void insert_sequence()                                              ///插入数据和建立顺序表原理相同
    {                                                                   ///可以优化成同一个程序
        system("cls");
        printf("请输入要插入的数据:");
        int insert_temp;
        bool flag=false;
        scanf("%d",&insert_temp);
        for(int i=0; i<total_sequence; i++)
        {
            if(insert_temp<sequence_map[i])
            {
                flag=true;
                for(int k=total_sequence-1; k>=i; k--)
                    sequence_map[k+1]=sequence_map[k];
                sequence_map[i]=insert_temp;
                break;
            }
        }
        if(!flag)
            sequence_map[total_sequence]=insert_temp;
        total_sequence++;
        printf("顺序表插入成功!");
        system("pause");
        system("cls");
        init_sequence();
    }
    void output_sequence()                                                  ///遍历数组,输出所有元素
    {
        system("cls");
        printf("顺序表当前为:\n");
        for(int i=0; i<total_sequence; i++)
        {
            printf("%d",sequence_map[i]);
            printf(i==total_sequence-1?"\n":" ");
        }
        system("pause");
        system("cls");
        init_sequence();
    }
    void delete_sequence()                                              ///删除数据和插入原理相似,需要注意如果存在相同元素需要全部删除
    {
        system("cls");
        printf("请输入要删除的数据:");
        int delete_temp;
        bool flag=false;                                                ///判断顺序表中是否有当前元素
        while(~scanf("%d",&delete_temp))
        {
            for(int i=0; i<total_sequence; i++)
            {
                if(delete_temp==sequence_map[i])
                {
                    total_sequence--;                                   ///如果遇到需要删除的元素,将线性表长度-1
                    flag=true;                                          ///表示已经删除该元素
                    for(int k=i; k<=total_sequence-1; k++)              ///从这一位开始将后面所有比它大的元素都前移一位
                        sequence_map[k]=sequence_map[k+1];
                    i--;                                                ///重点:如果不将i-1,会导致删除完本元素后i向后前进一位
                }                                                       ///数组元素整体向前前进一位,相当于i+=2,如果此时有相同
            }                                                           ///需要删除的元素,会跳过这个元素,导致删除不成功,有兴趣
            if(!flag)                                                   ///可以注释掉i--这一句测试一些数据
            {
                printf("当前顺序表中无此元素,请重新输入:");
                continue;                                               ///如果flag值没有发生变化说明顺序表中没有这个元素
            }
            else
            {
                printf("顺序表元素删除成功!");
                system("pause");
                system("cls");
                init_sequence();                                         ///否则删除成功,重新回到上级菜单
                break;
            }
        }
    }
    void length_sequence()
    {
        system("cls");
        printf("当前顺序表长度为:");
        printf("%d\n",total_sequence);                                   ///由于用了全局变量统计了顺序表的长度,就不用遍历了
        system("pause");
        system("cls");
        init_sequence();
    }
    void establish_pointlist()                                           ///链表的建立
    {
        system("cls");
        printf("请输入链表数据组数:");
        int list_group;
        scanf("%d",&list_group);
        printf("请分别输入%d组数据,用空格或回车隔开:\n",list_group);
        for(int i=0; i<list_group; i++)
        {
            total_list++;
            list_temp=new List;                                             ///动态申请新的内存空间
            scanf("%d",&list_temp->num);
            list_temp->next=NULL;
            if(i==0)                                                        ///第一个插入的元素连接到头指针后
                head=list_temp;
            else                                                            ///其余元素找到其应在的位置后插入
            {
                p=head;                                                     ///首先让p指针指向头指针
                while(p->next!=NULL&&list_temp->num > p->num)               ///当p不为空并且输入的值大于p指向的元素的值时
                {
                    pback=p;                                                ///使pback=p,p指向下一个元素
                    p=p->next;                                              ///pback永远都表示p当前元素的前一个元素
                }
                if(list_temp->num <= p->num)                                ///当输入的值小于等于p指向的值时
                {
                    if(p==head)                                             ///如果此时p为头指针,即当前值为链表中的最小值
                        head=list_temp;                                     ///所以temp值应该插入链表头部
                    else pback->next=list_temp;                             ///否则将需要插入的元素的地址存在pback->next中
                    list_temp->next=p;                                      ///将p指向的元素地址存在temp->next中
                }                                                           ///实现了向有序链表中插入元素
                else
                {
                    p->next=list_temp;                                      ///此时链表中没有比当前元素大的值,说明当前元素为最大值
                    list_temp->next=NULL;                                   ///将其插入链表最后即可
                }
            }
        }
        printf("链表创建成功!");
        system("pause");
        system("cls");
        init_pointlist();
    }
    void insert_pointlist()                                                 ///插入元素和创建链表过程一样
    {
        total_list++;
        system("cls");
        printf("请输入要插入的数据:");
        p=NULL,pback=NULL;
        insert_temp=new List;
        scanf("%d",&insert_temp->num);
        insert_temp->next=NULL;
        p=head;
        pback=head;
        while(p->next!=NULL&&insert_temp->num > p->num)
        {
            pback=p;
            p=p->next;
        }
        if(insert_temp->num <= p->num)
        {
            if(p==head)
                head=insert_temp;
            else pback->next=insert_temp;
            insert_temp->next=p;
        }
        else
        {
            p->next=insert_temp;
            insert_temp->next=NULL;
        }
        printf("链表插入成功!");
        system("pause");
        system("cls");
        init_pointlist();
    }
    void output_pointlist()
    {
        system("cls");
        printf("当前链表元素为:\n");
        p=head;
        while(p!=NULL)                                                  ///利用指针p输出链表中的各个元素
        {
            printf("%d ",p->num);
            p=p->next;
        }
        printf("\n");
        system("pause");
        return;
    }
    void delete_pointlist()                                             ///删除链表中的元素
    {
        system("cls");
        if(head==NULL)                                                  ///如果头指针为空,说明链表未创建
        {
            printf("尚未创建链表!");
            system("pause");
            return;
        }
        printf("请输入要删除的数据:");
        int delete_temp;
        while(~scanf("%d",&delete_temp))
        {
            p=head;
            pback=head;
            while(p->next!=NULL&&delete_temp!=p->num)                   ///指针p和pback移动,使p指向需要删除的位置
            {                                                           ///pback指向p的前一元素
                pback=p;
                p=p->next;
            }
            if(delete_temp == p->num)                                   ///如果此时p的值与需要删除的值相同
            {
                while(delete_temp==p->num)                              ///由于要删除全部相同元素,要用循环
                {
                    total_list--;                                       ///每删除一次使链表长度-1
                    if(p==head)                                         ///如果当前p为头指针,说明需要删除的是最小元素
                        head=p->next;                                   ///使头指针指向p的下一元素即可
                    else pback->next=p->next;                           ///否则说明删除元素在链表中,直接使下一元素和上一元素相连
                    List *p_temp=p;                                     ///保存下此时需要删除的地址
                    delete p_temp;                                      ///释放内存
                    p=p->next;                                          ///p继续移动,找下一个需要删除的元素
                }
                printf("链表元素删除成功!");
                system("pause");
                system("cls");
                init_pointlist();
                break;
            }
            else
            {
                printf("当前链表中无此元素,请重新输入:");             ///如果p->next指向NULL时仍没有元素可以删除
                continue;                                               ///说明此链表中无此元素
            }
        }
    }
    void length_pointlist()                                             ///链表的长度,原理和线性表长度相同
    {
        system("cls");
        printf("当前链表长度为:");
        printf("%d\n",total_list);
        system("pause");
        system("cls");
        init_sequence();
    }
    void sequence()
    {
        system("cls");
        init_sequence();
        int op_sequence;                                        ///二级菜单中线性表的操作选项
        while(~scanf("%d",&op_sequence))
        {
            if(op_sequence==1)
                establish_sequence();
            else if(op_sequence==2)
                insert_sequence();
            else if(op_sequence==3)
                output_sequence();
            else if(op_sequence==4)
                delete_sequence();
            else if(op_sequence==5)
                length_sequence();
            else if(op_sequence==6)
                return;
            else
            {
                printf("输入非法,请重新输入:");
                continue;
            }
        }
    }
    void pointlist()
    {
        system("cls");
        init_pointlist();
        int op_pointlist;                                           ///二级菜单中链表的操作选项
        while(~scanf("%d",&op_pointlist))
        {
            if(op_pointlist==1)
                establish_pointlist();
            else if(op_pointlist==2)
                insert_pointlist();
            else if(op_pointlist==3)
            {
                output_pointlist();
                system("cls");
                init_pointlist();
            }
            else if(op_pointlist==4)
            {
                delete_pointlist();
                system("cls");
                init_pointlist();
            }
            else if(op_pointlist==5)
                length_pointlist();
            else if(op_pointlist==6)
                return;
            else
            {
                printf("输入非法,请重新输入:");
                continue;
            }
        }
    }
    int main()
    {
        init_print();                               ///初始化的菜单界面
        int init_op;                                ///一级菜单的操作选项,1为顺序表,2为链表,3为退出
        while(~scanf("%d",&init_op))
        {
            if(init_op==1)
            {
                sequence();                         ///当输入值为1时调用sequence函数进行顺序表操作
                system("cls");
                init_print();
            }
            else if(init_op==2)
            {
                pointlist();                        ///当输入值为2时调用pointlist函数进行链表操作
                system("cls");
                init_print();
            }
            else if(init_op==3)                     ///当输入值为3时退出程序
                exit(0);
            else                                    ///其余情况输入非法操作,继续重新输入
            {
                printf("输入非法,请重新输入:");
                continue;
            }
        }
    }
    //栈 更改一下主函数就可用 lz这里是倒栈输出,便于观察进制的转换
    #include<iostream>
    #include<cstdio>
    #include<malloc.h>
    #define MAXSIZE 1000
    #define NEW 10
    using namespace std;
    struct Stack
    {
        int *base;
        int *top;
        int length;
    };
    void InitStack(Stack &s)
    {
        s.base = (int *)malloc(NEW *sizeof(int));
        if(!s.base)
        {
            cout<<"动态申请内存失败!!!"<<endl;
        }
        else
        {
            s.top = s.base;
            s.length = NEW;
        }
    }
    void Push(Stack &s,int e)
    {
        if(s.top-s.base>=s.length)
        {
            s.base=(int *)realloc(s.base,(s.length+NEW)*sizeof(int));
            if(!s.base) cout<<"动态申请内存失败!!!"<<endl;
            else
            {
                s.length+=NEW;
                s.top = s.base+s.length;
            }
        }
    
        *s.top++=e;
    }
    void DisplayStack(Stack s)
    {
        int *p;
        p = s.top-1;
        if(s.base ==s.top)
            cout<<"当前栈为空栈!!!"<<endl;
        else
        {
            cout<<"当前栈内元素为:";
            while(p!=s.base-1)
            {
                if(*(p)<10)
                {
                    cout<<*(p)<<" ";
                    p--;
                }
                else
                {
                    cout<<char(*(p)+87)<<" ";
                    p--;
                }
            }
            cout<<endl;
        }
    }
    int StackLength(Stack s)
    {
        int *p;
        p=s.base;
        int cont;
        while(p!=s.top)
        {
            p++;
            cont++;
        }
        return cont;
    }
    void pop(Stack &s)
    {
        if(s.top == s.base)
            cout<<"当前已为空栈,操作失败!!!"<<endl;
        else
        {
            *s.top--;
            cout<<"操作成功!!!"<<endl;
        }
    }
    void ClearStack(Stack &s)
    {
        s.top =s.base;
        cout<<"栈已清空!!!"<<endl;
    }
    void StackEmpty(Stack s)///判空
    {
        if(s.top==s.base)
            cout<<"栈为空!!!"<<endl;
        else cout<<"栈不为空!!!"<<endl;
    }
    void DestroyStack(Stack &s)
    {
        s.base =NULL;
        cout<<"栈已销毁!!!"<<endl;
    }
    void GetTop(Stack s,int &e)
    {
        if(s.top==s.base) cout<<"栈已为空,操作失败!!!"<<endl;
        else
        {
            cout<<"栈顶元素为:";
            e=*(s.top-1);
            cout<<e<<endl;
        }
    }
    int main()
    {
       int x,r;
       printf("请输入要转换的10进制数和要转的进制:\n");
       while(cin>>x>>r)
       {
           Stack s;
           InitStack(s);
            while(x>0)
            {
                Push(s,x%r);
                x=x/r;
            }
            DisplayStack(s);
       }
    }
    //
    #include<iostream>
    #include<cstdio>
    #include<string.h>
    #include<malloc.h>
    #include<cstdlib>
    using namespace std;
    #define MAXSIZE 100
    #define FAlSE 0
    #define OK 1
    #define ERROR 0
    #define OVERLOE -2
    typedef int Status;
    struct HString{
        char *ch;
        int length;
    };
    Status StrAssign(HString &H)
    {
        H.length = 0;
        H.ch = (char *)malloc((MAXSIZE)*sizeof(char));
        printf("请输入字符串的长度\n");
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            H.ch[i] = getchar();
            H.length++;
            if(getchar()=='\0')
                break;
        }
        return OK;
    }
    Status PrintHString(HString H)
    {
        if(H.length == 0)
            cout<<"空串\n";
        else
        {
            for(int i=0;i<H.length;i++)
            {
                cout<<H.ch[i]<<" ";
            }
            cout<<endl;
        }
        return OK;
    }
    Status HStringLength(HString H)
    {
        printf("输入的字符串的长度为:\n");
        cout<<H.length<<endl;
        return OK;
    }
    Status HStringCompare(HString H,HString T)
    {
        for(int i=0;i<H.length&&i<T.length;i++)
        {
            if(T.ch[i]!= H.ch[i]) return T.ch[i]-H.ch[i];
            else return T.length - H.length;
        }
    }
    Status HStringConcat(HString &S,HString H,HString T)
    {
        if(!(S.ch = (char *)malloc((H.length+T.length)*sizeof(char))))
            exit(OVERLOE);
        for(int i=0;i<H.length;i++)
            S.ch[i] = H.ch[i];
        S.length = T.length+H.length;
        for(int i=H.length;i<S.length;i++)
        {
            S.ch[i] = T.ch[i-H.length];
        }
        return OK;
    }
    Status SubHString(HString &Sub,HString S,int pos ,int len)
    {
        if(pos<1||len<0||pos+len>S.length)
        {
            cout<<"输入长度有误!\n";
        }
        else
        {
            Sub.ch = (char *)malloc(len*sizeof(char));
            for(int i=0 ;i< len;i++)
                Sub.ch[i]  = S.ch[pos + i-1];
            Sub.length =  len;
        }
        return OK;
    }
    ///串的模式匹配
    int Index(HString S,HString T,int pos)
    {
        HString Sub;
        int i=0;
        if(pos>0)
        {
            int n = S.length;
            int m = T.length;
            i = pos;
            while(i<=n-m+1)
            {
                SubHString(Sub,S,i,m);
                if(HStringCompare(Sub,T)!= 0)
                    i++;
                else return i;
            }
            return 0;
        }
    }
    ///串的替换
    Status Replace(HString &S,HString T,HString V)
    {
        int i=1;
        if(T.length == 0)
            return ERROR;
        while(i)
        {
            i = Index(S,T,i);
            if(i)
            {
                for(;i<T.length;i++)
                {
                    S.ch[i] = V.ch[i];
                }
                i+= V.length;
            }
        }
        return OK;
    }
    //二叉树
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<malloc.h>
    #include<stdlib.h>
    #include<conio.h>
    #define MAXSIZE 201
    using namespace std;
    typedef struct BiTNode
    {
        char data;
        struct BiTNode *lchild,*rchild;
    } BiTNode,*BiTree;
    int len,i=-1;
    char *p;
    char ch[MAXSIZE];
    int CreatBiTree(BiTree &T)
    {
        if(!(*p)||*p==' ')
        {
            T=NULL;
            p++;
        }
        else
        {
            T = (BiTNode *)malloc(sizeof(BiTNode));
                T->data =*(p++);
                CreatBiTree(T->lchild);
                CreatBiTree(T->rchild);
        }
        return 1;
    }
    void Visit(char ch)
    {
        cout<<ch<<" ";
    }
    void PreOrderTraverse(BiTree T)///前序遍历
    {
        if(T)
        {
            Visit(T->data);
            PreOrderTraverse(T->lchild);
            PreOrderTraverse(T->rchild);
        }
    }
    void InOrderTraverse(BiTree T)
    {
        if(T)
        {
            InOrderTraverse(T->lchild);
            Visit(T->data);
            InOrderTraverse(T->rchild);
        }
    }
    void PostOrderTraverse(BiTree T)
    {
        if(T)
        {
            PostOrderTraverse(T->lchild);
            PostOrderTraverse(T->rchild);
            Visit(T->data);
        }
    }
    void DestroyBiTree(BiTree T)
    {
        if(T)
        {
            if(T->lchild) DestroyBiTree(T->lchild);
            if(T->rchild) DestroyBiTree(T->rchild);
            free(T);
            T=NULL;
        }
    }
    int main()
    {
        int choice,flag=1;
        BiTree T;
        printf("请输入要插入的字符串,空格表示字数为空:\n");
        gets(ch);
        p=ch;
        CreatBiTree(T);
        while(flag)
        {
            printf("请输入要操作程序的内容\n");
            printf("1.递归先序遍历\n");
            printf("2.递归中序遍历\n");
            printf("3.递归后序遍历\n");
            printf("4.退出\n");
            scanf("%d",&choice);
            if(choice == 1)
            {
                printf("先序遍历二叉树:\n");
                PreOrderTraverse(T);
                cout<<endl;
            }
            else if(choice == 2)
            {
                printf("中序遍历二叉树:\n");
                InOrderTraverse(T);
                cout<<endl;
            }
            else if(choice == 3)
            {
                printf("后序遍历二叉树\n");
                PostOrderTraverse(T);
                cout<<endl;
            }
            else
            {
                flag=0;
                printf("程序运行结束,按任意键退出!\n");
                getch();
            }
        }
        DestroyBiTree(T);
    }
  • 相关阅读:
    Xcode6模拟器下键盘出不来的原因
    iOS7View被导航栏遮挡问题的解决
    iOS中设置导航栏标题的字体颜色和大小
    iphone ios 屏幕,导航条,状态栏的高度
    iOS: TableView如何刷新指定的cell 或section
    rest api load test
    异步图片处理服务器
    bitbucket SSH 生成
    基于Token的授权(with srping mvc)
    Netty性能调优
  • 原文地址:https://www.cnblogs.com/guyahan/p/6020975.html
Copyright © 2011-2022 走看看