我的数据结构、算法笔记

来源:互联网 发布:图片矢量化软件 编辑:程序博客网 时间: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;}