常见算法详解

  2 //设计将两个递增有序带头结点链表合并为一个有序递减的链表。
  3 //1,2,3,4,5 
  4 //2,5,9,10 
  5 void MergeList(LinkList &La,LinkList &Lb)
  6 {
  7     LNode *r,*pa=La->next,pb=Lb->next;
  8     La->next=null;//将结果链表La初始化
  9     while(pa&&pb)
 10     {
 11         if(pa->data<=pb->data){
 12             r=pa->next;
 13             pa->next=La->next;//前插入法,所有新插入的结点都在 
 14             La->next=pa;
 15             pa=r; 
 16         }    
 17         else
 18         {
 19             r=pb->next;
 20             pb->next=La->next;
 21             La->next=pb;
 22             pb=r;
 23         }
 24     }    
 25     if(pa){
 26         pb=pa;
 27     }
 28     while(pb)
 29     {
 30         r=pb->next;
 31         pb->next=La->next;
 32         La->next=pb;
 33         pb=r;
 34     }
 35     free(Lb);
 36 } 
 37 
 38 
 39 //BFS广度优先遍历
 40 bool visited[max_vertex];
 41 void BFSTraverse(Graph G)
 42 {
 43     for(i=0;i<G.vexnum;i++){
 44         visited[i]=false;
 45     }
 46     InitQueue(Q);
 47     for(i=0;i<vexnum;i++){
 48         if(!visited[i])
 49             BFS(G,i);
 50     }
 51 }
 52 void BFS(Graph G,int v){
 53     visit(v);
 54     visited[v]=true;
 55     EnQueue(Q,v);
 56     while(!isEmpty(Q))
 57     {
 58         DeQueue(Q,v);
 59         for(w=FirstNeighbor(G,v);w>=0;w=NextNeighBor(G,v,w)){
 60             //检测所有邻结点
 61             if(!visited[w]){
 62                 visit(w);
 63                 visited[w]=true;
 64                 EnQueue(Q,w);
 65             } 
 66         }
 67     }
 68 } 
 69 
 70 //单链表递增输出各结点的数据元素,并释放存储空间
 71 void Min_Delete(LinkList head){
 72     LinkNode *pre_min,*pre;//pre_min指向最小
 73     LinkNode *r;
 74     while(head->next){
 75         pre_min=head;
 76         pre=head->next;
 77         while(pre->next){
 78             if(pre->next->data>pre_min->next->data){
 79                 pre_min=pre;
 80             }
 81         }
 82         r=pre_min->next;
 83         pre_min->next=pre_min->next->next;
 84         free(r);
 85     }
 86     free(head); 
 87 } 
 88 
 89 //二叉树的前中后序递归算法
 90 
 91 void PreOrder(Btree BT){
 92     if(BT != NULL){
 93         cout<<BT->data<<endl;
 94         PreOrder(BT->lchild);
 95         PreOrder(BT->rchild);
 96     }
 97 }
 98 //中序遍历
 99 /*
100 void InOrder(Btree BT) {
101     if (BT != NULL) {
102         InOrder(BT->lchild);
103         cout << BT->data << endl;
104         InOrder(BT->rchild);
105     }
106 }
107 */
108 
109 //后序遍历
110 /*
111 void PostOrder(Btree BT) {
112     if (BT != NULL) {
113         PostOrder(BT->lchild);
114         PostOrder(BT->rchild);
115         cout << BT->data << endl;
116     }
117 }
118 */ 
119 
120 
121 void PreOrderNoRecur(Btree root){
122     stack<Btree> S;
123     while(root!=NULL||!S.empty()){
124     while(root!=NULL)
125     {
126         cout<< root->data<<endl;
127         S.push(root);
128         root=root->lchild; 
129     }
130     }
131     if(!S.empty()){
132         root=S.top();
133         S.pop();
134         root=root->rchild;
135     }
136 }
137 
138 
139 //中序遍历非递归算法
140 /*
141 void InOrderNoRecur(Btree root) {
142     stack<Btree> S;
143     while (root != NULL || !S.empty()) {
144         while (root != NULL) {
145             S.push(root);
146             root = root->lchild;
147         }
148 
149         if (!S.empty()) {
150             root = S.top();
151             cout << root->data << endl;
152             S.pop();
153             root = root->rchild;
154         }
155     }
156 }
157 */
158

//创建新的结构体list,包含Btree和int,来帮助实现后序非递归算法
  typedef struct list {
    Btree ptr;
    int flag;
   }List;

