• 数据结构实验3


      1 #include<stdio.h>
      2 #include<malloc.h>
      3 #define  MAXSIZE 20
      4 typedef struct BNode
      5 {
      6     char data;
      7     struct BNode *lchild, *rchild;
      8 }*BTree;
      9 
     10 void CreateBTree(BTree &T)
     11 {
     12     char data;
     13     scanf_s("%c",&data);
     14     if (data == '#')
     15     {
     16         T = NULL;
     17     }
     18     else
     19     {
     20         T = (BTree) malloc(sizeof(BNode));
     21         T->data = data;
     22         CreateBTree(T->lchild);
     23         CreateBTree(T->rchild);
     24     }
     25 }
     26 
     27 //feidigui xianxubianli
     28 void PreOrder1(BTree b)
     29 {
     30     BTree St[MAXSIZE], p;
     31     int top = -1;
     32     if (b != NULL)
     33     {
     34         top++;
     35         St[top] = b;
     36         while (top > -1)
     37         {
     38             p = St[top];
     39             top--;
     40             printf("%c ", p->data);
     41             if (p->rchild != NULL)
     42             {
     43                 top++;
     44                 St[top] = p->rchild;
     45             }
     46             if (p->lchild != NULL)
     47             {
     48                 top++;
     49                 St[top] = p->lchild;
     50             }
     51         }
     52     }
     53 }
     54 
     55 //feidigui zhongxu
     56 void InOrder1(BTree t)
     57 {
     58     int top = 0;
     59     BTree St[MAXSIZE];
     60     BTree p;
     61     p = t;
     62     while (p || top)
     63     {
     64         while (p)
     65         {
     66             St[top++] = p;
     67             p = p->lchild;
     68         }
     69         if (top)
     70         {
     71             p = St[--top];
     72             printf("%c ",p->data );
     73             p = p->rchild;
     74         }
     75     }
     76 }
     77 //feidigui houxubianli
     78 void PsOrder1(BTree t)
     79 {
     80     BTree St[MAXSIZE], p;
     81     int flag, top = -1;
     82     do
     83     {
     84         while (t)
     85         {
     86             top++;
     87             St[top] = t;
     88             t = t->lchild;
     89         }
     90         p = NULL;
     91         flag = 1;
     92         while (top != -1 && flag)
     93         {
     94             t = St[top];
     95             if (t->rchild == p)
     96             {
     97                 printf("%c ", t->data);
     98                 top--;
     99                 p = t;
    100             }
    101             else
    102             {
    103                 t = t->rchild;
    104                 flag = 0;
    105             }
    106         }
    107     } while (top != -1);
    108 }
    109 
    110 //digui xianxu
    111 void PreOrder2(BTree p)
    112 {
    113     if (p != NULL)
    114     {
    115         printf("%c ", p->data);
    116         PreOrder2(p->lchild);
    117         PreOrder2(p->rchild);
    118     }
    119 }
    120 //digui zhongxu
    121 void InOrder2(BTree p)
    122 {
    123     if (p != NULL)
    124     {
    125         InOrder2(p->lchild);
    126         printf("%c ", p->data);
    127         InOrder2(p->rchild);
    128     }
    129 }
    130 //digui houxu
    131 void PsOrder2(BTree p)
    132 {
    133     if (p != NULL)
    134     {
    135         PsOrder2(p->lchild);
    136         PsOrder2(p->rchild);
    137         printf("%c ", p->data);
    138     }
    139 }
    140 
    141 int main()
    142 {
    143     BTree b;
    144     printf("create a tree such as ABC##DE#G##F### 
    ");
    145     CreateBTree(b);
    146     printf("非递归先序遍历:
    ");
    147     PreOrder1(b);
    148     printf("
    ");
    149     printf("非递归中序遍历:
    ");
    150     InOrder1(b);
    151     printf("
    ");
    152     printf("非递归后序遍历:
    ");
    153     PsOrder1(b);
    154     printf("
    ");
    155     printf("递归先序遍历:
    ");
    156     PreOrder2(b);
    157     printf("
    ");
    158     printf("递归中序遍历:
    ");
    159     InOrder2(b);
    160     printf("
    ");
    161     printf("递归后序遍历:
    ");
    162     PsOrder2(b);
    163     printf("
    ");
    164 }
      1 #include<iostream>
      2 #include<iomanip>
      3 #include<vector>
      4 using namespace std;
      5 
      6 typedef vector<char>Collection;
      7 typedef vector<vector<char>>Matrix;
      8 
      9 void Coll_Print(Collection C);
     10 void Matrix_Print(Matrix M);
     11 
     12 int Coll_ChLocate(Collection C,char ch);
     13 bool Coll_ChFind(Collection Ca,char ch);
     14 bool Matrix_ColFind(Matrix M,Collection C);
     15 bool Coll_Belong(Collection Ca,Collection Cb);
     16 Collection Coll_Or(Collection Ca,Collection Cb);
     17 Collection Coll_And(Collection Ca,Collection Cb);
     18 Matrix Matrix_Or(Matrix Ma,Matrix Mb);
     19 Matrix Matrix_Minus(Matrix Ma,Matrix Mb);
     20 void Make_MCC(Collection Ca,vector<Collection>&pi,vector<vector>R);
     21 
     22 void Coll_Print(Collection C)
     23 {
     24     cout<<"{";
     25     for(int i=0;i<C.size();i++)
     26     {
     27         cout<<C[i];
     28         if(i!=C.size()-1)
     29             cout<<",";
     30     }
     31     cout<<"}";
     32 }
     33 
     34 void Matrix_Print(Matrix M)
     35 {
     36     cout<<"{";
     37     for(int i=0;i<M.size();i++)
     38     {
     39         Coll_Print(M[i]);
     40         if(i!=M.size()-1)
     41             cout<<",";
     42     }
     43     cout<<"}"<<endl;
     44 }
     45 
     46 int Coll_ChLocate(Collection C,char ch)
     47 {
     48     for(int i=0;i<C.size();i++)
     49         if(C[i]==ch)
     50             return i;
     51         return -1;
     52 }
     53 
     54 bool Coll_ChFind(Collection Ca,char ch)
     55 {
     56     for(int i=0;i<Ca.size();i++)
     57     {
     58         if(Ca[i]==ch)
     59             return true;
     60     }
     61     return false;
     62 }
     63 
     64 bool Matrix_CoFind(Matrix M,Collection C)
     65 {
     66     for(int i=0;i<M.size();i++)
     67         if(M[i]==C)
     68             return true;
     69         return false;
     70 }
     71 
     72 bool Coll_Belong(Collection Ca,Collection Cb)
     73 {
     74     if(Ca.size()>Cb.size())
     75         return false;
     76     else
     77     {
     78         for(int i=0;i<Ca.size();i++)
     79         {
     80             if(!Coll_ChFind(Ca,Ca[i]))
     81                 return false;
     82         }
     83         return false;
     84     }
     85 }
     86 
     87 Collection Coll_Or(Collectin ca,Collection Cb)
     88 {
     89     int main=(Ca.size()>Cb.size()?Cb.size():Ca.size());
     90 
     91     Collection CB=(Ca.size()>Cb.size()?Ca:Cb);
     92     Collection CS=(ca.size()>Cb.size()?Cb:Ca);
     93 
     94     Collection Cc;
     95 
     96     for(int i=0;i<min;i++)
     97     {
     98         if(Coll_ChFind(CB,CS[i]))
     99             Cc.push+back(CS[i]);
    100     }
    101     return Cc;
    102 }
    103 
    104 Collection Coll_And(Collection Ca,Collection Cb)
    105 {
    106     int min=(Ca.size()>Cb.size()?Cb.size():Ca.size());
    107 
    108     Collection CB=(Ca.size()>Cb.size()?Ca:Cb);
    109     Collection CS=(Ca.size()>Cb.size()?Cb:Ca);
    110 
    111     for(int i=0;i<min;i++)
    112     {
    113         if(!Coll_ChFind(CB,CS[i]))
    114             CB.push_back(CS[i]);
    115     }
    116     return CB;
    117 }
    118 
    119 Matrix Matrix_Or(Matrix Ma,Matrix Mb)
    120 {
    121     int min=(Ma.size()>Mb.size()?Ma.size());
    122     Matrix MB=(Ma.size()>Mb.size?Ma:Mb);
    123     Matrix MS=(Ma.size()>Mb.size()?Mb:Ma);
    124 
    125     for(int i=0;i<min;i++)
    126         if(!Matrix_ColFind(MB,MS[i]))
    127             MB.push_back(MS[i]);
    128 
    129         return MB;
    130 }
    131 
    132 Matrix Matrix_Minus(Matrix Ma,Matrix Mb)
    133 {
    134     int i,min=(Ma.size()>Mb.size()?Mb.size():Ma.size());
    135     Matrix Mc;
    136     for(i=0;i<min;i++)
    137     {
    138         if(!Matrix_ColFind(mb,Ma[i]))
    139             Mc.push_back(ma[i]);
    140     }
    141     if(min==Ma.size())
    142         return Mc;
    143     else
    144     {
    145         for(;i<Ma.size();i++)
    146             Mc.push_back(Ma[i]);
    147         return Mc;
    148     }
    149 }
    150 
    151 void Make_MCC(Collection Ca,vector<Collection>&pi,vector<vector<bool>> R)
    152 {
    153     int n=Ca.size(),i,j,k;
    154     Collection A=ca,Xi;
    155     Collection S,S1,S2,Col_temp,Col_temp2;
    156     vector<Collection>Mat_temp1,Mat_temp2;
    157 
    158     if(n==1)
    159     {
    160         cout<<"Can not Careate the MCC!
    ";
    161         return;
    162     }
    163     for(i=n-1;i>1;i--)
    164     {
    165         Xi.clear();
    166         Xi.push_back(Ca[i-1]);
    167 
    168         A.clear();
    169         for(j=i+1;j<=n;j++)
    170         {
    171             if(R[j-1][i-1])
    172                 A.push_back(Ca[j-1]);
    173         }
    174         for(k=0;k.pi.size();k++)
    175         {
    176             S=pi[k];
    177             if((Coll_And(S,A)).size()!=0)
    178             {
    179                 Col.temp1.clear();
    180                 Col.temp2.clear();
    181 
    182                 Col_temp1=Coll_And(S,A);
    183                 Col_temp2=Coll_Or(Xi,Col_temp);
    184 
    185                 Mat_temp1.clear();
    186                 Mat.temp1.push_back(Col_temp2);
    187 
    188                 pi=Matrix_Or(pi,Mat_temp1);
    189             }
    190         }
    191         for(i=0;i<pi.size();i++)
    192         {
    193             S1.clear();
    194             s1=pi[i];
    195             for(j=0;j<pi.size();j++)
    196             {
    197                 S2.clear();
    198                 S2=pi[j];
    199                 if(Coll_BeLong(S1,S2))
    200                 {
    201                     Mat_temp2.clear();
    202                     Mat.temp.push_back(S1);
    203                     pi=Matrix_Minus(pi,Mat_temp2);
    204                 }
    205             }
    206         }
    207     }
    208 }
      1 #include <stdio.h> /*前面是函数声明 ,后面给出了函数体  为理解深刻 自己可以写main函数 帮助理解*/
      2 #include <malloc.h>
      3 #include <stdlib.h>
      4 
      5 typedef struct node
      6 {
      7     int data;
      8     struct node *link;
      9 }NODE;
     10 
     11 NODE *create ();
     12 int countlist (NODE *head);  //返回链表结点的个数
     13 void printlist (NODE *head);   //单链表的遍历
     14 NODE *insertnode (NODE *head,int num);  //向有序的单链表中插入一个结点,保持链表的有序性
     15 NODE *deletenode (NODE *head,int num);   //在单链表中删除值为num的结点
     16 NODE *inverse (NODE *head);   //输出单链表的逆序
     17 NODE *re_order1 (NODE *head);//将单链表按顺序重新排序
     18 void bubblesort (NODE *head);
     19 
     20 void main ()
     21 {
     22     NODE *p;
     23     p=create ();
     24     bubblesort (p);
     25     for (;p!= NULL;p=p->link)
     26         printf ("%d ",p->data);
     27 
     28     
     29 }
     30 
     31 
     32 
     33 
     34 
     35 
     36 NODE *create ()//创建单链表
     37 {
     38     NODE *head,*tail,*p;
     39     int num;
     40 
     41     head=tail=NULL; //建立头尾指针 ,置为空
     42     printf ("please input the numbers,-1 is the end 
    ");//提示 输入数据  ,输入-1结束
     43     scanf ("%d",&num);                       
     44     while (num!=-1)                             //条件循环
     45     {
     46         p=(NODE *)malloc (sizeof (NODE)); //申请一个指针p
     47         if (p==NULL)                          //申请失败 ,返回空指针,输出提示 Malloc failure
     48         {
     49             printf ("Malloc failure 
    ");
     50             return NULL;
     51         }
     52         p->data=num;                  //存放数据 放在结点的data里
     53         p->link=NULL;                   //p的指针域指向NULL
     54         if (head==NULL){             //如果头指针为空   p地址赋给head
     55         head=p;
     56         }
     57         else {                          //否则, 地址p赋给尾指针的指针域  即 尾指针指向p
     58             tail->link=p;
     59         }
     60         tail=p;                           //把p地址作为尾指针
     61         scanf ("%d",&num);                //继续输入数据,回到头一步,判断输入是否结束
     62     }
     63     return head;
     64 }
     65 
     66 
     67 int countlist (NODE *head)  //返回链表结点的个数
     68 {
     69     int count=0;   //定义一个变量count,初始化0,作为结点的计数
     70     while (head){   // 当指针不为空,结点计数加一  
     71        count++;
     72        head=head->link;//指向下一个结点
     73     }
     74     return count;//返回结点个数 
     75 
     76 }
     77 
     78 
     79 void printlist (NODE *head)   //单链表的遍历
     80 {
     81     while (head){  //指针不为空                 
     82        printf ("%6d",head->data);   //输出该结点的数据
     83        head=head->link;                   //指向下一个结点
     84     }
     85 }
     86 
     87 NODE *insertnode (NODE *head,int num)  //向有序的单链表中插入一个结点,保持链表的有序性
     88 {
     89     NODE *p,*q,*list;
     90 
     91     list=(NODE *)malloc (sizeof (NODE));//申请一个指针
     92     if (list==NULL)
     93     {
     94         printf ("Insufficient Memory of list!");
     95         return NULL;
     96     }
     97     if (list){
     98     list->data=num;        /*这部分 我打的和书上有些出入 
     99     因为申请一个存储空间的时候  时常要判断返回的指针 看看是否分配失败*/         
    100     list->link=NULL;
    101     
    102     if (head==NULL)
    103     {
    104         return list;
    105     }
    106     }
    107     p=head;
    108     q=NULL;
    109     while (p)
    110     {
    111         if (p->data<num)   //判断该结点与我要插入的值的大小 ,当结点的值小于我要插入的值时
    112         {
    113             q=p;              //q记录该结点的地址
    114             p=p->link;                  //p指向下一个结点
    115         }
    116         else{             //当该结点的值大于我要插入的值 (这时 我就要插入我的值了 在上一个结点和这个结点之间)
    117            if (q)            //如果q为真 即q不为NULL (即我这个值不是插在第一个的  也就是不是最小的)
    118            {
    119                q->link=list;           //上一个结点的指针域指向我要插入的那个结点的地址list
    120                list->link=p;            //我插入结点的指针域指向下一个结点    完成插入操作
    121            }else{                   //插入的值是最小的 比以前链表的所有数据都小
    122                list->link=head;    //list的指针域指向原本的head
    123                head=list;               //头指针赋值list
    124            }
    125            break;
    126         }
    127 
    128     }
    129     if (!p)//  如果我要插入的值比任何原链表的数据都大,原尾指针的指针域赋list,尾指针即是list
    130         q->link=list;
    131 
    132 
    133     return head;
    134 }
    135 
    136 
    137 
    138 NODE *deletenode (NODE *head,int num)   //在单链表中删除值为num的结点
    139 {
    140     NODE *p,*q;
    141     if (head==NULL)
    142         return head;
    143     q=NULL;p=head;
    144     while (p){                 //p不为空,即该结点不为空
    145          if (p->data==num)       //判断该结点的数据是否为我要删除的值  如果是
    146          {
    147              if (q==NULL)    //判断上一个结点是否为空  (即这个结点是不是头结点)
    148                                      //如果是头结点
    149              {
    150                  head=head->link;  // 头指针直接指向下一个结点
    151                  free (p);        //释放原头结点
    152                  p=head;          //把新的头指针赋给p
    153              }else         //如果不是头结点
    154              {
    155                  q->link=p->link;  //上一个结点的指针域,指向第三个结点的地址
    156                  free (p);         //释放中间的结点的内存空间
    157                  p=q->link;        //p指向下一个结点
    158              }
    159          }else               //该结点的数据不是我要删除的值
    160          {
    161              q=p;            //q指向该结点
    162              p=p->link;           //p指向下一个结点
    163          }
    164     }
    165 
    166     return head;
    167 }
    168 
    169 
    170 NODE *inverse (NODE *head)   //输出单链表的逆序
    171 {
    172     NODE *middle,*tail,*lead;
    173     tail=middle=NULL;
    174     lead=head;
    175     while (lead)
    176     {
    177         middle=lead;
    178         lead=lead->link;
    179         middle->link=tail;
    180         tail=middle;
    181     }
    182     return middle;
    183 }
    184 
    185 
    186 NODE *re_order1 (NODE *head)
    187 {
    188     NODE *h,*p,*q,*r;
    189     int t;
    190     if (head==NULL||head->link==NULL)//单链表为空表或者单链表里只有一个结点(元素)  直接返回head  ;不需排序。
    191         return (head);
    192     
    193     /*单链表不为空 执行以下步骤*/
    194     h=NULL;                       
    195     t=head->data;
    196     p=head;
    197     while (p->link)        //当下一结点不是尾结点时
    198         if (p->link->data<t)     //如果下一结点存放的数据小于本结点存放的数据
    199         {
    200             q=p->link;             //将下一结点地址赋给q
    201             p->link=q->link;       //
    202             if (h==NULL) h=q;                 //如果原本结点是头结点
    203             else r->link=q;   //不是头结点,新建一个结点 r插在q与前面一个结点之间,将r-->q-->p
    204             r=q;                  //r指向下一个结点
    205 
    206         }else         //如果下一结点存放的数据大于本结点的数据
    207             p=p->link;      //head指向下一个结点
    208         if (h==NULL)                     //如果始终不存在交换  ,返回原本的单链表
    209             return (head);
    210         else
    211         {
    212             r->link=head;   //返回头结点
    213             return (h);
    214         }
    215 }
    216 
    217 void bubblesort (NODE *head)                //链表的冒泡排序(这部分 咳咳  今天晚上时间不够  排序这方面看不下去了)
    218 {
    219     NODE *pp,*p,*q,*last;
    220     last=head;
    221     while (last->link!=NULL)
    222         last=last->link;
    223     while (last!=head->link)
    224     {/*注意这部分的主要思想是 把最大的移到最后 尾指针置向前一位 把最大的再移到尾指针这 
    225                                                 一直到尾指针==头指针   链表的冒泡顺序完成*/
    226         pp=head;
    227         p=pp->link;
    228         while (p!=last)
    229         {
    230             q=p->link;
    231             if (p->data>q->data)
    232             {
    233                 pp->link=q;
    234                 p->link=q->link;
    235                 q->link=p;
    236                 if (last==q)  last=p;
    237             }
    238             pp=(p->data<q->data)?p:q;  p=pp->link;
    239         }
    240         last=pp;
    241     }
    242 }
  • 相关阅读:
    Go反射
    Go_CSP并发模型
    Go_select
    Go计时器
    day9:vcp考试
    day8:vcp考试
    day7:vcp考试
    day6:vcp考试
    day5:vcp考试
    day4:vcp考试
  • 原文地址:https://www.cnblogs.com/Zblogs/p/3413187.html
Copyright © 2020-2023  润新知