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 }