数据结构实验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 }
原文地址:https://www.cnblogs.com/Zblogs/p/3413187.html