159 //后序遍历非递归算法
160 void PostOrderNoRecur(Btree root) {
161     stack<List> newS;
162     while (root != NULL || !newS.empty()) {
163         while (root != NULL) {
164             List element;
165             element.ptr = root;
166             element.flag = 1;
167             newS.push(element);
168             root = root->lchild;
169         }
170         while (!newS.empty() && newS.top().flag == 2) {
171             cout << newS.top().ptr->data << endl;
172             newS.pop();
173         }
174         if (!newS.empty()) {
175             newS.top().flag = 2;
176             root = newS.top().ptr->rchild;
177         }
178     }
179  }
180  
181  
182 //设计一个算法将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指针head。
183 //叶结点的右指针域来存放单链表指针
184 LinkList head;
185 LinkNode *pre=NULL;
186 LinkList InOrder(BiTree bt)
187 {
188     if(bt){
189         InOrder(bt->lchild);//中序遍历左子树
190         if(bt->lchild=NULL&&bt->rchild=NULL){ //叶结点 
191             if(pre==NULL){ //处理第一个叶结点 
192                 head->next=bt; 
193             } 
194             else{
195                 pre->right=bt;
196             }
197             pre=bt;
198         } 
199     else{
200         InOrder(bt->rchild);//中序遍历右子树 
201     }
202     if(pre){
203         pre->rchild=NULL;//设置链表尾 
204     } 
205     return head; 
206     }
207 }
208 
209 //编写一个利用广度优先搜索算法求解单源最短路径功能
210 void BFS_MIN_Distance(Grapsh G,int u){
211     for(i=0;i<G.vexnul;i++){
212         d[i]=oo;//从u到i结点的最短路径,w不存在
213          
214     }
215     visited[u]=true;
216     d[u]=0;
217     EnQueue(Q,u);
218     while(!isEmpty(Q)){
219         //BFS算法
220         DeQueue(Q,u);
221         for(w=FirstNeighbor(G,u);w>=0;w=NextNeighbor(G,u,w))//检测所有邻接点
222         {
223             if(!visted[w]){
224                 vistted[w]=true;
225                 d[w]=d[u]+1;
226                 EnQueue(Q,w);
227             } 
228          } 
229     } 
230 } 
231 
232 
233 //交换左子树右子树,递归
234 typedef struct BiTNode{
235     ElemType data;
236     BiNode *lchild;
237     BiNode *rchild;
238 }*BiTree,BiTNode;
239 void Exchange(BiTree t){
240     if(t==NULL){
241         retrun;
242     }
243     Exchange(t->lchild);//对左子树进行交换操作
244     Exchange(t->rchild);
245     
246     BiTNode *temp=t->lchild;
247     t->lchild=t->rchild;
248     t->rchild=temp; 
249 }
250 
251 
252 
253 
254 
255 //迪杰斯特拉
256 bool closed[N]={FALSE}; //路径
257  int Min[N]={INF}; //距离
258 
	void dijkstra(int start){
		closed[start]=true;//假设从start出发到其余各个点的最短路径
		Min[start]=0; //起点到达终点的最短路径长度 初始化数组d;
260 	for(int i=0;i<N;i++){ //将剩余的N-1个顶点距离start的最短路径求出
261   		int k=-1;
262   		for(int j=1;j<N;++j){
263        		 if(!closed[j]&&(k=-1||Min[k]>Min[j])){
264      		       k=j;
265       		  }
266   	 	 } 
267    		 closed[k]=true;//将k加入已得出结果的集合
268    	 
269    		 for(int j=0;j<N;++j){
270      	   if(!visited[j]){ //更新未求得最短路径的结点得到start的最短距离
271         	    if(Min[j]>Min[k]+G[k][j]){
272          	       Min[j]=Min[k]+G[k][j];
273        	     	} 
274             
275      	   }
276    	 	} 
277     
278 	} 
	 }

 

 1 //若用二叉链表作为二叉树的有序存储表示,是编写递归算法交换每一个节点的左子女和右子女
 2 typedef struct BiTNode{
 3     ElemType data;
 4     BiTNode *lchild;
 5     BiTNode *rchild;
 6 }*BiTree,BiTNode;
 7 
 8 void Exchange(BitTree t){
 9     if(t==NULL){
10         return ;
11     }
12     Exchange(t->lchild);
13     Exchange(t->rchild);
14     BiTNode *temp=t->lchild;
15     t->lchild=t->rchild;
16     r->rchild=temp;
17 } 
18 
19 
20 bool visited[MAX_VERTEX_NUM]; //访问标记数组
21 bool DFSTraverseALL(Graph G,int vertex){ //测试vertex是否是根
22 //对图G进行深度优先遍历,访问函数为visit()
23     for(v=0;v<G.vexnum;++v){
24         visited[v]=FALSE; //初始化以访问标记数据
25          
26     } 
27     for(v=0;v<G.vernum;++v){
28         if(!visited[v]){
29             DFS(G,v);
30             return false;
31         }
32     }
33     return true; 
34 } 
35 
36 void DFS(Graph G,int v){
37     visit(v);
38     visited(v)=TRUE;
39     for(w=FirstNeighbour(G,v);w>=0;w=NextNeighbor(G,v,w)){
40         if(!visited[w]){
41             DFS(G,w);
42         } 
43     }
44 }
45 
46 int FindRoot(Graph G){
47     for(int i=0;i<N;++i){
48         if(DFSTraverseALL(G,i)){
49             return i;
50         }
51     }
52     return -1;
53 }
 
 1 //若用二叉链表作为二叉树的有序存储表示,是编写递归算法交换每一个节点的左子女和右子女
 2 typedef struct BiTNode{
 3     ElemType data;
 4     BiTNode *lchild;
 5     BiTNode *rchild;
 6 }*BiTree,BiTNode;
 7 
 8 void Exchange(BitTree t){
 9     if(t==NULL){
10         return ;
11     }
12     Exchange(t->lchild);
13     Exchange(t->rchild);
14     BiTNode *temp=t->lchild;
15     t->lchild=t->rchild;
16     r->rchild=temp;
17 } 
18 
19 
20 bool visited[MAX_VERTEX_NUM]; //访问标记数组
21 bool DFSTraverseALL(Graph G,int vertex){ //测试vertex是否是根
22 //对图G进行深度优先遍历,访问函数为visit()
23     for(v=0;v<G.vexnum;++v){
24         visited[v]=FALSE; //初始化以访问标记数据
25          
26     } 
27     for(v=0;v<G.vernum;++v){
28         if(!visited[v]){
29             DFS(G,v);
30             return false;
31         }
32     }
33     return true; 
34 } 
35 
36 void DFS(Graph G,int v){
37     visit(v);
38     visited(v)=TRUE;
39     for(w=FirstNeighbour(G,v);w>=0;w=NextNeighbor(G,v,w)){
40         if(!visited[w]){
41             DFS(G,w);
42         } 
43     }
44 }
45 
46 int FindRoot(Graph G){
47     for(int i=0;i<N;++i){
48         if(DFSTraverseALL(G,i)){
49             return i;
50         }
51     }
52     return -1;
53 }
 



