diff --git "a/2017-1/HuanWoWeiLan/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232.c" "b/2017-1/HuanWoWeiLan/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232.c" new file mode 100644 index 00000000..bca33694 --- /dev/null +++ "b/2017-1/HuanWoWeiLan/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232.c" @@ -0,0 +1,241 @@ +#include <stdio.h> +#include <stdlib.h> + +//ͼ������洢��ʾ +#define INFINITY 99999 //���ֵ���� +#define MAX_VERTEX_NUM 20 //������ +int visited[MAX_VERTEX_NUM ]; //���ʱ�־���飬��ʼֵΪFALSE(0)��һ��ij�����㱻���ʣ�������ֵΪTRUE(1). +typedef struct ArcCell //���Ķ��� +{ + int adj; //��1��0��ʾ�Ƿ����� +}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; +typedef struct //ͼ�Ķ��� +{ + AdjMatrix arcs; //�ڽӾ��� + int vexnum,arcnum; //�������ͻ��� +}Graph; + +//-------------����------------ +#define MAXQSIZE 100 +typedef struct QNode +{ + int data; + struct QNode *prious; + struct QNode *next; +}QNode,LinkList,*QueuePtr; + +typedef struct +{ + QueuePtr front; + QueuePtr rear; +}LinkQueue; + + +typedef enum +{ + OK, + ERROR, + OVERFLOW +}Status; +typedef enum +{ + false, + true +}bool; + +//ͼ�Ļ������� + +//���㸳ֵ +Status Add(Graph *G, int x, int y) +{ + if(x >= MAX_VERTEX_NUM || y >= MAX_VERTEX_NUM) + { + return ERROR; + } + G -> arcs[x][y].adj = G ->arcs[y][x].adj = 1; + return OK; +} +//����ͼ���������ʾ���� +Status CreateGraph(Graph *G) +{ + int i ,j; + G -> vexnum = 9;//������ + G -> arcnum = 12;//���� + + for(i = 0; i < G -> vexnum; i++) + { + for(j = 0; j < G ->arcnum; j++) + { + G -> arcs[i][j].adj = INFINITY; //��ʼ���ڽӾ�����ÿһ��ֵ��Ϊ���� + } + } + Add(G, 0, 1); Add(G, 0, 2); Add(G, 0, 3); Add(G, 0, 6); + Add(G, 1, 2); Add(G, 3, 4); Add(G, 3, 5); Add(G, 4, 5); + Add(G, 5, 7); Add(G, 6, 7); Add(G, 6, 8); Add(G, 7, 8); + + return OK; +} +//���ص�һ���ڽӶ��㣬û�еĻ�����-1 +int FirstAdjVex(Graph G, int i) +{ + int k; + for (k = 0; k < G.vexnum; k++) + { + if (G.arcs[i][k].adj == 1) //�ڽӾ���ͬһ����Ϊ1�ĵ㶼�������ڽӵ㣬��0��ʼ��������һ��Ϊ1�ľ����ڽӵ� + { + return k; + } + } + return -1; +} +//������һ���ڽӶ��㣬û�еĻ�����-1 +int NextAdjVex(Graph G, int i, int j) +{ + int k; + for (k = j + 1; k < G.vexnum; k++) + { + if (G.arcs[i][k].adj == 1)//k��j+1��ʼ����һ��Ϊ1�ľ���������һ���ڽӵ� + { + return k; + } + } + return -1; +} +//���������·�� +void ShortestPath(Graph G,int a,int b) +{ + int u,v,w; + bool flag = false;//��flag�������˳�whileѭ�����жϣ���Ϊtrue���˳�while + LinkQueue Q; + for(v = 0; v < G.vexnum; ++v) + { + visited[v] = false; //�ȳ�ʼ�����ʱ�־����ΪFALSE + } + InitQueue(&Q);//��ʼ��һ�����У����洢�ѱ����ʵ�·������Ϊ1��2���������Ķ��㣬���洢���·���Ķ��� + EnQueue(&Q,a);//��a������� + visited[a] = true;//������a,������ֵΪTRUE����ʾ�Ѿ������� + while (!QueueEmpty(Q))//���в�Ϊ�� + { + DeQueue(&Q,&u);//�˺���������ʱ�����ƶ���ͷָ�룬��������ͷ����������ɾ�� + for(w = FirstAdjVex(G,u);w >=0;w = NextAdjVex(G, u, w)) //wΪu���ڽӵ㣬ֱ��������bʱforѭ��ֹͣ + { + if(w == b)//��w=b����˵����С·���Ѿ��ҵ� + { + EnQueue(&Q,w);//�����һ����������� + PrintFoot(Q,a); + flag = true; + } + if(!visited[w])//��u���ڽӵ�û�б����� + { + EnQueue(&Q,w); + visited[w] = true; + } + } + + if(flag) + { + break;//����whileѭ�� + } + } +} + +//���·�� +Status PrintFoot(LinkQueue Q,int start) +{ + int foot[MAX_VERTEX_NUM]; + int i; + QueuePtr p; + p = Q.rear;//p�Ƕ�β��� + for(i=0;i < MAX_VERTEX_NUM; i++) + { + foot[i] = -1;//��ʼ��foot���� + } + foot[0] = p->data;//·�������һ�� + p = p->prious; + for(i = 1;p->data != start; i++) + { + foot[i] = p->data; + p = p->prious; + } + foot[i] = start;//foot[i] = p->data; + for(;i >= 0; i--) + { + if(foot[i] >= 0) + printf("%d ",foot[i] + 1);//���·�� + } +} + +//���л������� +//��ʼ������ +Status InitQueue (LinkQueue *Q) +{ + Q->front = Q->rear = (QueuePtr)malloc(MAXQSIZE * sizeof(QNode)); + if(!(Q->front)) + { + return ERROR; + } + Q->front->next = Q->rear->next = NULL; + return OK; +} +//�ж��Ƿ�Ϊ�ն��� +bool QueueEmpty(LinkQueue Q) +{ + if (Q.front == Q.rear) + { + return true; + } + return false; +} +//���� +Status EnQueue(LinkQueue *Q,int e) +{ + QueuePtr p; + p = (QueuePtr)malloc(sizeof(QNode));//����priou���ָ��ָ��ոճ����еĽ�㣬����ǰ�Ķ�ͷָ����ָ���; + if(!p) + { + return ERROR; + } + p->data = e; + p->next = NULL; + p->prious = Q->front;//ָ��ǰ�Ķ�ͷָ����ָ��� + Q->rear->next = p; + Q->rear = p; + return OK; +} +//���� +Status DeQueue(LinkQueue *Q, int *e) +{ + if (QueueEmpty(*Q)) + { + return ERROR; + } + Q->front = Q->front->next; + *e = Q->front->data; + return OK; +} + + + + + +int main() +{ + int i,j; + Graph h ; + CreateGraph(&h);//����һ������ͼ�������ڽӾ����ʼ��ͼ + + for(i = 0;i < 9; i++) + { + for(j = 0;j < 9;j++) + { + if(i != j) + { + printf("%d -> %d :",i+1,j+1); + ShortestPath(h,i,j);//Ѱ�����·�� + printf("\n"); + } + } + } + return 0; +} + diff --git "a/2017-1/HuanWoWeiLan/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232/\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232.cpp" "b/2017-1/HuanWoWeiLan/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232/\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232.cpp" new file mode 100644 index 00000000..8bc74863 --- /dev/null +++ "b/2017-1/HuanWoWeiLan/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232/\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232.cpp" @@ -0,0 +1,170 @@ +#include <stdio.h> +#include <stdlib.h> +typedef struct node +{ + int key; + struct node *lchild, *rchild; +}BSTNode, *BSTree; + +//插入 +int InsertBST(BSTree *bst, int k) +{ + BSTree r, s, pre; + r = (BSTree)malloc(sizeof(BSTNode)); + r->key = k; + r->lchild = NULL; + r->rchild = NULL; + if(*bst == NULL) + { + *bst = r; + return 1; + } + pre = NULL; + s = *bst; + while(s) + { + if(k == s->key) + return 0; + else if(k < s->key) + { + pre = s; + s = s->lchild; + } + else + { + pre = s; + s = s->rchild; + } + } + if(k < pre->key) + pre->lchild = r; + else + pre->rchild = r; + return 1; +} +BSTree DeleteBST(BSTree T, int k) +{ + BSTree p, q, s, f; + p = T; + f = NULL; + while (p) + { + if(p->key == k) + break; + f = p; + if(p->key > k) + p =p->lchild; + else if(p->key< k) + p =p->rchild; + + } + + q = p; + + if ((p->lchild)&& (p->rchild)) + { + s =p->lchild; + while(s->rchild) + { + q =s; + s =s->rchild; + } + p->key =s->key; + if (p != q) + + q->rchild= s->lchild; + + else if (p == q) + q->lchild= s->lchild; + free(s); + return T; + } + else if (!p->lchild) + + p =p->rchild; + + else if (!p->rchild) + p =p->lchild; + if (!f) + + T = p; + + else if (q == f->lchild) + f->lchild= p; + else + f->rchild= p; + + free(q); + return T; + +} + +void CreateBST(BSTree *bst) +{ + int key; + *bst = NULL; + scanf("%d", &key); + while(key != -1) + { + InsertBST(bst, key); + scanf("%d", &key); + } +} +/*打印二叉树:中序遍历*/ +void InOrder(BSTree root) +{ + if(root != NULL) + { + InOrder(root->lchild); + printf( "%d ", root->key); + InOrder(root->rchild); + } +} + +/*搜索*/ +BSTree SearchBST(BSTree bst, int key) +{ + BSTree q; + q = bst; + //递归 + while(q) + { + if(q->key == key) + return q; + if(q->key > key) + q=q->lchild; + else + q=q->rchild; + } + return NULL; //查找失败 +} + +int main() +{ + BSTree T; + int tag = 1; + int m, n; + printf("建立二叉排序树,请输入序列以-1结束:"); + CreateBST(&T); + printf("中序遍历二叉树,序列为:"); + InOrder(T); + while(tag != 0) + { + printf("请输入你要查找的元素:"); + scanf("%d", &n); + if(SearchBST(T, n) == NULL) + { + printf("抱歉查找失败!"); + InsertBST(&T, n); + } + else + { + printf("查找成功!查找的数字为%d\n", SearchBST(T,n)->key); + DeleteBST(SearchBST(T,n),n); + } + InOrder(T); + printf("\n是否继续查找 是 :请按 1 否则按 0:"); + scanf("%d", &tag); + } + return 0; +}