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### \n");
145 CreateBTree(b);
146 printf("非递归先序遍历:\n");
147 PreOrder1(b);
148 printf("\n");
149 printf("非递归中序遍历:\n");
150 InOrder1(b);
151 printf("\n");
152 printf("非递归后序遍历:\n");
153 PsOrder1(b);
154 printf("\n");
155 printf("递归先序遍历:\n");
156 PreOrder2(b);
157 printf("\n");
158 printf("递归中序遍历:\n");
159 InOrder2(b);
160 printf("\n");
161 printf("递归后序遍历:\n");
162 PsOrder2(b);
163 printf("\n");
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!\n";
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 \n");//提示 输入数据 ,输入-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 \n");
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 }