//迪杰斯特拉
const int  MAXINT = 32767;
const int MAXNUM = 10;
int dist[MAXNUM];
int prev[MAXNUM];

int A[MAXUNM][MAXNUM];

void Dijkstra(int v0)
{
    bool S[MAXNUM];                                  // 判断是否已存入该点到S集合中
      int n=MAXNUM;
    for(int i=1; i<=n; ++i)
    {
        dist[i] = A[v0][i];
        S[i] = false;                                // 初始都未用过该点
        if(dist[i] == MAXINT)    
              prev[i] = -1;
        else 
              prev[i] = v0;
     }
     dist[v0] = 0;
     S[v0] = true;   
    for(int i=2; i<=n; i++)
    {
         int mindist = MAXINT;
         int u = v0;                               // 找出当前未使用的点j的dist[j]最小值
         for(int j=1; j<=n; ++j)
            if((!S[j]) && dist[j]<mindist)
            {
                  u = j;                             // u保存当前邻接点中距离最小的点的号码 
                  mindist = dist[j];
            }
         S[u] = true; 
         for(int j=1; j<=n; j++)
             if((!S[j]) && A[u][j]<MAXINT)
             {
                 if(dist[u] + A[u][j] < dist[j])     //在通过新加入的u点路径找到离v0点更短的路径  
                 {
                     dist[j] = dist[u] + A[u][j];    //更新dist 
                     prev[j] = u;                    //记录前驱顶点 
                  }
              }
     }
}

/**
1) Dijkstra 算法的伪代码:
void Dijkstra(G,d[],s)
{
初始化:
for(循环 n 次)
{
u=使d[u] 最小的还未被访问的顶点的标号;
记u为已被访问;
for(从u 出发能达到的所有顶点)
{
if(v未被访问 && 以u为中介点使s到达v能使d[v]更优)
优化d[v];
}
}
}
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值