我的数据结构、算法笔记
来源:互联网 发布:图片矢量化软件 编辑:程序博客网 时间:2024/05/16 01:18
//克鲁斯卡尔算法(适合于稀疏图)
void Kruskal(edgeset GE,edgeset C, int n){ int i,j,k,d; int m1,m2; adjmatrix s; for(i=0;i<n;i++) { for(j=0;j<n;j++) if(i==j) s[i][j]=1; else s[i][j]=0; } k=1; d=0; while(k<n) { for(i=0;i<n;i++) { if(s[i][GE[d].fromvex]==1) m1=i; if(s[i][GE[d].endvex]==1) m2=i; } if(m1!=m2) { C[k-1]=GE[d]; k++; for(j=0;j<n;j++) { s[m1][j]=s[m1][j] || s[m2][j]; s[m2][j]=0; } } d++; }}
//普利姆算法(适合于稠密图)
void Prim(adjmatrix GA,edgeset CT,int a,int n){ int i,j,k,min,t,m,w; struct edgeElem x; for(i=0;i<n;i++) { if(i<a) { CT[i].fromvex=a; CT[i].endvex=i; CT[i].weight=GA[a][i]; } else if(i>a) { CT[i-1].fromvex=a; CT[i-1].endvex=i; CT[i-1].weight=GA[a][i]; } } for(k=1;k<n;k++) { min=MaxValue; m=k-1; for(j=k-1;j<n-1;j++) if(CT[j].weight<min) { min=CT[j].weight; m=j; } x=CT[k-1]; CT[k-1]=CT[m]; CT[m]=x; j=CT[k-1].endvex; for(i=k;i<n-1;i++) { t=CT[i].endvex; w=GA[j][t]; if(w<CT[i].weight) { CT[i].weight=w; CT[i].fromvex=j; } } }}
/*冒泡_下沉*/int i,j;for(i=0;i<n;n--) for(j=i;j<n-1;j++) { if(a[j]<a[j+1]) 交换; }/*冒泡_起泡*/ for(i=0;i<n;i++) for(j=n-1;j>=0;--) if(a[j]>a[j-1] 交换;
/*选择排序*/void select_sort(int *a,int n){//从大到小 int i,j,k,temp; for(i=0;i<n;i++) { k=i; for(j=i+1;j<n;j++) { if(a[k]<a[j]) k=j; } if(k!=i) { temp=a[i]; a[i]=a[k]; a[k]=temp; } }}
/*快速排序*/void QuickSort(int a[], int s, int t){ int i=s,j=t+1; int temp=a[s]; do { do i++; while(a[i]<temp); do j--; while(a[j]>temp); if(i<j) { int t; t=a[i]; a[i]=a[j]; a[j]=t; } }while(i<j); a[s]=a[j]; a[j]=temp; if(s<j-1) QuickSort(a,s,j-1); if(t>j+1) QuickSort(a,j+1,t);}
/* 拓扑排序* (activity on vertex network) AOV网*/void Toposort(adjlist GL, int n){ int i,j,k,top,m=0; struct edgenode*p; int* d=(int*)malloc(n*sizeof(int)); for(i=0;i<n;i++) d[i]=0; for(i=0;i<n;i++) { p=GL[i]; while(p!=NULL) { j=p->adjvex; d[j]++; p=p->next; } } top=-1; for(i=0;i<n;i++) if(d[i]==0) { d[i]=top; top=i; } while(top!=-1) { j=top; top=d[top]; printf("%d ",j); m++; p=GL[j]; while(p!=NULL) { k=p->adjvex; d[k]--; if(d[k]==0) { d[k]=top; top=k; } p=p->next; } } printf("/n"); if(m<n) printf("AOV网有回路!/n"); free(d);}
/****************------adjacency matrix------------****************//* vertexset--顶点集 * edge--边集 * directed graph ---有向图 * undirected graph---无向图* adjacent ---邻接点* outedge ---出边* inedge ---入边* degree ---度* indegree --入度* outdegree --出度* path --路径* cycle--回路/环* weight--权* network--网*/#define MaxVertexNum 8#define MaxEdgeNum 20#define MaxValue 1000typedef int VertexType;typedef VertexType vexlist[MaxVertexNum];typedef int adjmatrix[MaxVertexNum][MaxVertexNum];void Createl(vexlist GV,adjmatrix GA,int n,int e){ int i,j,k,w; printf("输入%d个顶点数据/n",n); for(i=0;i<n;i++) scanf("%d",&GV[i]); for(i=0;i<n;i++) for(j=0;j<n;j++) { if(i==j) GA[i][j]=0; else GA[i][j]=MaxValue; } for(k=1;k<=e;k++) { scanf(" %d %d %d",&i,&j,&w); GA[i][j]=GA[j][i]=w; }}/* edgeset array--边集数组*/struct edgeElem{ int fromvex; //边的起点域 int endvex;//边的终点域 int weight;};typedef struct edgeElem edgeset[MaxEdgeNum];void Create3(vexlist GV,edgeset GE,int n,int e){ int i,k,j,w; printf("输入%d个顶点数据/n",n); for(i=0;i<n;i++) scanf(" %d",&GV[i]); printf("输入%d条带权边/n",e); for(k=0;k<e;k++) { scanf(" %d %d %d",&i,&j,&w); GE[k].fromve=i; GE[k].endvex=j; GE[k].weight=w; }}
/*********************二叉树*********************/
/*前序遍历*/void Preorder(struct BTreeNode* BT){ if(BT!=NULL) { printf("%c ",BT->data); Preorder(BT->left); Preorder(BT->right); }}/*中序遍历*/void Inorder(BTree* BT){ if(BT!=NULL) { Inorder(BT->left); printf("%c ",BT->data); Inorder(BT->right); }}/*后序遍历*/void Posorder(BTree* BT){ if(BT!=NULL) { Posorder(BT->left); Posorder(BT->right); printf("%c ",BT->data); }}/*按层遍历*/void Levelorder(BTree*BT){ BTree* p; BTree* q[QueueMaxSize]; int front=0,rear=0; if(BT!=NULL) { rear=(rear+1)%QueueMaxSize; q[rear]=BT; } while(front!=rear) { front=(front+1)%QueueMaxSize; p=q[front]; printf("%c ",p->data); if(p->left!=NULL) { rear=(rear+1)%QueueMaxSize; q[rear]=p->left; } if(p->right!=NULL) { rear=(rear+1)%QueueMaxSize; q[rear]=p->right; } }}/* 初始化化*/void InitBTree(BTree** BT){ *BT=NULL;}/* 建立二叉树*/void CreateBTree(BTree** BT,char* a){ BTree* p; BTree* s[StackMaxSize]; int top=-1; int k; int i=0; *BT=NULL; while(a[i]) { switch(a[i]) { case ' ': break; case '(': if(top==StackMaxSize-1) { printf(" 栈空间太小,需增加 StackMaxSize!/n"); exit(1); } top++; s[top]=p; k=1; break; case ')': if(top==-1) { printf(" 二叉树广义表字符串错误!/n"); exit(1); } top--; break; case ',': k=2; break; default: if(!(p=malloc(sizeof(BTree)))) exit(1); p->data=a[i]; p->left=p->right=NULL; if(*BT==NULL) *BT=p; else { if(k==1) s[top]->left=p; else s[top]->right=p; } } }}/*检查二叉树是否为空*/int BTreeEmpTy(BTree* BT){ if(BT==NULL) return 1; else return 0;}/* 求二叉树深度*/int BTreeDepth(BTree* BT){ if(BT==NULL) return 0; else { int dep1=BTreeDepth(BT->left); int dep2=BTreeDepth(BT->right); if(dep1>dep2) return dep1+1; else return dep2+1; }}/* 从二叉树中查找值为X的结点,存在返回元素存储位置,否则返回NULL */ElemType* FindBTree(BTree* BT,ElemType x){ if(BT==NULL) return NULL; else { if(BT->data==x) return &(BT->data); else { ElemType* p; if(p=FindBTree(BT->left,x)) return p; if(p=FindBTree(BT->right,x)) return p; return NULL; } }}/* 输出二叉树*/void PrintBTree(BTree* BT){ if(BT!=NULL) { printf("%c",BT->data); if(BT->left!=NULL||BT->right!=NULL) { printf("("); PrintBTree(BT->left); if(BT->right!=NULL) printf(","); PrintBTree(BT->right); printf(")"); } } }/* 清除二叉树,使之变为一棵空树*/void ClearBTree(BTree**BT){ if(*BT!=NULL) { ClearBTree(&((*BT)->left)); ClearBTree(&((*BT)->right)); free(*BT); *BT=NULL; }}
/********************* 堆 ***************
***************************************************************************/
typedef int ElemType;struct HeapSq{ ElemType* heap; int len; int MaxSie;};void InitHeap(struct HeapSq*HBT,int MS){ if(MS<=0) { printf("数组长度参数值不合适,需要重新给定!/n"); exit(1); } HBT->heap =(ElemType*)malloc(MS*sizeof(ElemType)); if(!HBT->heap) { printf("用于分配的内存空间用完,推出运行!/n"); exit(1); } HBT->MaxSie = MS; HBT->len = 0;}void ClearHeap(struct HeapSq* HBT){ if(HBT->heap != NULL) { free(HBT->heap); HBT->heap = NULL; HBT->len = 0; HBT->MaxSie = 0; }}int EmptyHeap(struct HeapSq* HBT){ if(0==HBT->len) return 1; else return 0;}void InsertHeap(struct HeapSq* HBT,ElemType x){ int i; if(HBT->len == HBT->MaxSie) { ElemType* p; p = (ElemType*)realloc(HBT->heap,2*HBT->MaxSie*sizeof(ElemType)); if(!p) { printf(" 存储空间用完!/n"); exit(1); } HBT->heap = p; HBT->MaxSie = 2*HBT->MaxSie; } HBT->heap[HBT->len] = x; HBT->len++; i=HBT->len-1; while(i!=0) { int j=(i-1)/2; if(x>=HBT->heap[j]) break; HBT->heap[i] = HBT->heap[j]; i=j; } HBT->heap[i] = x;}ElemType DeleteHeap(struct HeapSq* HBT){ ElemType temp,x; int i,j; if(0==HBT->len) { printf("堆已空,推出运行!/n"); exit(1); } temp = HBT->heap[0]; HBT->len--; if(0 == HBT->len) return temp; x=HBT->heap[HBT->len]; i=0; j=2*i+1; while(j<=HBT->len -1) { if(j<HBT->len-1 && HBT->heap[j]>HBT->heap[j+1]) j++; if(x<=HBT->heap[j]) break; HBT->heap[i] = HBT->heap[j]; i=j; j = 2*i+1; } HBT->heap[i] = x; return temp;}
/**********&&&&&&&&&&&&& 栈 &&&&&&&&&&*******************/
typedef struct {DataType *data; int max; int top; }Stack;void SetStack(Stack *S,int n);void FreeStack(Stack *S);int StackSize(Stack *S);int StackEmpty(Stack *S);int StackFull(Stack *S);DataType Peek(Stack *S);void Push(Stack *S,DataType item);DataType Pop(Stack *S);void ClearStack(Stack *S);void SetStack(Stack *S,int n) {S->data=(DataType *)malloc(n*sizeof(DataType)); if(S->data==NULL) {printf("overflow"); exit(1); } S->max=n; S->top=-1; }void FreeStack(Stack *S) {free(S->data); }int StackSize(Stack *S) {return(S->top+1); }int StackEmpty(Stack *S) {if(S->top==-1) return(1); return(0); }int StackFull(Stack *S) {if(S->top==S->max-1) return(1); return(0); }DataType Peek(Stack *S) {if(S->top==-1) {printf("Stack is empty!/n"); exit(1); } return(S->data[S->top]); }void Push(Stack *S,DataType item) {if(S->top==S->max-1) {printf("Stack is full!/n"); exit(1); } S->top++; S->data[S->top]=item; }DataType Pop(Stack *S) {if(S->top==-1) {printf("Pop an empty stack!/n"); exit(1); } S->top--; return(S->data[S->top+1]); }void ClearStack(Stack *S) {S->top=-1; }
/* *
*** ****
******* 表 ******
*** ***
** **
*/
typedef int ElemType;struct List{ ElemType *list; int size; int MaxSize;};void InitList(struct List *L,int ms){ if(ms<=0) { printf("%d的值非法!/n"); exit(1); } L->MaxSize=ms; L->list=(int *)malloc(ms*sizeof(ElemType)); if(!L->list) { printf("动态内存分配失败!/n"); exit(1); } L->size = 0;}void ClearList(struct List *L){ if(L->list!=NULL) { free(L->list); L->list =0; L->size = L->MaxSize = 0; }}int SizeList(struct List *L){ return L->size;}int EmptyList(struct List *L){ if(L->size==0) return 1; else return 0;}ElemType GetElem(struct List *L,int pos){ if(pos<1 || pos>L->size) { printf("元素序号越界!/n"); exit(1); } return L->list[pos-1];}void TraverseList(struct List *L){ int i; for(i=0;i<L->size;i++) printf("%d",L->list[i]); printf("/n");}int FindList(struct List *L,ElemType x){ int i; for(i=0;i<L->size;i++) if(L->list[i] == x) return i; return -1;}int UpdatePosList(struct List *L,int pos,ElemType x){ if(pos<1 || pos>L->size) return 0; L->list[pos-1] = x; return 1;}void againMalloc(struct List *L){ ElemType *p = realloc(L->list,2*L-MaxSize*sizeof(ElemType)); if(!p) { printf("存储空间用完!/n"); exit(0); } L->list = p; L->MaxSize = 2*L->MaxSize;}void InsertFirstList(struct List *L,ElemType x){ int i; if(L->size == L->MaxSize) againMalloc(L); for(i=L->size;i>=0;i--) L->list[i+1] = L->list[i]; L->list[0] = x; L->size++;}void InsertLastlist(struct List *L,ElemType x){ if(L->size == L->MaxSize) againMalloc(L); L->list[L->size] =x; L->size++;}int InsertPosList(struct List *L,int pos,ElemType x){ int i; if(pos<1 || pos>L->size+1) return 0; if(L->size == L->MaxSize) againMalloc(L); for(i=L->size-1;i>=pos-1;i--) L->list[i+1] = L->list[i]; L->list[pos-1] = x; L->size++; return 1;}void InsertOrderList(struct List *L,ElemType x){ int i,j; if(L->size == L->MaxSize) againMalloc(L); for(i=0;i<L->size;i++) if(x,L->list[i]) break; for(j=L->size-1;j>=i;j--) L->list[j+1]=L->list[j]; L->list[i] =x; L->size++;}ElemType DeleteFirstList(struct List *L){ ElemType temp; int i; if(L->size==0) { printf("线性表为空,不能删除!/n")' exit(1); } temp =L->list[0]; for(i=1;i<L->size;i++) L->list[i-1] =L->list[i]; L->size--; return temp;}ElemType DeleteLastList(struct List *L){ if(L->size==0) { printf("线性表为空,不能删除!/n"); exit(1); } L->size--; return L->list[L->size];}ElemType DeletePosList(struct List *L,int pos){ ElemType temp; int i; if(pos<1 || pos>L->size) { printf("pos= %d 值越界,不能删除!",pos); exit(1); } temp = L->list[pos-1]; for(i = pos; i<L->size;i++) L->list[i-1]= L->list[i]; L->size--; return temp;}int DeleteValueList(struct List *L,ElemType x){ int i,j; for(i=0;i<L->size;i++) if(L->list[i]==x) break; if(i==L->size) return 0; for(j=i+1;j<L->size;j++) L->list[j-1] = L->list[j]; L->size--; return 1;}
- 我的数据结构、算法笔记
- 我的数据结构学习笔记
- 【我的Java笔记】数据结构
- 我的Java数据结构和算法
- 数据结构学习笔记第一篇 -- 我对数据结构的看法
- 数据结构笔记(3)数组的算法
- 数据结构学习笔记之欧几里的算法
- 算法导论笔记:14数据结构的扩张
- 数据结构与算法的笔记(一)
- 数据结构笔记-----数据结构与算法
- 我学的第一个《数据结构与算法》的程序
- 数据结构与算法笔记
- 数据结构笔记-KMP算法
- 算法与数据结构笔记
- 数据结构和算法笔记
- 数据结构和算法 笔记
- 数据结构和算法笔记
- 大话数据结构笔记-算法
- 77种互联网盈利创新模式
- Thinking in uml
- 程序员的创造力
- Object Recognition, Computer Vision, and the Caltech 101: A Response to Pinto et al.
- ISAPI Rewrite/IIS Rewrite无效的可能原因
- 我的数据结构、算法笔记
- 好想她
- 几个非常有用的文件操作
- Java基础3_1面向对象(2011 06 12)
- 文件读写
- 可伸缩性最佳实践整理
- Win7的不关闭防火墙下的FTP设置
- 报道!
- XmlSpy2008软件及破解